diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-24 12:07:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-24 12:07:03 -0400 |
commit | 5fabc487c96819dd12ddb9414835d170fd9cd6d5 (patch) | |
tree | 01532d492e5074b0d3add29bf92ebf9a9d161e9e /arch/x86/kvm/emulate.c | |
parent | c61264f98c1a974ee6f545f61a4ab33b141d6bda (diff) | |
parent | 3f68b0318bbbd61bf08478ab99a149f0d9e5156e (diff) |
Merge branch 'kvm-updates/3.1' of git://git.kernel.org/pub/scm/virt/kvm/kvm
* 'kvm-updates/3.1' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (143 commits)
KVM: IOMMU: Disable device assignment without interrupt remapping
KVM: MMU: trace mmio page fault
KVM: MMU: mmio page fault support
KVM: MMU: reorganize struct kvm_shadow_walk_iterator
KVM: MMU: lockless walking shadow page table
KVM: MMU: do not need atomicly to set/clear spte
KVM: MMU: introduce the rules to modify shadow page table
KVM: MMU: abstract some functions to handle fault pfn
KVM: MMU: filter out the mmio pfn from the fault pfn
KVM: MMU: remove bypass_guest_pf
KVM: MMU: split kvm_mmu_free_page
KVM: MMU: count used shadow pages on prepareing path
KVM: MMU: rename 'pt_write' to 'emulate'
KVM: MMU: cleanup for FNAME(fetch)
KVM: MMU: optimize to handle dirty bit
KVM: MMU: cache mmio info on page fault path
KVM: x86: introduce vcpu_mmio_gva_to_gpa to cleanup the code
KVM: MMU: do not update slot bitmap if spte is nonpresent
KVM: MMU: fix walking shadow page table
KVM guest: KVM Steal time registration
...
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r-- | arch/x86/kvm/emulate.c | 1749 |
1 files changed, 806 insertions, 943 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index adc98675cda0..6f08bc940fa8 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -407,76 +407,59 @@ 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) |
430 | { | 413 | { |
431 | struct x86_instruction_info info = { | 414 | struct x86_instruction_info info = { |
432 | .intercept = intercept, | 415 | .intercept = intercept, |
433 | .rep_prefix = ctxt->decode.rep_prefix, | 416 | .rep_prefix = ctxt->rep_prefix, |
434 | .modrm_mod = ctxt->decode.modrm_mod, | 417 | .modrm_mod = ctxt->modrm_mod, |
435 | .modrm_reg = ctxt->decode.modrm_reg, | 418 | .modrm_reg = ctxt->modrm_reg, |
436 | .modrm_rm = ctxt->decode.modrm_rm, | 419 | .modrm_rm = ctxt->modrm_rm, |
437 | .src_val = ctxt->decode.src.val64, | 420 | .src_val = ctxt->src.val64, |
438 | .src_bytes = ctxt->decode.src.bytes, | 421 | .src_bytes = ctxt->src.bytes, |
439 | .dst_bytes = ctxt->decode.dst.bytes, | 422 | .dst_bytes = ctxt->dst.bytes, |
440 | .ad_bytes = ctxt->decode.ad_bytes, | 423 | .ad_bytes = ctxt->ad_bytes, |
441 | .next_rip = ctxt->eip, | 424 | .next_rip = ctxt->eip, |
442 | }; | 425 | }; |
443 | 426 | ||
444 | return ctxt->ops->intercept(ctxt, &info, stage); | 427 | return ctxt->ops->intercept(ctxt, &info, stage); |
445 | } | 428 | } |
446 | 429 | ||
447 | static inline unsigned long ad_mask(struct decode_cache *c) | 430 | static inline unsigned long ad_mask(struct x86_emulate_ctxt *ctxt) |
448 | { | 431 | { |
449 | return (1UL << (c->ad_bytes << 3)) - 1; | 432 | return (1UL << (ctxt->ad_bytes << 3)) - 1; |
450 | } | 433 | } |
451 | 434 | ||
452 | /* Access/update address held in a register, based on addressing mode. */ | 435 | /* Access/update address held in a register, based on addressing mode. */ |
453 | static inline unsigned long | 436 | static inline unsigned long |
454 | address_mask(struct decode_cache *c, unsigned long reg) | 437 | address_mask(struct x86_emulate_ctxt *ctxt, unsigned long reg) |
455 | { | 438 | { |
456 | if (c->ad_bytes == sizeof(unsigned long)) | 439 | if (ctxt->ad_bytes == sizeof(unsigned long)) |
457 | return reg; | 440 | return reg; |
458 | else | 441 | else |
459 | return reg & ad_mask(c); | 442 | return reg & ad_mask(ctxt); |
460 | } | 443 | } |
461 | 444 | ||
462 | static inline unsigned long | 445 | static inline unsigned long |
463 | register_address(struct decode_cache *c, unsigned long reg) | 446 | register_address(struct x86_emulate_ctxt *ctxt, unsigned long reg) |
464 | { | 447 | { |
465 | return address_mask(c, reg); | 448 | return address_mask(ctxt, reg); |
466 | } | 449 | } |
467 | 450 | ||
468 | static inline void | 451 | static inline void |
469 | register_address_increment(struct decode_cache *c, unsigned long *reg, int inc) | 452 | register_address_increment(struct x86_emulate_ctxt *ctxt, unsigned long *reg, int inc) |
470 | { | 453 | { |
471 | if (c->ad_bytes == sizeof(unsigned long)) | 454 | if (ctxt->ad_bytes == sizeof(unsigned long)) |
472 | *reg += inc; | 455 | *reg += inc; |
473 | else | 456 | else |
474 | *reg = (*reg & ~ad_mask(c)) | ((*reg + inc) & ad_mask(c)); | 457 | *reg = (*reg & ~ad_mask(ctxt)) | ((*reg + inc) & ad_mask(ctxt)); |
475 | } | 458 | } |
476 | 459 | ||
477 | static inline void jmp_rel(struct decode_cache *c, int rel) | 460 | static inline void jmp_rel(struct x86_emulate_ctxt *ctxt, int rel) |
478 | { | 461 | { |
479 | register_address_increment(c, &c->eip, rel); | 462 | register_address_increment(ctxt, &ctxt->_eip, rel); |
480 | } | 463 | } |
481 | 464 | ||
482 | static u32 desc_limit_scaled(struct desc_struct *desc) | 465 | static u32 desc_limit_scaled(struct desc_struct *desc) |
@@ -486,28 +469,26 @@ static u32 desc_limit_scaled(struct desc_struct *desc) | |||
486 | return desc->g ? (limit << 12) | 0xfff : limit; | 469 | return desc->g ? (limit << 12) | 0xfff : limit; |
487 | } | 470 | } |
488 | 471 | ||
489 | static void set_seg_override(struct decode_cache *c, int seg) | 472 | static void set_seg_override(struct x86_emulate_ctxt *ctxt, int seg) |
490 | { | 473 | { |
491 | c->has_seg_override = true; | 474 | ctxt->has_seg_override = true; |
492 | c->seg_override = seg; | 475 | ctxt->seg_override = seg; |
493 | } | 476 | } |
494 | 477 | ||
495 | static unsigned long seg_base(struct x86_emulate_ctxt *ctxt, | 478 | static unsigned long seg_base(struct x86_emulate_ctxt *ctxt, int seg) |
496 | struct x86_emulate_ops *ops, int seg) | ||
497 | { | 479 | { |
498 | if (ctxt->mode == X86EMUL_MODE_PROT64 && seg < VCPU_SREG_FS) | 480 | if (ctxt->mode == X86EMUL_MODE_PROT64 && seg < VCPU_SREG_FS) |
499 | return 0; | 481 | return 0; |
500 | 482 | ||
501 | return ops->get_cached_segment_base(ctxt, seg); | 483 | return ctxt->ops->get_cached_segment_base(ctxt, seg); |
502 | } | 484 | } |
503 | 485 | ||
504 | static unsigned seg_override(struct x86_emulate_ctxt *ctxt, | 486 | static unsigned seg_override(struct x86_emulate_ctxt *ctxt) |
505 | struct decode_cache *c) | ||
506 | { | 487 | { |
507 | if (!c->has_seg_override) | 488 | if (!ctxt->has_seg_override) |
508 | return 0; | 489 | return 0; |
509 | 490 | ||
510 | return c->seg_override; | 491 | return ctxt->seg_override; |
511 | } | 492 | } |
512 | 493 | ||
513 | static int emulate_exception(struct x86_emulate_ctxt *ctxt, int vec, | 494 | static int emulate_exception(struct x86_emulate_ctxt *ctxt, int vec, |
@@ -579,7 +560,6 @@ static int __linearize(struct x86_emulate_ctxt *ctxt, | |||
579 | unsigned size, bool write, bool fetch, | 560 | unsigned size, bool write, bool fetch, |
580 | ulong *linear) | 561 | ulong *linear) |
581 | { | 562 | { |
582 | struct decode_cache *c = &ctxt->decode; | ||
583 | struct desc_struct desc; | 563 | struct desc_struct desc; |
584 | bool usable; | 564 | bool usable; |
585 | ulong la; | 565 | ulong la; |
@@ -587,7 +567,7 @@ static int __linearize(struct x86_emulate_ctxt *ctxt, | |||
587 | u16 sel; | 567 | u16 sel; |
588 | unsigned cpl, rpl; | 568 | unsigned cpl, rpl; |
589 | 569 | ||
590 | la = seg_base(ctxt, ctxt->ops, addr.seg) + addr.ea; | 570 | la = seg_base(ctxt, addr.seg) + addr.ea; |
591 | switch (ctxt->mode) { | 571 | switch (ctxt->mode) { |
592 | case X86EMUL_MODE_REAL: | 572 | case X86EMUL_MODE_REAL: |
593 | break; | 573 | break; |
@@ -637,7 +617,7 @@ static int __linearize(struct x86_emulate_ctxt *ctxt, | |||
637 | } | 617 | } |
638 | break; | 618 | break; |
639 | } | 619 | } |
640 | if (fetch ? ctxt->mode != X86EMUL_MODE_PROT64 : c->ad_bytes != 8) | 620 | if (fetch ? ctxt->mode != X86EMUL_MODE_PROT64 : ctxt->ad_bytes != 8) |
641 | la &= (u32)-1; | 621 | la &= (u32)-1; |
642 | *linear = la; | 622 | *linear = la; |
643 | return X86EMUL_CONTINUE; | 623 | return X86EMUL_CONTINUE; |
@@ -671,11 +651,10 @@ static int segmented_read_std(struct x86_emulate_ctxt *ctxt, | |||
671 | return ctxt->ops->read_std(ctxt, linear, data, size, &ctxt->exception); | 651 | return ctxt->ops->read_std(ctxt, linear, data, size, &ctxt->exception); |
672 | } | 652 | } |
673 | 653 | ||
674 | static int do_fetch_insn_byte(struct x86_emulate_ctxt *ctxt, | 654 | static int do_insn_fetch_byte(struct x86_emulate_ctxt *ctxt, |
675 | struct x86_emulate_ops *ops, | ||
676 | unsigned long eip, u8 *dest) | 655 | unsigned long eip, u8 *dest) |
677 | { | 656 | { |
678 | struct fetch_cache *fc = &ctxt->decode.fetch; | 657 | struct fetch_cache *fc = &ctxt->fetch; |
679 | int rc; | 658 | int rc; |
680 | int size, cur_size; | 659 | int size, cur_size; |
681 | 660 | ||
@@ -687,8 +666,8 @@ static int do_fetch_insn_byte(struct x86_emulate_ctxt *ctxt, | |||
687 | rc = __linearize(ctxt, addr, size, false, true, &linear); | 666 | rc = __linearize(ctxt, addr, size, false, true, &linear); |
688 | if (rc != X86EMUL_CONTINUE) | 667 | if (rc != X86EMUL_CONTINUE) |
689 | return rc; | 668 | return rc; |
690 | rc = ops->fetch(ctxt, linear, fc->data + cur_size, | 669 | rc = ctxt->ops->fetch(ctxt, linear, fc->data + cur_size, |
691 | size, &ctxt->exception); | 670 | size, &ctxt->exception); |
692 | if (rc != X86EMUL_CONTINUE) | 671 | if (rc != X86EMUL_CONTINUE) |
693 | return rc; | 672 | return rc; |
694 | fc->end += size; | 673 | fc->end += size; |
@@ -698,7 +677,6 @@ static int do_fetch_insn_byte(struct x86_emulate_ctxt *ctxt, | |||
698 | } | 677 | } |
699 | 678 | ||
700 | static int do_insn_fetch(struct x86_emulate_ctxt *ctxt, | 679 | static int do_insn_fetch(struct x86_emulate_ctxt *ctxt, |
701 | struct x86_emulate_ops *ops, | ||
702 | unsigned long eip, void *dest, unsigned size) | 680 | unsigned long eip, void *dest, unsigned size) |
703 | { | 681 | { |
704 | int rc; | 682 | int rc; |
@@ -707,13 +685,30 @@ static int do_insn_fetch(struct x86_emulate_ctxt *ctxt, | |||
707 | if (eip + size - ctxt->eip > 15) | 685 | if (eip + size - ctxt->eip > 15) |
708 | return X86EMUL_UNHANDLEABLE; | 686 | return X86EMUL_UNHANDLEABLE; |
709 | while (size--) { | 687 | while (size--) { |
710 | rc = do_fetch_insn_byte(ctxt, ops, eip++, dest++); | 688 | rc = do_insn_fetch_byte(ctxt, eip++, dest++); |
711 | if (rc != X86EMUL_CONTINUE) | 689 | if (rc != X86EMUL_CONTINUE) |
712 | return rc; | 690 | return rc; |
713 | } | 691 | } |
714 | return X86EMUL_CONTINUE; | 692 | return X86EMUL_CONTINUE; |
715 | } | 693 | } |
716 | 694 | ||
695 | /* Fetch next part of the instruction being emulated. */ | ||
696 | #define insn_fetch(_type, _size, _eip) \ | ||
697 | ({ unsigned long _x; \ | ||
698 | rc = do_insn_fetch(ctxt, (_eip), &_x, (_size)); \ | ||
699 | if (rc != X86EMUL_CONTINUE) \ | ||
700 | goto done; \ | ||
701 | (_eip) += (_size); \ | ||
702 | (_type)_x; \ | ||
703 | }) | ||
704 | |||
705 | #define insn_fetch_arr(_arr, _size, _eip) \ | ||
706 | ({ rc = do_insn_fetch(ctxt, (_eip), _arr, (_size)); \ | ||
707 | if (rc != X86EMUL_CONTINUE) \ | ||
708 | goto done; \ | ||
709 | (_eip) += (_size); \ | ||
710 | }) | ||
711 | |||
717 | /* | 712 | /* |
718 | * Given the 'reg' portion of a ModRM byte, and a register block, return a | 713 | * Given the 'reg' portion of a ModRM byte, and a register block, return a |
719 | * pointer into the block that addresses the relevant register. | 714 | * pointer into the block that addresses the relevant register. |
@@ -857,16 +852,15 @@ static void write_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, | |||
857 | 852 | ||
858 | static void decode_register_operand(struct x86_emulate_ctxt *ctxt, | 853 | static void decode_register_operand(struct x86_emulate_ctxt *ctxt, |
859 | struct operand *op, | 854 | struct operand *op, |
860 | struct decode_cache *c, | ||
861 | int inhibit_bytereg) | 855 | int inhibit_bytereg) |
862 | { | 856 | { |
863 | unsigned reg = c->modrm_reg; | 857 | unsigned reg = ctxt->modrm_reg; |
864 | int highbyte_regs = c->rex_prefix == 0; | 858 | int highbyte_regs = ctxt->rex_prefix == 0; |
865 | 859 | ||
866 | if (!(c->d & ModRM)) | 860 | if (!(ctxt->d & ModRM)) |
867 | reg = (c->b & 7) | ((c->rex_prefix & 1) << 3); | 861 | reg = (ctxt->b & 7) | ((ctxt->rex_prefix & 1) << 3); |
868 | 862 | ||
869 | if (c->d & Sse) { | 863 | if (ctxt->d & Sse) { |
870 | op->type = OP_XMM; | 864 | op->type = OP_XMM; |
871 | op->bytes = 16; | 865 | op->bytes = 16; |
872 | op->addr.xmm = reg; | 866 | op->addr.xmm = reg; |
@@ -875,49 +869,47 @@ static void decode_register_operand(struct x86_emulate_ctxt *ctxt, | |||
875 | } | 869 | } |
876 | 870 | ||
877 | op->type = OP_REG; | 871 | op->type = OP_REG; |
878 | if ((c->d & ByteOp) && !inhibit_bytereg) { | 872 | if ((ctxt->d & ByteOp) && !inhibit_bytereg) { |
879 | op->addr.reg = decode_register(reg, c->regs, highbyte_regs); | 873 | op->addr.reg = decode_register(reg, ctxt->regs, highbyte_regs); |
880 | op->bytes = 1; | 874 | op->bytes = 1; |
881 | } else { | 875 | } else { |
882 | op->addr.reg = decode_register(reg, c->regs, 0); | 876 | op->addr.reg = decode_register(reg, ctxt->regs, 0); |
883 | op->bytes = c->op_bytes; | 877 | op->bytes = ctxt->op_bytes; |
884 | } | 878 | } |
885 | fetch_register_operand(op); | 879 | fetch_register_operand(op); |
886 | op->orig_val = op->val; | 880 | op->orig_val = op->val; |
887 | } | 881 | } |
888 | 882 | ||
889 | static int decode_modrm(struct x86_emulate_ctxt *ctxt, | 883 | static int decode_modrm(struct x86_emulate_ctxt *ctxt, |
890 | struct x86_emulate_ops *ops, | ||
891 | struct operand *op) | 884 | struct operand *op) |
892 | { | 885 | { |
893 | struct decode_cache *c = &ctxt->decode; | ||
894 | u8 sib; | 886 | u8 sib; |
895 | int index_reg = 0, base_reg = 0, scale; | 887 | int index_reg = 0, base_reg = 0, scale; |
896 | int rc = X86EMUL_CONTINUE; | 888 | int rc = X86EMUL_CONTINUE; |
897 | ulong modrm_ea = 0; | 889 | ulong modrm_ea = 0; |
898 | 890 | ||
899 | if (c->rex_prefix) { | 891 | if (ctxt->rex_prefix) { |
900 | c->modrm_reg = (c->rex_prefix & 4) << 1; /* REX.R */ | 892 | ctxt->modrm_reg = (ctxt->rex_prefix & 4) << 1; /* REX.R */ |
901 | index_reg = (c->rex_prefix & 2) << 2; /* REX.X */ | 893 | index_reg = (ctxt->rex_prefix & 2) << 2; /* REX.X */ |
902 | c->modrm_rm = base_reg = (c->rex_prefix & 1) << 3; /* REG.B */ | 894 | ctxt->modrm_rm = base_reg = (ctxt->rex_prefix & 1) << 3; /* REG.B */ |
903 | } | 895 | } |
904 | 896 | ||
905 | c->modrm = insn_fetch(u8, 1, c->eip); | 897 | ctxt->modrm = insn_fetch(u8, 1, ctxt->_eip); |
906 | c->modrm_mod |= (c->modrm & 0xc0) >> 6; | 898 | ctxt->modrm_mod |= (ctxt->modrm & 0xc0) >> 6; |
907 | c->modrm_reg |= (c->modrm & 0x38) >> 3; | 899 | ctxt->modrm_reg |= (ctxt->modrm & 0x38) >> 3; |
908 | c->modrm_rm |= (c->modrm & 0x07); | 900 | ctxt->modrm_rm |= (ctxt->modrm & 0x07); |
909 | c->modrm_seg = VCPU_SREG_DS; | 901 | ctxt->modrm_seg = VCPU_SREG_DS; |
910 | 902 | ||
911 | if (c->modrm_mod == 3) { | 903 | if (ctxt->modrm_mod == 3) { |
912 | op->type = OP_REG; | 904 | op->type = OP_REG; |
913 | op->bytes = (c->d & ByteOp) ? 1 : c->op_bytes; | 905 | op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; |
914 | op->addr.reg = decode_register(c->modrm_rm, | 906 | op->addr.reg = decode_register(ctxt->modrm_rm, |
915 | c->regs, c->d & ByteOp); | 907 | ctxt->regs, ctxt->d & ByteOp); |
916 | if (c->d & Sse) { | 908 | if (ctxt->d & Sse) { |
917 | op->type = OP_XMM; | 909 | op->type = OP_XMM; |
918 | op->bytes = 16; | 910 | op->bytes = 16; |
919 | op->addr.xmm = c->modrm_rm; | 911 | op->addr.xmm = ctxt->modrm_rm; |
920 | read_sse_reg(ctxt, &op->vec_val, c->modrm_rm); | 912 | read_sse_reg(ctxt, &op->vec_val, ctxt->modrm_rm); |
921 | return rc; | 913 | return rc; |
922 | } | 914 | } |
923 | fetch_register_operand(op); | 915 | fetch_register_operand(op); |
@@ -926,26 +918,26 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
926 | 918 | ||
927 | op->type = OP_MEM; | 919 | op->type = OP_MEM; |
928 | 920 | ||
929 | if (c->ad_bytes == 2) { | 921 | if (ctxt->ad_bytes == 2) { |
930 | unsigned bx = c->regs[VCPU_REGS_RBX]; | 922 | unsigned bx = ctxt->regs[VCPU_REGS_RBX]; |
931 | unsigned bp = c->regs[VCPU_REGS_RBP]; | 923 | unsigned bp = ctxt->regs[VCPU_REGS_RBP]; |
932 | unsigned si = c->regs[VCPU_REGS_RSI]; | 924 | unsigned si = ctxt->regs[VCPU_REGS_RSI]; |
933 | unsigned di = c->regs[VCPU_REGS_RDI]; | 925 | unsigned di = ctxt->regs[VCPU_REGS_RDI]; |
934 | 926 | ||
935 | /* 16-bit ModR/M decode. */ | 927 | /* 16-bit ModR/M decode. */ |
936 | switch (c->modrm_mod) { | 928 | switch (ctxt->modrm_mod) { |
937 | case 0: | 929 | case 0: |
938 | if (c->modrm_rm == 6) | 930 | if (ctxt->modrm_rm == 6) |
939 | modrm_ea += insn_fetch(u16, 2, c->eip); | 931 | modrm_ea += insn_fetch(u16, 2, ctxt->_eip); |
940 | break; | 932 | break; |
941 | case 1: | 933 | case 1: |
942 | modrm_ea += insn_fetch(s8, 1, c->eip); | 934 | modrm_ea += insn_fetch(s8, 1, ctxt->_eip); |
943 | break; | 935 | break; |
944 | case 2: | 936 | case 2: |
945 | modrm_ea += insn_fetch(u16, 2, c->eip); | 937 | modrm_ea += insn_fetch(u16, 2, ctxt->_eip); |
946 | break; | 938 | break; |
947 | } | 939 | } |
948 | switch (c->modrm_rm) { | 940 | switch (ctxt->modrm_rm) { |
949 | case 0: | 941 | case 0: |
950 | modrm_ea += bx + si; | 942 | modrm_ea += bx + si; |
951 | break; | 943 | break; |
@@ -965,46 +957,46 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
965 | modrm_ea += di; | 957 | modrm_ea += di; |
966 | break; | 958 | break; |
967 | case 6: | 959 | case 6: |
968 | if (c->modrm_mod != 0) | 960 | if (ctxt->modrm_mod != 0) |
969 | modrm_ea += bp; | 961 | modrm_ea += bp; |
970 | break; | 962 | break; |
971 | case 7: | 963 | case 7: |
972 | modrm_ea += bx; | 964 | modrm_ea += bx; |
973 | break; | 965 | break; |
974 | } | 966 | } |
975 | if (c->modrm_rm == 2 || c->modrm_rm == 3 || | 967 | if (ctxt->modrm_rm == 2 || ctxt->modrm_rm == 3 || |
976 | (c->modrm_rm == 6 && c->modrm_mod != 0)) | 968 | (ctxt->modrm_rm == 6 && ctxt->modrm_mod != 0)) |
977 | c->modrm_seg = VCPU_SREG_SS; | 969 | ctxt->modrm_seg = VCPU_SREG_SS; |
978 | modrm_ea = (u16)modrm_ea; | 970 | modrm_ea = (u16)modrm_ea; |
979 | } else { | 971 | } else { |
980 | /* 32/64-bit ModR/M decode. */ | 972 | /* 32/64-bit ModR/M decode. */ |
981 | if ((c->modrm_rm & 7) == 4) { | 973 | if ((ctxt->modrm_rm & 7) == 4) { |
982 | sib = insn_fetch(u8, 1, c->eip); | 974 | sib = insn_fetch(u8, 1, ctxt->_eip); |
983 | index_reg |= (sib >> 3) & 7; | 975 | index_reg |= (sib >> 3) & 7; |
984 | base_reg |= sib & 7; | 976 | base_reg |= sib & 7; |
985 | scale = sib >> 6; | 977 | scale = sib >> 6; |
986 | 978 | ||
987 | if ((base_reg & 7) == 5 && c->modrm_mod == 0) | 979 | if ((base_reg & 7) == 5 && ctxt->modrm_mod == 0) |
988 | modrm_ea += insn_fetch(s32, 4, c->eip); | 980 | modrm_ea += insn_fetch(s32, 4, ctxt->_eip); |
989 | else | 981 | else |
990 | modrm_ea += c->regs[base_reg]; | 982 | modrm_ea += ctxt->regs[base_reg]; |
991 | if (index_reg != 4) | 983 | if (index_reg != 4) |
992 | modrm_ea += c->regs[index_reg] << scale; | 984 | modrm_ea += ctxt->regs[index_reg] << scale; |
993 | } else if ((c->modrm_rm & 7) == 5 && c->modrm_mod == 0) { | 985 | } else if ((ctxt->modrm_rm & 7) == 5 && ctxt->modrm_mod == 0) { |
994 | if (ctxt->mode == X86EMUL_MODE_PROT64) | 986 | if (ctxt->mode == X86EMUL_MODE_PROT64) |
995 | c->rip_relative = 1; | 987 | ctxt->rip_relative = 1; |
996 | } else | 988 | } else |
997 | modrm_ea += c->regs[c->modrm_rm]; | 989 | modrm_ea += ctxt->regs[ctxt->modrm_rm]; |
998 | switch (c->modrm_mod) { | 990 | switch (ctxt->modrm_mod) { |
999 | case 0: | 991 | case 0: |
1000 | if (c->modrm_rm == 5) | 992 | if (ctxt->modrm_rm == 5) |
1001 | modrm_ea += insn_fetch(s32, 4, c->eip); | 993 | modrm_ea += insn_fetch(s32, 4, ctxt->_eip); |
1002 | break; | 994 | break; |
1003 | case 1: | 995 | case 1: |
1004 | modrm_ea += insn_fetch(s8, 1, c->eip); | 996 | modrm_ea += insn_fetch(s8, 1, ctxt->_eip); |
1005 | break; | 997 | break; |
1006 | case 2: | 998 | case 2: |
1007 | modrm_ea += insn_fetch(s32, 4, c->eip); | 999 | modrm_ea += insn_fetch(s32, 4, ctxt->_eip); |
1008 | break; | 1000 | break; |
1009 | } | 1001 | } |
1010 | } | 1002 | } |
@@ -1014,53 +1006,50 @@ done: | |||
1014 | } | 1006 | } |
1015 | 1007 | ||
1016 | static int decode_abs(struct x86_emulate_ctxt *ctxt, | 1008 | static int decode_abs(struct x86_emulate_ctxt *ctxt, |
1017 | struct x86_emulate_ops *ops, | ||
1018 | struct operand *op) | 1009 | struct operand *op) |
1019 | { | 1010 | { |
1020 | struct decode_cache *c = &ctxt->decode; | ||
1021 | int rc = X86EMUL_CONTINUE; | 1011 | int rc = X86EMUL_CONTINUE; |
1022 | 1012 | ||
1023 | op->type = OP_MEM; | 1013 | op->type = OP_MEM; |
1024 | switch (c->ad_bytes) { | 1014 | switch (ctxt->ad_bytes) { |
1025 | case 2: | 1015 | case 2: |
1026 | op->addr.mem.ea = insn_fetch(u16, 2, c->eip); | 1016 | op->addr.mem.ea = insn_fetch(u16, 2, ctxt->_eip); |
1027 | break; | 1017 | break; |
1028 | case 4: | 1018 | case 4: |
1029 | op->addr.mem.ea = insn_fetch(u32, 4, c->eip); | 1019 | op->addr.mem.ea = insn_fetch(u32, 4, ctxt->_eip); |
1030 | break; | 1020 | break; |
1031 | case 8: | 1021 | case 8: |
1032 | op->addr.mem.ea = insn_fetch(u64, 8, c->eip); | 1022 | op->addr.mem.ea = insn_fetch(u64, 8, ctxt->_eip); |
1033 | break; | 1023 | break; |
1034 | } | 1024 | } |
1035 | done: | 1025 | done: |
1036 | return rc; | 1026 | return rc; |
1037 | } | 1027 | } |
1038 | 1028 | ||
1039 | static void fetch_bit_operand(struct decode_cache *c) | 1029 | static void fetch_bit_operand(struct x86_emulate_ctxt *ctxt) |
1040 | { | 1030 | { |
1041 | long sv = 0, mask; | 1031 | long sv = 0, mask; |
1042 | 1032 | ||
1043 | if (c->dst.type == OP_MEM && c->src.type == OP_REG) { | 1033 | if (ctxt->dst.type == OP_MEM && ctxt->src.type == OP_REG) { |
1044 | mask = ~(c->dst.bytes * 8 - 1); | 1034 | mask = ~(ctxt->dst.bytes * 8 - 1); |
1045 | 1035 | ||
1046 | if (c->src.bytes == 2) | 1036 | if (ctxt->src.bytes == 2) |
1047 | sv = (s16)c->src.val & (s16)mask; | 1037 | sv = (s16)ctxt->src.val & (s16)mask; |
1048 | else if (c->src.bytes == 4) | 1038 | else if (ctxt->src.bytes == 4) |
1049 | sv = (s32)c->src.val & (s32)mask; | 1039 | sv = (s32)ctxt->src.val & (s32)mask; |
1050 | 1040 | ||
1051 | c->dst.addr.mem.ea += (sv >> 3); | 1041 | ctxt->dst.addr.mem.ea += (sv >> 3); |
1052 | } | 1042 | } |
1053 | 1043 | ||
1054 | /* only subword offset */ | 1044 | /* only subword offset */ |
1055 | c->src.val &= (c->dst.bytes << 3) - 1; | 1045 | ctxt->src.val &= (ctxt->dst.bytes << 3) - 1; |
1056 | } | 1046 | } |
1057 | 1047 | ||
1058 | static int read_emulated(struct x86_emulate_ctxt *ctxt, | 1048 | static int read_emulated(struct x86_emulate_ctxt *ctxt, |
1059 | struct x86_emulate_ops *ops, | ||
1060 | unsigned long addr, void *dest, unsigned size) | 1049 | unsigned long addr, void *dest, unsigned size) |
1061 | { | 1050 | { |
1062 | int rc; | 1051 | int rc; |
1063 | struct read_cache *mc = &ctxt->decode.mem_read; | 1052 | struct read_cache *mc = &ctxt->mem_read; |
1064 | 1053 | ||
1065 | while (size) { | 1054 | while (size) { |
1066 | int n = min(size, 8u); | 1055 | int n = min(size, 8u); |
@@ -1068,8 +1057,8 @@ static int read_emulated(struct x86_emulate_ctxt *ctxt, | |||
1068 | if (mc->pos < mc->end) | 1057 | if (mc->pos < mc->end) |
1069 | goto read_cached; | 1058 | goto read_cached; |
1070 | 1059 | ||
1071 | rc = ops->read_emulated(ctxt, addr, mc->data + mc->end, n, | 1060 | rc = ctxt->ops->read_emulated(ctxt, addr, mc->data + mc->end, n, |
1072 | &ctxt->exception); | 1061 | &ctxt->exception); |
1073 | if (rc != X86EMUL_CONTINUE) | 1062 | if (rc != X86EMUL_CONTINUE) |
1074 | return rc; | 1063 | return rc; |
1075 | mc->end += n; | 1064 | mc->end += n; |
@@ -1094,7 +1083,7 @@ static int segmented_read(struct x86_emulate_ctxt *ctxt, | |||
1094 | rc = linearize(ctxt, addr, size, false, &linear); | 1083 | rc = linearize(ctxt, addr, size, false, &linear); |
1095 | if (rc != X86EMUL_CONTINUE) | 1084 | if (rc != X86EMUL_CONTINUE) |
1096 | return rc; | 1085 | return rc; |
1097 | return read_emulated(ctxt, ctxt->ops, linear, data, size); | 1086 | return read_emulated(ctxt, linear, data, size); |
1098 | } | 1087 | } |
1099 | 1088 | ||
1100 | static int segmented_write(struct x86_emulate_ctxt *ctxt, | 1089 | static int segmented_write(struct x86_emulate_ctxt *ctxt, |
@@ -1128,26 +1117,24 @@ static int segmented_cmpxchg(struct x86_emulate_ctxt *ctxt, | |||
1128 | } | 1117 | } |
1129 | 1118 | ||
1130 | static int pio_in_emulated(struct x86_emulate_ctxt *ctxt, | 1119 | static int pio_in_emulated(struct x86_emulate_ctxt *ctxt, |
1131 | struct x86_emulate_ops *ops, | ||
1132 | unsigned int size, unsigned short port, | 1120 | unsigned int size, unsigned short port, |
1133 | void *dest) | 1121 | void *dest) |
1134 | { | 1122 | { |
1135 | struct read_cache *rc = &ctxt->decode.io_read; | 1123 | struct read_cache *rc = &ctxt->io_read; |
1136 | 1124 | ||
1137 | if (rc->pos == rc->end) { /* refill pio read ahead */ | 1125 | if (rc->pos == rc->end) { /* refill pio read ahead */ |
1138 | struct decode_cache *c = &ctxt->decode; | ||
1139 | unsigned int in_page, n; | 1126 | unsigned int in_page, n; |
1140 | unsigned int count = c->rep_prefix ? | 1127 | unsigned int count = ctxt->rep_prefix ? |
1141 | address_mask(c, c->regs[VCPU_REGS_RCX]) : 1; | 1128 | address_mask(ctxt, ctxt->regs[VCPU_REGS_RCX]) : 1; |
1142 | in_page = (ctxt->eflags & EFLG_DF) ? | 1129 | in_page = (ctxt->eflags & EFLG_DF) ? |
1143 | offset_in_page(c->regs[VCPU_REGS_RDI]) : | 1130 | offset_in_page(ctxt->regs[VCPU_REGS_RDI]) : |
1144 | PAGE_SIZE - offset_in_page(c->regs[VCPU_REGS_RDI]); | 1131 | PAGE_SIZE - offset_in_page(ctxt->regs[VCPU_REGS_RDI]); |
1145 | n = min(min(in_page, (unsigned int)sizeof(rc->data)) / size, | 1132 | n = min(min(in_page, (unsigned int)sizeof(rc->data)) / size, |
1146 | count); | 1133 | count); |
1147 | if (n == 0) | 1134 | if (n == 0) |
1148 | n = 1; | 1135 | n = 1; |
1149 | rc->pos = rc->end = 0; | 1136 | rc->pos = rc->end = 0; |
1150 | if (!ops->pio_in_emulated(ctxt, size, port, rc->data, n)) | 1137 | if (!ctxt->ops->pio_in_emulated(ctxt, size, port, rc->data, n)) |
1151 | return 0; | 1138 | return 0; |
1152 | rc->end = n * size; | 1139 | rc->end = n * size; |
1153 | } | 1140 | } |
@@ -1158,9 +1145,10 @@ static int pio_in_emulated(struct x86_emulate_ctxt *ctxt, | |||
1158 | } | 1145 | } |
1159 | 1146 | ||
1160 | static void get_descriptor_table_ptr(struct x86_emulate_ctxt *ctxt, | 1147 | static void get_descriptor_table_ptr(struct x86_emulate_ctxt *ctxt, |
1161 | struct x86_emulate_ops *ops, | ||
1162 | u16 selector, struct desc_ptr *dt) | 1148 | u16 selector, struct desc_ptr *dt) |
1163 | { | 1149 | { |
1150 | struct x86_emulate_ops *ops = ctxt->ops; | ||
1151 | |||
1164 | if (selector & 1 << 2) { | 1152 | if (selector & 1 << 2) { |
1165 | struct desc_struct desc; | 1153 | struct desc_struct desc; |
1166 | u16 sel; | 1154 | u16 sel; |
@@ -1177,48 +1165,42 @@ static void get_descriptor_table_ptr(struct x86_emulate_ctxt *ctxt, | |||
1177 | 1165 | ||
1178 | /* allowed just for 8 bytes segments */ | 1166 | /* allowed just for 8 bytes segments */ |
1179 | static int read_segment_descriptor(struct x86_emulate_ctxt *ctxt, | 1167 | static int read_segment_descriptor(struct x86_emulate_ctxt *ctxt, |
1180 | struct x86_emulate_ops *ops, | ||
1181 | u16 selector, struct desc_struct *desc) | 1168 | u16 selector, struct desc_struct *desc) |
1182 | { | 1169 | { |
1183 | struct desc_ptr dt; | 1170 | struct desc_ptr dt; |
1184 | u16 index = selector >> 3; | 1171 | u16 index = selector >> 3; |
1185 | int ret; | ||
1186 | ulong addr; | 1172 | ulong addr; |
1187 | 1173 | ||
1188 | get_descriptor_table_ptr(ctxt, ops, selector, &dt); | 1174 | get_descriptor_table_ptr(ctxt, selector, &dt); |
1189 | 1175 | ||
1190 | if (dt.size < index * 8 + 7) | 1176 | if (dt.size < index * 8 + 7) |
1191 | return emulate_gp(ctxt, selector & 0xfffc); | 1177 | return emulate_gp(ctxt, selector & 0xfffc); |
1192 | addr = dt.address + index * 8; | ||
1193 | ret = ops->read_std(ctxt, addr, desc, sizeof *desc, &ctxt->exception); | ||
1194 | 1178 | ||
1195 | return ret; | 1179 | addr = dt.address + index * 8; |
1180 | return ctxt->ops->read_std(ctxt, addr, desc, sizeof *desc, | ||
1181 | &ctxt->exception); | ||
1196 | } | 1182 | } |
1197 | 1183 | ||
1198 | /* allowed just for 8 bytes segments */ | 1184 | /* allowed just for 8 bytes segments */ |
1199 | static int write_segment_descriptor(struct x86_emulate_ctxt *ctxt, | 1185 | static int write_segment_descriptor(struct x86_emulate_ctxt *ctxt, |
1200 | struct x86_emulate_ops *ops, | ||
1201 | u16 selector, struct desc_struct *desc) | 1186 | u16 selector, struct desc_struct *desc) |
1202 | { | 1187 | { |
1203 | struct desc_ptr dt; | 1188 | struct desc_ptr dt; |
1204 | u16 index = selector >> 3; | 1189 | u16 index = selector >> 3; |
1205 | ulong addr; | 1190 | ulong addr; |
1206 | int ret; | ||
1207 | 1191 | ||
1208 | get_descriptor_table_ptr(ctxt, ops, selector, &dt); | 1192 | get_descriptor_table_ptr(ctxt, selector, &dt); |
1209 | 1193 | ||
1210 | if (dt.size < index * 8 + 7) | 1194 | if (dt.size < index * 8 + 7) |
1211 | return emulate_gp(ctxt, selector & 0xfffc); | 1195 | return emulate_gp(ctxt, selector & 0xfffc); |
1212 | 1196 | ||
1213 | addr = dt.address + index * 8; | 1197 | addr = dt.address + index * 8; |
1214 | ret = ops->write_std(ctxt, addr, desc, sizeof *desc, &ctxt->exception); | 1198 | return ctxt->ops->write_std(ctxt, addr, desc, sizeof *desc, |
1215 | 1199 | &ctxt->exception); | |
1216 | return ret; | ||
1217 | } | 1200 | } |
1218 | 1201 | ||
1219 | /* Does not support long mode */ | 1202 | /* Does not support long mode */ |
1220 | static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt, | 1203 | static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt, |
1221 | struct x86_emulate_ops *ops, | ||
1222 | u16 selector, int seg) | 1204 | u16 selector, int seg) |
1223 | { | 1205 | { |
1224 | struct desc_struct seg_desc; | 1206 | struct desc_struct seg_desc; |
@@ -1253,7 +1235,7 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt, | |||
1253 | if (null_selector) /* for NULL selector skip all following checks */ | 1235 | if (null_selector) /* for NULL selector skip all following checks */ |
1254 | goto load; | 1236 | goto load; |
1255 | 1237 | ||
1256 | ret = read_segment_descriptor(ctxt, ops, selector, &seg_desc); | 1238 | ret = read_segment_descriptor(ctxt, selector, &seg_desc); |
1257 | if (ret != X86EMUL_CONTINUE) | 1239 | if (ret != X86EMUL_CONTINUE) |
1258 | return ret; | 1240 | return ret; |
1259 | 1241 | ||
@@ -1271,7 +1253,7 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt, | |||
1271 | 1253 | ||
1272 | rpl = selector & 3; | 1254 | rpl = selector & 3; |
1273 | dpl = seg_desc.dpl; | 1255 | dpl = seg_desc.dpl; |
1274 | cpl = ops->cpl(ctxt); | 1256 | cpl = ctxt->ops->cpl(ctxt); |
1275 | 1257 | ||
1276 | switch (seg) { | 1258 | switch (seg) { |
1277 | case VCPU_SREG_SS: | 1259 | case VCPU_SREG_SS: |
@@ -1322,12 +1304,12 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt, | |||
1322 | if (seg_desc.s) { | 1304 | if (seg_desc.s) { |
1323 | /* mark segment as accessed */ | 1305 | /* mark segment as accessed */ |
1324 | seg_desc.type |= 1; | 1306 | seg_desc.type |= 1; |
1325 | ret = write_segment_descriptor(ctxt, ops, selector, &seg_desc); | 1307 | ret = write_segment_descriptor(ctxt, selector, &seg_desc); |
1326 | if (ret != X86EMUL_CONTINUE) | 1308 | if (ret != X86EMUL_CONTINUE) |
1327 | return ret; | 1309 | return ret; |
1328 | } | 1310 | } |
1329 | load: | 1311 | load: |
1330 | ops->set_segment(ctxt, selector, &seg_desc, 0, seg); | 1312 | ctxt->ops->set_segment(ctxt, selector, &seg_desc, 0, seg); |
1331 | return X86EMUL_CONTINUE; | 1313 | return X86EMUL_CONTINUE; |
1332 | exception: | 1314 | exception: |
1333 | emulate_exception(ctxt, err_vec, err_code, true); | 1315 | emulate_exception(ctxt, err_vec, err_code, true); |
@@ -1356,29 +1338,28 @@ static void write_register_operand(struct operand *op) | |||
1356 | static int writeback(struct x86_emulate_ctxt *ctxt) | 1338 | static int writeback(struct x86_emulate_ctxt *ctxt) |
1357 | { | 1339 | { |
1358 | int rc; | 1340 | int rc; |
1359 | struct decode_cache *c = &ctxt->decode; | ||
1360 | 1341 | ||
1361 | switch (c->dst.type) { | 1342 | switch (ctxt->dst.type) { |
1362 | case OP_REG: | 1343 | case OP_REG: |
1363 | write_register_operand(&c->dst); | 1344 | write_register_operand(&ctxt->dst); |
1364 | break; | 1345 | break; |
1365 | case OP_MEM: | 1346 | case OP_MEM: |
1366 | if (c->lock_prefix) | 1347 | if (ctxt->lock_prefix) |
1367 | rc = segmented_cmpxchg(ctxt, | 1348 | rc = segmented_cmpxchg(ctxt, |
1368 | c->dst.addr.mem, | 1349 | ctxt->dst.addr.mem, |
1369 | &c->dst.orig_val, | 1350 | &ctxt->dst.orig_val, |
1370 | &c->dst.val, | 1351 | &ctxt->dst.val, |
1371 | c->dst.bytes); | 1352 | ctxt->dst.bytes); |
1372 | else | 1353 | else |
1373 | rc = segmented_write(ctxt, | 1354 | rc = segmented_write(ctxt, |
1374 | c->dst.addr.mem, | 1355 | ctxt->dst.addr.mem, |
1375 | &c->dst.val, | 1356 | &ctxt->dst.val, |
1376 | c->dst.bytes); | 1357 | ctxt->dst.bytes); |
1377 | if (rc != X86EMUL_CONTINUE) | 1358 | if (rc != X86EMUL_CONTINUE) |
1378 | return rc; | 1359 | return rc; |
1379 | break; | 1360 | break; |
1380 | case OP_XMM: | 1361 | case OP_XMM: |
1381 | write_sse_reg(ctxt, &c->dst.vec_val, c->dst.addr.xmm); | 1362 | write_sse_reg(ctxt, &ctxt->dst.vec_val, ctxt->dst.addr.xmm); |
1382 | break; | 1363 | break; |
1383 | case OP_NONE: | 1364 | case OP_NONE: |
1384 | /* no writeback */ | 1365 | /* no writeback */ |
@@ -1391,50 +1372,45 @@ static int writeback(struct x86_emulate_ctxt *ctxt) | |||
1391 | 1372 | ||
1392 | static int em_push(struct x86_emulate_ctxt *ctxt) | 1373 | static int em_push(struct x86_emulate_ctxt *ctxt) |
1393 | { | 1374 | { |
1394 | struct decode_cache *c = &ctxt->decode; | ||
1395 | struct segmented_address addr; | 1375 | struct segmented_address addr; |
1396 | 1376 | ||
1397 | register_address_increment(c, &c->regs[VCPU_REGS_RSP], -c->op_bytes); | 1377 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], -ctxt->op_bytes); |
1398 | addr.ea = register_address(c, c->regs[VCPU_REGS_RSP]); | 1378 | addr.ea = register_address(ctxt, ctxt->regs[VCPU_REGS_RSP]); |
1399 | addr.seg = VCPU_SREG_SS; | 1379 | addr.seg = VCPU_SREG_SS; |
1400 | 1380 | ||
1401 | /* Disable writeback. */ | 1381 | /* Disable writeback. */ |
1402 | c->dst.type = OP_NONE; | 1382 | ctxt->dst.type = OP_NONE; |
1403 | return segmented_write(ctxt, addr, &c->src.val, c->op_bytes); | 1383 | return segmented_write(ctxt, addr, &ctxt->src.val, ctxt->op_bytes); |
1404 | } | 1384 | } |
1405 | 1385 | ||
1406 | static int emulate_pop(struct x86_emulate_ctxt *ctxt, | 1386 | static int emulate_pop(struct x86_emulate_ctxt *ctxt, |
1407 | void *dest, int len) | 1387 | void *dest, int len) |
1408 | { | 1388 | { |
1409 | struct decode_cache *c = &ctxt->decode; | ||
1410 | int rc; | 1389 | int rc; |
1411 | struct segmented_address addr; | 1390 | struct segmented_address addr; |
1412 | 1391 | ||
1413 | addr.ea = register_address(c, c->regs[VCPU_REGS_RSP]); | 1392 | addr.ea = register_address(ctxt, ctxt->regs[VCPU_REGS_RSP]); |
1414 | addr.seg = VCPU_SREG_SS; | 1393 | addr.seg = VCPU_SREG_SS; |
1415 | rc = segmented_read(ctxt, addr, dest, len); | 1394 | rc = segmented_read(ctxt, addr, dest, len); |
1416 | if (rc != X86EMUL_CONTINUE) | 1395 | if (rc != X86EMUL_CONTINUE) |
1417 | return rc; | 1396 | return rc; |
1418 | 1397 | ||
1419 | register_address_increment(c, &c->regs[VCPU_REGS_RSP], len); | 1398 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], len); |
1420 | return rc; | 1399 | return rc; |
1421 | } | 1400 | } |
1422 | 1401 | ||
1423 | static int em_pop(struct x86_emulate_ctxt *ctxt) | 1402 | static int em_pop(struct x86_emulate_ctxt *ctxt) |
1424 | { | 1403 | { |
1425 | struct decode_cache *c = &ctxt->decode; | 1404 | return emulate_pop(ctxt, &ctxt->dst.val, ctxt->op_bytes); |
1426 | |||
1427 | return emulate_pop(ctxt, &c->dst.val, c->op_bytes); | ||
1428 | } | 1405 | } |
1429 | 1406 | ||
1430 | static int emulate_popf(struct x86_emulate_ctxt *ctxt, | 1407 | static int emulate_popf(struct x86_emulate_ctxt *ctxt, |
1431 | struct x86_emulate_ops *ops, | 1408 | void *dest, int len) |
1432 | void *dest, int len) | ||
1433 | { | 1409 | { |
1434 | int rc; | 1410 | int rc; |
1435 | unsigned long val, change_mask; | 1411 | unsigned long val, change_mask; |
1436 | int iopl = (ctxt->eflags & X86_EFLAGS_IOPL) >> IOPL_SHIFT; | 1412 | int iopl = (ctxt->eflags & X86_EFLAGS_IOPL) >> IOPL_SHIFT; |
1437 | int cpl = ops->cpl(ctxt); | 1413 | int cpl = ctxt->ops->cpl(ctxt); |
1438 | 1414 | ||
1439 | rc = emulate_pop(ctxt, &val, len); | 1415 | rc = emulate_pop(ctxt, &val, len); |
1440 | if (rc != X86EMUL_CONTINUE) | 1416 | if (rc != X86EMUL_CONTINUE) |
@@ -1470,49 +1446,41 @@ static int emulate_popf(struct x86_emulate_ctxt *ctxt, | |||
1470 | 1446 | ||
1471 | static int em_popf(struct x86_emulate_ctxt *ctxt) | 1447 | static int em_popf(struct x86_emulate_ctxt *ctxt) |
1472 | { | 1448 | { |
1473 | struct decode_cache *c = &ctxt->decode; | 1449 | ctxt->dst.type = OP_REG; |
1474 | 1450 | ctxt->dst.addr.reg = &ctxt->eflags; | |
1475 | c->dst.type = OP_REG; | 1451 | ctxt->dst.bytes = ctxt->op_bytes; |
1476 | c->dst.addr.reg = &ctxt->eflags; | 1452 | return emulate_popf(ctxt, &ctxt->dst.val, ctxt->op_bytes); |
1477 | c->dst.bytes = c->op_bytes; | ||
1478 | return emulate_popf(ctxt, ctxt->ops, &c->dst.val, c->op_bytes); | ||
1479 | } | 1453 | } |
1480 | 1454 | ||
1481 | static int emulate_push_sreg(struct x86_emulate_ctxt *ctxt, | 1455 | static int emulate_push_sreg(struct x86_emulate_ctxt *ctxt, int seg) |
1482 | struct x86_emulate_ops *ops, int seg) | ||
1483 | { | 1456 | { |
1484 | struct decode_cache *c = &ctxt->decode; | 1457 | ctxt->src.val = get_segment_selector(ctxt, seg); |
1485 | |||
1486 | c->src.val = get_segment_selector(ctxt, seg); | ||
1487 | 1458 | ||
1488 | return em_push(ctxt); | 1459 | return em_push(ctxt); |
1489 | } | 1460 | } |
1490 | 1461 | ||
1491 | static int emulate_pop_sreg(struct x86_emulate_ctxt *ctxt, | 1462 | static int emulate_pop_sreg(struct x86_emulate_ctxt *ctxt, int seg) |
1492 | struct x86_emulate_ops *ops, int seg) | ||
1493 | { | 1463 | { |
1494 | struct decode_cache *c = &ctxt->decode; | ||
1495 | unsigned long selector; | 1464 | unsigned long selector; |
1496 | int rc; | 1465 | int rc; |
1497 | 1466 | ||
1498 | rc = emulate_pop(ctxt, &selector, c->op_bytes); | 1467 | rc = emulate_pop(ctxt, &selector, ctxt->op_bytes); |
1499 | if (rc != X86EMUL_CONTINUE) | 1468 | if (rc != X86EMUL_CONTINUE) |
1500 | return rc; | 1469 | return rc; |
1501 | 1470 | ||
1502 | rc = load_segment_descriptor(ctxt, ops, (u16)selector, seg); | 1471 | rc = load_segment_descriptor(ctxt, (u16)selector, seg); |
1503 | return rc; | 1472 | return rc; |
1504 | } | 1473 | } |
1505 | 1474 | ||
1506 | static int em_pusha(struct x86_emulate_ctxt *ctxt) | 1475 | static int em_pusha(struct x86_emulate_ctxt *ctxt) |
1507 | { | 1476 | { |
1508 | struct decode_cache *c = &ctxt->decode; | 1477 | unsigned long old_esp = ctxt->regs[VCPU_REGS_RSP]; |
1509 | unsigned long old_esp = c->regs[VCPU_REGS_RSP]; | ||
1510 | int rc = X86EMUL_CONTINUE; | 1478 | int rc = X86EMUL_CONTINUE; |
1511 | int reg = VCPU_REGS_RAX; | 1479 | int reg = VCPU_REGS_RAX; |
1512 | 1480 | ||
1513 | while (reg <= VCPU_REGS_RDI) { | 1481 | while (reg <= VCPU_REGS_RDI) { |
1514 | (reg == VCPU_REGS_RSP) ? | 1482 | (reg == VCPU_REGS_RSP) ? |
1515 | (c->src.val = old_esp) : (c->src.val = c->regs[reg]); | 1483 | (ctxt->src.val = old_esp) : (ctxt->src.val = ctxt->regs[reg]); |
1516 | 1484 | ||
1517 | rc = em_push(ctxt); | 1485 | rc = em_push(ctxt); |
1518 | if (rc != X86EMUL_CONTINUE) | 1486 | if (rc != X86EMUL_CONTINUE) |
@@ -1526,26 +1494,23 @@ static int em_pusha(struct x86_emulate_ctxt *ctxt) | |||
1526 | 1494 | ||
1527 | static int em_pushf(struct x86_emulate_ctxt *ctxt) | 1495 | static int em_pushf(struct x86_emulate_ctxt *ctxt) |
1528 | { | 1496 | { |
1529 | struct decode_cache *c = &ctxt->decode; | 1497 | ctxt->src.val = (unsigned long)ctxt->eflags; |
1530 | |||
1531 | c->src.val = (unsigned long)ctxt->eflags; | ||
1532 | return em_push(ctxt); | 1498 | return em_push(ctxt); |
1533 | } | 1499 | } |
1534 | 1500 | ||
1535 | static int em_popa(struct x86_emulate_ctxt *ctxt) | 1501 | static int em_popa(struct x86_emulate_ctxt *ctxt) |
1536 | { | 1502 | { |
1537 | struct decode_cache *c = &ctxt->decode; | ||
1538 | int rc = X86EMUL_CONTINUE; | 1503 | int rc = X86EMUL_CONTINUE; |
1539 | int reg = VCPU_REGS_RDI; | 1504 | int reg = VCPU_REGS_RDI; |
1540 | 1505 | ||
1541 | while (reg >= VCPU_REGS_RAX) { | 1506 | while (reg >= VCPU_REGS_RAX) { |
1542 | if (reg == VCPU_REGS_RSP) { | 1507 | if (reg == VCPU_REGS_RSP) { |
1543 | register_address_increment(c, &c->regs[VCPU_REGS_RSP], | 1508 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], |
1544 | c->op_bytes); | 1509 | ctxt->op_bytes); |
1545 | --reg; | 1510 | --reg; |
1546 | } | 1511 | } |
1547 | 1512 | ||
1548 | rc = emulate_pop(ctxt, &c->regs[reg], c->op_bytes); | 1513 | rc = emulate_pop(ctxt, &ctxt->regs[reg], ctxt->op_bytes); |
1549 | if (rc != X86EMUL_CONTINUE) | 1514 | if (rc != X86EMUL_CONTINUE) |
1550 | break; | 1515 | break; |
1551 | --reg; | 1516 | --reg; |
@@ -1553,10 +1518,9 @@ static int em_popa(struct x86_emulate_ctxt *ctxt) | |||
1553 | return rc; | 1518 | return rc; |
1554 | } | 1519 | } |
1555 | 1520 | ||
1556 | int emulate_int_real(struct x86_emulate_ctxt *ctxt, | 1521 | int emulate_int_real(struct x86_emulate_ctxt *ctxt, int irq) |
1557 | struct x86_emulate_ops *ops, int irq) | ||
1558 | { | 1522 | { |
1559 | struct decode_cache *c = &ctxt->decode; | 1523 | struct x86_emulate_ops *ops = ctxt->ops; |
1560 | int rc; | 1524 | int rc; |
1561 | struct desc_ptr dt; | 1525 | struct desc_ptr dt; |
1562 | gva_t cs_addr; | 1526 | gva_t cs_addr; |
@@ -1564,19 +1528,19 @@ int emulate_int_real(struct x86_emulate_ctxt *ctxt, | |||
1564 | u16 cs, eip; | 1528 | u16 cs, eip; |
1565 | 1529 | ||
1566 | /* TODO: Add limit checks */ | 1530 | /* TODO: Add limit checks */ |
1567 | c->src.val = ctxt->eflags; | 1531 | ctxt->src.val = ctxt->eflags; |
1568 | rc = em_push(ctxt); | 1532 | rc = em_push(ctxt); |
1569 | if (rc != X86EMUL_CONTINUE) | 1533 | if (rc != X86EMUL_CONTINUE) |
1570 | return rc; | 1534 | return rc; |
1571 | 1535 | ||
1572 | ctxt->eflags &= ~(EFLG_IF | EFLG_TF | EFLG_AC); | 1536 | ctxt->eflags &= ~(EFLG_IF | EFLG_TF | EFLG_AC); |
1573 | 1537 | ||
1574 | c->src.val = get_segment_selector(ctxt, VCPU_SREG_CS); | 1538 | ctxt->src.val = get_segment_selector(ctxt, VCPU_SREG_CS); |
1575 | rc = em_push(ctxt); | 1539 | rc = em_push(ctxt); |
1576 | if (rc != X86EMUL_CONTINUE) | 1540 | if (rc != X86EMUL_CONTINUE) |
1577 | return rc; | 1541 | return rc; |
1578 | 1542 | ||
1579 | c->src.val = c->eip; | 1543 | ctxt->src.val = ctxt->_eip; |
1580 | rc = em_push(ctxt); | 1544 | rc = em_push(ctxt); |
1581 | if (rc != X86EMUL_CONTINUE) | 1545 | if (rc != X86EMUL_CONTINUE) |
1582 | return rc; | 1546 | return rc; |
@@ -1594,21 +1558,20 @@ int emulate_int_real(struct x86_emulate_ctxt *ctxt, | |||
1594 | if (rc != X86EMUL_CONTINUE) | 1558 | if (rc != X86EMUL_CONTINUE) |
1595 | return rc; | 1559 | return rc; |
1596 | 1560 | ||
1597 | rc = load_segment_descriptor(ctxt, ops, cs, VCPU_SREG_CS); | 1561 | rc = load_segment_descriptor(ctxt, cs, VCPU_SREG_CS); |
1598 | if (rc != X86EMUL_CONTINUE) | 1562 | if (rc != X86EMUL_CONTINUE) |
1599 | return rc; | 1563 | return rc; |
1600 | 1564 | ||
1601 | c->eip = eip; | 1565 | ctxt->_eip = eip; |
1602 | 1566 | ||
1603 | return rc; | 1567 | return rc; |
1604 | } | 1568 | } |
1605 | 1569 | ||
1606 | static int emulate_int(struct x86_emulate_ctxt *ctxt, | 1570 | static int emulate_int(struct x86_emulate_ctxt *ctxt, int irq) |
1607 | struct x86_emulate_ops *ops, int irq) | ||
1608 | { | 1571 | { |
1609 | switch(ctxt->mode) { | 1572 | switch(ctxt->mode) { |
1610 | case X86EMUL_MODE_REAL: | 1573 | case X86EMUL_MODE_REAL: |
1611 | return emulate_int_real(ctxt, ops, irq); | 1574 | return emulate_int_real(ctxt, irq); |
1612 | case X86EMUL_MODE_VM86: | 1575 | case X86EMUL_MODE_VM86: |
1613 | case X86EMUL_MODE_PROT16: | 1576 | case X86EMUL_MODE_PROT16: |
1614 | case X86EMUL_MODE_PROT32: | 1577 | case X86EMUL_MODE_PROT32: |
@@ -1619,10 +1582,8 @@ static int emulate_int(struct x86_emulate_ctxt *ctxt, | |||
1619 | } | 1582 | } |
1620 | } | 1583 | } |
1621 | 1584 | ||
1622 | static int emulate_iret_real(struct x86_emulate_ctxt *ctxt, | 1585 | static int emulate_iret_real(struct x86_emulate_ctxt *ctxt) |
1623 | struct x86_emulate_ops *ops) | ||
1624 | { | 1586 | { |
1625 | struct decode_cache *c = &ctxt->decode; | ||
1626 | int rc = X86EMUL_CONTINUE; | 1587 | int rc = X86EMUL_CONTINUE; |
1627 | unsigned long temp_eip = 0; | 1588 | unsigned long temp_eip = 0; |
1628 | unsigned long temp_eflags = 0; | 1589 | unsigned long temp_eflags = 0; |
@@ -1634,7 +1595,7 @@ static int emulate_iret_real(struct x86_emulate_ctxt *ctxt, | |||
1634 | 1595 | ||
1635 | /* TODO: Add stack limit check */ | 1596 | /* TODO: Add stack limit check */ |
1636 | 1597 | ||
1637 | rc = emulate_pop(ctxt, &temp_eip, c->op_bytes); | 1598 | rc = emulate_pop(ctxt, &temp_eip, ctxt->op_bytes); |
1638 | 1599 | ||
1639 | if (rc != X86EMUL_CONTINUE) | 1600 | if (rc != X86EMUL_CONTINUE) |
1640 | return rc; | 1601 | return rc; |
@@ -1642,27 +1603,27 @@ static int emulate_iret_real(struct x86_emulate_ctxt *ctxt, | |||
1642 | if (temp_eip & ~0xffff) | 1603 | if (temp_eip & ~0xffff) |
1643 | return emulate_gp(ctxt, 0); | 1604 | return emulate_gp(ctxt, 0); |
1644 | 1605 | ||
1645 | rc = emulate_pop(ctxt, &cs, c->op_bytes); | 1606 | rc = emulate_pop(ctxt, &cs, ctxt->op_bytes); |
1646 | 1607 | ||
1647 | if (rc != X86EMUL_CONTINUE) | 1608 | if (rc != X86EMUL_CONTINUE) |
1648 | return rc; | 1609 | return rc; |
1649 | 1610 | ||
1650 | rc = emulate_pop(ctxt, &temp_eflags, c->op_bytes); | 1611 | rc = emulate_pop(ctxt, &temp_eflags, ctxt->op_bytes); |
1651 | 1612 | ||
1652 | if (rc != X86EMUL_CONTINUE) | 1613 | if (rc != X86EMUL_CONTINUE) |
1653 | return rc; | 1614 | return rc; |
1654 | 1615 | ||
1655 | rc = load_segment_descriptor(ctxt, ops, (u16)cs, VCPU_SREG_CS); | 1616 | rc = load_segment_descriptor(ctxt, (u16)cs, VCPU_SREG_CS); |
1656 | 1617 | ||
1657 | if (rc != X86EMUL_CONTINUE) | 1618 | if (rc != X86EMUL_CONTINUE) |
1658 | return rc; | 1619 | return rc; |
1659 | 1620 | ||
1660 | c->eip = temp_eip; | 1621 | ctxt->_eip = temp_eip; |
1661 | 1622 | ||
1662 | 1623 | ||
1663 | if (c->op_bytes == 4) | 1624 | if (ctxt->op_bytes == 4) |
1664 | ctxt->eflags = ((temp_eflags & mask) | (ctxt->eflags & vm86_mask)); | 1625 | ctxt->eflags = ((temp_eflags & mask) | (ctxt->eflags & vm86_mask)); |
1665 | else if (c->op_bytes == 2) { | 1626 | else if (ctxt->op_bytes == 2) { |
1666 | ctxt->eflags &= ~0xffff; | 1627 | ctxt->eflags &= ~0xffff; |
1667 | ctxt->eflags |= temp_eflags; | 1628 | ctxt->eflags |= temp_eflags; |
1668 | } | 1629 | } |
@@ -1673,12 +1634,11 @@ static int emulate_iret_real(struct x86_emulate_ctxt *ctxt, | |||
1673 | return rc; | 1634 | return rc; |
1674 | } | 1635 | } |
1675 | 1636 | ||
1676 | static inline int emulate_iret(struct x86_emulate_ctxt *ctxt, | 1637 | static int em_iret(struct x86_emulate_ctxt *ctxt) |
1677 | struct x86_emulate_ops* ops) | ||
1678 | { | 1638 | { |
1679 | switch(ctxt->mode) { | 1639 | switch(ctxt->mode) { |
1680 | case X86EMUL_MODE_REAL: | 1640 | case X86EMUL_MODE_REAL: |
1681 | return emulate_iret_real(ctxt, ops); | 1641 | return emulate_iret_real(ctxt); |
1682 | case X86EMUL_MODE_VM86: | 1642 | case X86EMUL_MODE_VM86: |
1683 | case X86EMUL_MODE_PROT16: | 1643 | case X86EMUL_MODE_PROT16: |
1684 | case X86EMUL_MODE_PROT32: | 1644 | case X86EMUL_MODE_PROT32: |
@@ -1691,53 +1651,49 @@ static inline int emulate_iret(struct x86_emulate_ctxt *ctxt, | |||
1691 | 1651 | ||
1692 | static int em_jmp_far(struct x86_emulate_ctxt *ctxt) | 1652 | static int em_jmp_far(struct x86_emulate_ctxt *ctxt) |
1693 | { | 1653 | { |
1694 | struct decode_cache *c = &ctxt->decode; | ||
1695 | int rc; | 1654 | int rc; |
1696 | unsigned short sel; | 1655 | unsigned short sel; |
1697 | 1656 | ||
1698 | memcpy(&sel, c->src.valptr + c->op_bytes, 2); | 1657 | memcpy(&sel, ctxt->src.valptr + ctxt->op_bytes, 2); |
1699 | 1658 | ||
1700 | rc = load_segment_descriptor(ctxt, ctxt->ops, sel, VCPU_SREG_CS); | 1659 | rc = load_segment_descriptor(ctxt, sel, VCPU_SREG_CS); |
1701 | if (rc != X86EMUL_CONTINUE) | 1660 | if (rc != X86EMUL_CONTINUE) |
1702 | return rc; | 1661 | return rc; |
1703 | 1662 | ||
1704 | c->eip = 0; | 1663 | ctxt->_eip = 0; |
1705 | memcpy(&c->eip, c->src.valptr, c->op_bytes); | 1664 | memcpy(&ctxt->_eip, ctxt->src.valptr, ctxt->op_bytes); |
1706 | return X86EMUL_CONTINUE; | 1665 | return X86EMUL_CONTINUE; |
1707 | } | 1666 | } |
1708 | 1667 | ||
1709 | static int em_grp1a(struct x86_emulate_ctxt *ctxt) | 1668 | static int em_grp1a(struct x86_emulate_ctxt *ctxt) |
1710 | { | 1669 | { |
1711 | struct decode_cache *c = &ctxt->decode; | 1670 | return emulate_pop(ctxt, &ctxt->dst.val, ctxt->dst.bytes); |
1712 | |||
1713 | return emulate_pop(ctxt, &c->dst.val, c->dst.bytes); | ||
1714 | } | 1671 | } |
1715 | 1672 | ||
1716 | static int em_grp2(struct x86_emulate_ctxt *ctxt) | 1673 | static int em_grp2(struct x86_emulate_ctxt *ctxt) |
1717 | { | 1674 | { |
1718 | struct decode_cache *c = &ctxt->decode; | 1675 | switch (ctxt->modrm_reg) { |
1719 | switch (c->modrm_reg) { | ||
1720 | case 0: /* rol */ | 1676 | case 0: /* rol */ |
1721 | emulate_2op_SrcB("rol", c->src, c->dst, ctxt->eflags); | 1677 | emulate_2op_SrcB("rol", ctxt->src, ctxt->dst, ctxt->eflags); |
1722 | break; | 1678 | break; |
1723 | case 1: /* ror */ | 1679 | case 1: /* ror */ |
1724 | emulate_2op_SrcB("ror", c->src, c->dst, ctxt->eflags); | 1680 | emulate_2op_SrcB("ror", ctxt->src, ctxt->dst, ctxt->eflags); |
1725 | break; | 1681 | break; |
1726 | case 2: /* rcl */ | 1682 | case 2: /* rcl */ |
1727 | emulate_2op_SrcB("rcl", c->src, c->dst, ctxt->eflags); | 1683 | emulate_2op_SrcB("rcl", ctxt->src, ctxt->dst, ctxt->eflags); |
1728 | break; | 1684 | break; |
1729 | case 3: /* rcr */ | 1685 | case 3: /* rcr */ |
1730 | emulate_2op_SrcB("rcr", c->src, c->dst, ctxt->eflags); | 1686 | emulate_2op_SrcB("rcr", ctxt->src, ctxt->dst, ctxt->eflags); |
1731 | break; | 1687 | break; |
1732 | case 4: /* sal/shl */ | 1688 | case 4: /* sal/shl */ |
1733 | case 6: /* sal/shl */ | 1689 | case 6: /* sal/shl */ |
1734 | emulate_2op_SrcB("sal", c->src, c->dst, ctxt->eflags); | 1690 | emulate_2op_SrcB("sal", ctxt->src, ctxt->dst, ctxt->eflags); |
1735 | break; | 1691 | break; |
1736 | case 5: /* shr */ | 1692 | case 5: /* shr */ |
1737 | emulate_2op_SrcB("shr", c->src, c->dst, ctxt->eflags); | 1693 | emulate_2op_SrcB("shr", ctxt->src, ctxt->dst, ctxt->eflags); |
1738 | break; | 1694 | break; |
1739 | case 7: /* sar */ | 1695 | case 7: /* sar */ |
1740 | emulate_2op_SrcB("sar", c->src, c->dst, ctxt->eflags); | 1696 | emulate_2op_SrcB("sar", ctxt->src, ctxt->dst, ctxt->eflags); |
1741 | break; | 1697 | break; |
1742 | } | 1698 | } |
1743 | return X86EMUL_CONTINUE; | 1699 | return X86EMUL_CONTINUE; |
@@ -1745,33 +1701,32 @@ static int em_grp2(struct x86_emulate_ctxt *ctxt) | |||
1745 | 1701 | ||
1746 | static int em_grp3(struct x86_emulate_ctxt *ctxt) | 1702 | static int em_grp3(struct x86_emulate_ctxt *ctxt) |
1747 | { | 1703 | { |
1748 | struct decode_cache *c = &ctxt->decode; | 1704 | unsigned long *rax = &ctxt->regs[VCPU_REGS_RAX]; |
1749 | unsigned long *rax = &c->regs[VCPU_REGS_RAX]; | 1705 | unsigned long *rdx = &ctxt->regs[VCPU_REGS_RDX]; |
1750 | unsigned long *rdx = &c->regs[VCPU_REGS_RDX]; | ||
1751 | u8 de = 0; | 1706 | u8 de = 0; |
1752 | 1707 | ||
1753 | switch (c->modrm_reg) { | 1708 | switch (ctxt->modrm_reg) { |
1754 | case 0 ... 1: /* test */ | 1709 | case 0 ... 1: /* test */ |
1755 | emulate_2op_SrcV("test", c->src, c->dst, ctxt->eflags); | 1710 | emulate_2op_SrcV("test", ctxt->src, ctxt->dst, ctxt->eflags); |
1756 | break; | 1711 | break; |
1757 | case 2: /* not */ | 1712 | case 2: /* not */ |
1758 | c->dst.val = ~c->dst.val; | 1713 | ctxt->dst.val = ~ctxt->dst.val; |
1759 | break; | 1714 | break; |
1760 | case 3: /* neg */ | 1715 | case 3: /* neg */ |
1761 | emulate_1op("neg", c->dst, ctxt->eflags); | 1716 | emulate_1op("neg", ctxt->dst, ctxt->eflags); |
1762 | break; | 1717 | break; |
1763 | case 4: /* mul */ | 1718 | case 4: /* mul */ |
1764 | emulate_1op_rax_rdx("mul", c->src, *rax, *rdx, ctxt->eflags); | 1719 | emulate_1op_rax_rdx("mul", ctxt->src, *rax, *rdx, ctxt->eflags); |
1765 | break; | 1720 | break; |
1766 | case 5: /* imul */ | 1721 | case 5: /* imul */ |
1767 | emulate_1op_rax_rdx("imul", c->src, *rax, *rdx, ctxt->eflags); | 1722 | emulate_1op_rax_rdx("imul", ctxt->src, *rax, *rdx, ctxt->eflags); |
1768 | break; | 1723 | break; |
1769 | case 6: /* div */ | 1724 | case 6: /* div */ |
1770 | emulate_1op_rax_rdx_ex("div", c->src, *rax, *rdx, | 1725 | emulate_1op_rax_rdx_ex("div", ctxt->src, *rax, *rdx, |
1771 | ctxt->eflags, de); | 1726 | ctxt->eflags, de); |
1772 | break; | 1727 | break; |
1773 | case 7: /* idiv */ | 1728 | case 7: /* idiv */ |
1774 | emulate_1op_rax_rdx_ex("idiv", c->src, *rax, *rdx, | 1729 | emulate_1op_rax_rdx_ex("idiv", ctxt->src, *rax, *rdx, |
1775 | ctxt->eflags, de); | 1730 | ctxt->eflags, de); |
1776 | break; | 1731 | break; |
1777 | default: | 1732 | default: |
@@ -1784,26 +1739,25 @@ static int em_grp3(struct x86_emulate_ctxt *ctxt) | |||
1784 | 1739 | ||
1785 | static int em_grp45(struct x86_emulate_ctxt *ctxt) | 1740 | static int em_grp45(struct x86_emulate_ctxt *ctxt) |
1786 | { | 1741 | { |
1787 | struct decode_cache *c = &ctxt->decode; | ||
1788 | int rc = X86EMUL_CONTINUE; | 1742 | int rc = X86EMUL_CONTINUE; |
1789 | 1743 | ||
1790 | switch (c->modrm_reg) { | 1744 | switch (ctxt->modrm_reg) { |
1791 | case 0: /* inc */ | 1745 | case 0: /* inc */ |
1792 | emulate_1op("inc", c->dst, ctxt->eflags); | 1746 | emulate_1op("inc", ctxt->dst, ctxt->eflags); |
1793 | break; | 1747 | break; |
1794 | case 1: /* dec */ | 1748 | case 1: /* dec */ |
1795 | emulate_1op("dec", c->dst, ctxt->eflags); | 1749 | emulate_1op("dec", ctxt->dst, ctxt->eflags); |
1796 | break; | 1750 | break; |
1797 | case 2: /* call near abs */ { | 1751 | case 2: /* call near abs */ { |
1798 | long int old_eip; | 1752 | long int old_eip; |
1799 | old_eip = c->eip; | 1753 | old_eip = ctxt->_eip; |
1800 | c->eip = c->src.val; | 1754 | ctxt->_eip = ctxt->src.val; |
1801 | c->src.val = old_eip; | 1755 | ctxt->src.val = old_eip; |
1802 | rc = em_push(ctxt); | 1756 | rc = em_push(ctxt); |
1803 | break; | 1757 | break; |
1804 | } | 1758 | } |
1805 | case 4: /* jmp abs */ | 1759 | case 4: /* jmp abs */ |
1806 | c->eip = c->src.val; | 1760 | ctxt->_eip = ctxt->src.val; |
1807 | break; | 1761 | break; |
1808 | case 5: /* jmp far */ | 1762 | case 5: /* jmp far */ |
1809 | rc = em_jmp_far(ctxt); | 1763 | rc = em_jmp_far(ctxt); |
@@ -1817,68 +1771,70 @@ static int em_grp45(struct x86_emulate_ctxt *ctxt) | |||
1817 | 1771 | ||
1818 | static int em_grp9(struct x86_emulate_ctxt *ctxt) | 1772 | static int em_grp9(struct x86_emulate_ctxt *ctxt) |
1819 | { | 1773 | { |
1820 | struct decode_cache *c = &ctxt->decode; | 1774 | u64 old = ctxt->dst.orig_val64; |
1821 | u64 old = c->dst.orig_val64; | ||
1822 | 1775 | ||
1823 | if (((u32) (old >> 0) != (u32) c->regs[VCPU_REGS_RAX]) || | 1776 | if (((u32) (old >> 0) != (u32) ctxt->regs[VCPU_REGS_RAX]) || |
1824 | ((u32) (old >> 32) != (u32) c->regs[VCPU_REGS_RDX])) { | 1777 | ((u32) (old >> 32) != (u32) ctxt->regs[VCPU_REGS_RDX])) { |
1825 | c->regs[VCPU_REGS_RAX] = (u32) (old >> 0); | 1778 | ctxt->regs[VCPU_REGS_RAX] = (u32) (old >> 0); |
1826 | c->regs[VCPU_REGS_RDX] = (u32) (old >> 32); | 1779 | ctxt->regs[VCPU_REGS_RDX] = (u32) (old >> 32); |
1827 | ctxt->eflags &= ~EFLG_ZF; | 1780 | ctxt->eflags &= ~EFLG_ZF; |
1828 | } else { | 1781 | } else { |
1829 | c->dst.val64 = ((u64)c->regs[VCPU_REGS_RCX] << 32) | | 1782 | ctxt->dst.val64 = ((u64)ctxt->regs[VCPU_REGS_RCX] << 32) | |
1830 | (u32) c->regs[VCPU_REGS_RBX]; | 1783 | (u32) ctxt->regs[VCPU_REGS_RBX]; |
1831 | 1784 | ||
1832 | ctxt->eflags |= EFLG_ZF; | 1785 | ctxt->eflags |= EFLG_ZF; |
1833 | } | 1786 | } |
1834 | return X86EMUL_CONTINUE; | 1787 | return X86EMUL_CONTINUE; |
1835 | } | 1788 | } |
1836 | 1789 | ||
1837 | static int emulate_ret_far(struct x86_emulate_ctxt *ctxt, | 1790 | static int em_ret(struct x86_emulate_ctxt *ctxt) |
1838 | struct x86_emulate_ops *ops) | 1791 | { |
1792 | ctxt->dst.type = OP_REG; | ||
1793 | ctxt->dst.addr.reg = &ctxt->_eip; | ||
1794 | ctxt->dst.bytes = ctxt->op_bytes; | ||
1795 | return em_pop(ctxt); | ||
1796 | } | ||
1797 | |||
1798 | static int em_ret_far(struct x86_emulate_ctxt *ctxt) | ||
1839 | { | 1799 | { |
1840 | struct decode_cache *c = &ctxt->decode; | ||
1841 | int rc; | 1800 | int rc; |
1842 | unsigned long cs; | 1801 | unsigned long cs; |
1843 | 1802 | ||
1844 | rc = emulate_pop(ctxt, &c->eip, c->op_bytes); | 1803 | rc = emulate_pop(ctxt, &ctxt->_eip, ctxt->op_bytes); |
1845 | if (rc != X86EMUL_CONTINUE) | 1804 | if (rc != X86EMUL_CONTINUE) |
1846 | return rc; | 1805 | return rc; |
1847 | if (c->op_bytes == 4) | 1806 | if (ctxt->op_bytes == 4) |
1848 | c->eip = (u32)c->eip; | 1807 | ctxt->_eip = (u32)ctxt->_eip; |
1849 | rc = emulate_pop(ctxt, &cs, c->op_bytes); | 1808 | rc = emulate_pop(ctxt, &cs, ctxt->op_bytes); |
1850 | if (rc != X86EMUL_CONTINUE) | 1809 | if (rc != X86EMUL_CONTINUE) |
1851 | return rc; | 1810 | return rc; |
1852 | rc = load_segment_descriptor(ctxt, ops, (u16)cs, VCPU_SREG_CS); | 1811 | rc = load_segment_descriptor(ctxt, (u16)cs, VCPU_SREG_CS); |
1853 | return rc; | 1812 | return rc; |
1854 | } | 1813 | } |
1855 | 1814 | ||
1856 | static int emulate_load_segment(struct x86_emulate_ctxt *ctxt, | 1815 | static int emulate_load_segment(struct x86_emulate_ctxt *ctxt, int seg) |
1857 | struct x86_emulate_ops *ops, int seg) | ||
1858 | { | 1816 | { |
1859 | struct decode_cache *c = &ctxt->decode; | ||
1860 | unsigned short sel; | 1817 | unsigned short sel; |
1861 | int rc; | 1818 | int rc; |
1862 | 1819 | ||
1863 | memcpy(&sel, c->src.valptr + c->op_bytes, 2); | 1820 | memcpy(&sel, ctxt->src.valptr + ctxt->op_bytes, 2); |
1864 | 1821 | ||
1865 | rc = load_segment_descriptor(ctxt, ops, sel, seg); | 1822 | rc = load_segment_descriptor(ctxt, sel, seg); |
1866 | if (rc != X86EMUL_CONTINUE) | 1823 | if (rc != X86EMUL_CONTINUE) |
1867 | return rc; | 1824 | return rc; |
1868 | 1825 | ||
1869 | c->dst.val = c->src.val; | 1826 | ctxt->dst.val = ctxt->src.val; |
1870 | return rc; | 1827 | return rc; |
1871 | } | 1828 | } |
1872 | 1829 | ||
1873 | static inline void | 1830 | static void |
1874 | setup_syscalls_segments(struct x86_emulate_ctxt *ctxt, | 1831 | setup_syscalls_segments(struct x86_emulate_ctxt *ctxt, |
1875 | struct x86_emulate_ops *ops, struct desc_struct *cs, | 1832 | struct desc_struct *cs, struct desc_struct *ss) |
1876 | struct desc_struct *ss) | ||
1877 | { | 1833 | { |
1878 | u16 selector; | 1834 | u16 selector; |
1879 | 1835 | ||
1880 | memset(cs, 0, sizeof(struct desc_struct)); | 1836 | memset(cs, 0, sizeof(struct desc_struct)); |
1881 | ops->get_segment(ctxt, &selector, cs, NULL, VCPU_SREG_CS); | 1837 | ctxt->ops->get_segment(ctxt, &selector, cs, NULL, VCPU_SREG_CS); |
1882 | memset(ss, 0, sizeof(struct desc_struct)); | 1838 | memset(ss, 0, sizeof(struct desc_struct)); |
1883 | 1839 | ||
1884 | cs->l = 0; /* will be adjusted later */ | 1840 | cs->l = 0; /* will be adjusted later */ |
@@ -1901,10 +1857,9 @@ setup_syscalls_segments(struct x86_emulate_ctxt *ctxt, | |||
1901 | ss->p = 1; | 1857 | ss->p = 1; |
1902 | } | 1858 | } |
1903 | 1859 | ||
1904 | static int | 1860 | static int em_syscall(struct x86_emulate_ctxt *ctxt) |
1905 | emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | ||
1906 | { | 1861 | { |
1907 | struct decode_cache *c = &ctxt->decode; | 1862 | struct x86_emulate_ops *ops = ctxt->ops; |
1908 | struct desc_struct cs, ss; | 1863 | struct desc_struct cs, ss; |
1909 | u64 msr_data; | 1864 | u64 msr_data; |
1910 | u16 cs_sel, ss_sel; | 1865 | u16 cs_sel, ss_sel; |
@@ -1916,7 +1871,7 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | |||
1916 | return emulate_ud(ctxt); | 1871 | return emulate_ud(ctxt); |
1917 | 1872 | ||
1918 | ops->get_msr(ctxt, MSR_EFER, &efer); | 1873 | ops->get_msr(ctxt, MSR_EFER, &efer); |
1919 | setup_syscalls_segments(ctxt, ops, &cs, &ss); | 1874 | setup_syscalls_segments(ctxt, &cs, &ss); |
1920 | 1875 | ||
1921 | ops->get_msr(ctxt, MSR_STAR, &msr_data); | 1876 | ops->get_msr(ctxt, MSR_STAR, &msr_data); |
1922 | msr_data >>= 32; | 1877 | msr_data >>= 32; |
@@ -1930,15 +1885,15 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | |||
1930 | ops->set_segment(ctxt, cs_sel, &cs, 0, VCPU_SREG_CS); | 1885 | ops->set_segment(ctxt, cs_sel, &cs, 0, VCPU_SREG_CS); |
1931 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); | 1886 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); |
1932 | 1887 | ||
1933 | c->regs[VCPU_REGS_RCX] = c->eip; | 1888 | ctxt->regs[VCPU_REGS_RCX] = ctxt->_eip; |
1934 | if (efer & EFER_LMA) { | 1889 | if (efer & EFER_LMA) { |
1935 | #ifdef CONFIG_X86_64 | 1890 | #ifdef CONFIG_X86_64 |
1936 | c->regs[VCPU_REGS_R11] = ctxt->eflags & ~EFLG_RF; | 1891 | ctxt->regs[VCPU_REGS_R11] = ctxt->eflags & ~EFLG_RF; |
1937 | 1892 | ||
1938 | ops->get_msr(ctxt, | 1893 | ops->get_msr(ctxt, |
1939 | ctxt->mode == X86EMUL_MODE_PROT64 ? | 1894 | ctxt->mode == X86EMUL_MODE_PROT64 ? |
1940 | MSR_LSTAR : MSR_CSTAR, &msr_data); | 1895 | MSR_LSTAR : MSR_CSTAR, &msr_data); |
1941 | c->eip = msr_data; | 1896 | ctxt->_eip = msr_data; |
1942 | 1897 | ||
1943 | ops->get_msr(ctxt, MSR_SYSCALL_MASK, &msr_data); | 1898 | ops->get_msr(ctxt, MSR_SYSCALL_MASK, &msr_data); |
1944 | ctxt->eflags &= ~(msr_data | EFLG_RF); | 1899 | ctxt->eflags &= ~(msr_data | EFLG_RF); |
@@ -1946,7 +1901,7 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | |||
1946 | } else { | 1901 | } else { |
1947 | /* legacy mode */ | 1902 | /* legacy mode */ |
1948 | ops->get_msr(ctxt, MSR_STAR, &msr_data); | 1903 | ops->get_msr(ctxt, MSR_STAR, &msr_data); |
1949 | c->eip = (u32)msr_data; | 1904 | ctxt->_eip = (u32)msr_data; |
1950 | 1905 | ||
1951 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF | EFLG_RF); | 1906 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF | EFLG_RF); |
1952 | } | 1907 | } |
@@ -1954,16 +1909,15 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | |||
1954 | return X86EMUL_CONTINUE; | 1909 | return X86EMUL_CONTINUE; |
1955 | } | 1910 | } |
1956 | 1911 | ||
1957 | static int | 1912 | static int em_sysenter(struct x86_emulate_ctxt *ctxt) |
1958 | emulate_sysenter(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | ||
1959 | { | 1913 | { |
1960 | struct decode_cache *c = &ctxt->decode; | 1914 | struct x86_emulate_ops *ops = ctxt->ops; |
1961 | struct desc_struct cs, ss; | 1915 | struct desc_struct cs, ss; |
1962 | u64 msr_data; | 1916 | u64 msr_data; |
1963 | u16 cs_sel, ss_sel; | 1917 | u16 cs_sel, ss_sel; |
1964 | u64 efer = 0; | 1918 | u64 efer = 0; |
1965 | 1919 | ||
1966 | ctxt->ops->get_msr(ctxt, MSR_EFER, &efer); | 1920 | ops->get_msr(ctxt, MSR_EFER, &efer); |
1967 | /* inject #GP if in real mode */ | 1921 | /* inject #GP if in real mode */ |
1968 | if (ctxt->mode == X86EMUL_MODE_REAL) | 1922 | if (ctxt->mode == X86EMUL_MODE_REAL) |
1969 | return emulate_gp(ctxt, 0); | 1923 | return emulate_gp(ctxt, 0); |
@@ -1974,7 +1928,7 @@ emulate_sysenter(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | |||
1974 | if (ctxt->mode == X86EMUL_MODE_PROT64) | 1928 | if (ctxt->mode == X86EMUL_MODE_PROT64) |
1975 | return emulate_ud(ctxt); | 1929 | return emulate_ud(ctxt); |
1976 | 1930 | ||
1977 | setup_syscalls_segments(ctxt, ops, &cs, &ss); | 1931 | setup_syscalls_segments(ctxt, &cs, &ss); |
1978 | 1932 | ||
1979 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); | 1933 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); |
1980 | switch (ctxt->mode) { | 1934 | switch (ctxt->mode) { |
@@ -2002,31 +1956,30 @@ emulate_sysenter(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | |||
2002 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); | 1956 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); |
2003 | 1957 | ||
2004 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); | 1958 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); |
2005 | c->eip = msr_data; | 1959 | ctxt->_eip = msr_data; |
2006 | 1960 | ||
2007 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); | 1961 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); |
2008 | c->regs[VCPU_REGS_RSP] = msr_data; | 1962 | ctxt->regs[VCPU_REGS_RSP] = msr_data; |
2009 | 1963 | ||
2010 | return X86EMUL_CONTINUE; | 1964 | return X86EMUL_CONTINUE; |
2011 | } | 1965 | } |
2012 | 1966 | ||
2013 | static int | 1967 | static int em_sysexit(struct x86_emulate_ctxt *ctxt) |
2014 | emulate_sysexit(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | ||
2015 | { | 1968 | { |
2016 | struct decode_cache *c = &ctxt->decode; | 1969 | struct x86_emulate_ops *ops = ctxt->ops; |
2017 | struct desc_struct cs, ss; | 1970 | struct desc_struct cs, ss; |
2018 | u64 msr_data; | 1971 | u64 msr_data; |
2019 | int usermode; | 1972 | int usermode; |
2020 | u16 cs_sel, ss_sel; | 1973 | u16 cs_sel = 0, ss_sel = 0; |
2021 | 1974 | ||
2022 | /* inject #GP if in real mode or Virtual 8086 mode */ | 1975 | /* inject #GP if in real mode or Virtual 8086 mode */ |
2023 | if (ctxt->mode == X86EMUL_MODE_REAL || | 1976 | if (ctxt->mode == X86EMUL_MODE_REAL || |
2024 | ctxt->mode == X86EMUL_MODE_VM86) | 1977 | ctxt->mode == X86EMUL_MODE_VM86) |
2025 | return emulate_gp(ctxt, 0); | 1978 | return emulate_gp(ctxt, 0); |
2026 | 1979 | ||
2027 | setup_syscalls_segments(ctxt, ops, &cs, &ss); | 1980 | setup_syscalls_segments(ctxt, &cs, &ss); |
2028 | 1981 | ||
2029 | if ((c->rex_prefix & 0x8) != 0x0) | 1982 | if ((ctxt->rex_prefix & 0x8) != 0x0) |
2030 | usermode = X86EMUL_MODE_PROT64; | 1983 | usermode = X86EMUL_MODE_PROT64; |
2031 | else | 1984 | else |
2032 | usermode = X86EMUL_MODE_PROT32; | 1985 | usermode = X86EMUL_MODE_PROT32; |
@@ -2056,14 +2009,13 @@ emulate_sysexit(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) | |||
2056 | ops->set_segment(ctxt, cs_sel, &cs, 0, VCPU_SREG_CS); | 2009 | ops->set_segment(ctxt, cs_sel, &cs, 0, VCPU_SREG_CS); |
2057 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); | 2010 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); |
2058 | 2011 | ||
2059 | c->eip = c->regs[VCPU_REGS_RDX]; | 2012 | ctxt->_eip = ctxt->regs[VCPU_REGS_RDX]; |
2060 | c->regs[VCPU_REGS_RSP] = c->regs[VCPU_REGS_RCX]; | 2013 | ctxt->regs[VCPU_REGS_RSP] = ctxt->regs[VCPU_REGS_RCX]; |
2061 | 2014 | ||
2062 | return X86EMUL_CONTINUE; | 2015 | return X86EMUL_CONTINUE; |
2063 | } | 2016 | } |
2064 | 2017 | ||
2065 | static bool emulator_bad_iopl(struct x86_emulate_ctxt *ctxt, | 2018 | static bool emulator_bad_iopl(struct x86_emulate_ctxt *ctxt) |
2066 | struct x86_emulate_ops *ops) | ||
2067 | { | 2019 | { |
2068 | int iopl; | 2020 | int iopl; |
2069 | if (ctxt->mode == X86EMUL_MODE_REAL) | 2021 | if (ctxt->mode == X86EMUL_MODE_REAL) |
@@ -2071,13 +2023,13 @@ static bool emulator_bad_iopl(struct x86_emulate_ctxt *ctxt, | |||
2071 | if (ctxt->mode == X86EMUL_MODE_VM86) | 2023 | if (ctxt->mode == X86EMUL_MODE_VM86) |
2072 | return true; | 2024 | return true; |
2073 | iopl = (ctxt->eflags & X86_EFLAGS_IOPL) >> IOPL_SHIFT; | 2025 | iopl = (ctxt->eflags & X86_EFLAGS_IOPL) >> IOPL_SHIFT; |
2074 | return ops->cpl(ctxt) > iopl; | 2026 | return ctxt->ops->cpl(ctxt) > iopl; |
2075 | } | 2027 | } |
2076 | 2028 | ||
2077 | static bool emulator_io_port_access_allowed(struct x86_emulate_ctxt *ctxt, | 2029 | static bool emulator_io_port_access_allowed(struct x86_emulate_ctxt *ctxt, |
2078 | struct x86_emulate_ops *ops, | ||
2079 | u16 port, u16 len) | 2030 | u16 port, u16 len) |
2080 | { | 2031 | { |
2032 | struct x86_emulate_ops *ops = ctxt->ops; | ||
2081 | struct desc_struct tr_seg; | 2033 | struct desc_struct tr_seg; |
2082 | u32 base3; | 2034 | u32 base3; |
2083 | int r; | 2035 | int r; |
@@ -2108,14 +2060,13 @@ static bool emulator_io_port_access_allowed(struct x86_emulate_ctxt *ctxt, | |||
2108 | } | 2060 | } |
2109 | 2061 | ||
2110 | static bool emulator_io_permited(struct x86_emulate_ctxt *ctxt, | 2062 | static bool emulator_io_permited(struct x86_emulate_ctxt *ctxt, |
2111 | struct x86_emulate_ops *ops, | ||
2112 | u16 port, u16 len) | 2063 | u16 port, u16 len) |
2113 | { | 2064 | { |
2114 | if (ctxt->perm_ok) | 2065 | if (ctxt->perm_ok) |
2115 | return true; | 2066 | return true; |
2116 | 2067 | ||
2117 | if (emulator_bad_iopl(ctxt, ops)) | 2068 | if (emulator_bad_iopl(ctxt)) |
2118 | if (!emulator_io_port_access_allowed(ctxt, ops, port, len)) | 2069 | if (!emulator_io_port_access_allowed(ctxt, port, len)) |
2119 | return false; | 2070 | return false; |
2120 | 2071 | ||
2121 | ctxt->perm_ok = true; | 2072 | ctxt->perm_ok = true; |
@@ -2124,21 +2075,18 @@ static bool emulator_io_permited(struct x86_emulate_ctxt *ctxt, | |||
2124 | } | 2075 | } |
2125 | 2076 | ||
2126 | static void save_state_to_tss16(struct x86_emulate_ctxt *ctxt, | 2077 | static void save_state_to_tss16(struct x86_emulate_ctxt *ctxt, |
2127 | struct x86_emulate_ops *ops, | ||
2128 | struct tss_segment_16 *tss) | 2078 | struct tss_segment_16 *tss) |
2129 | { | 2079 | { |
2130 | struct decode_cache *c = &ctxt->decode; | 2080 | tss->ip = ctxt->_eip; |
2131 | |||
2132 | tss->ip = c->eip; | ||
2133 | tss->flag = ctxt->eflags; | 2081 | tss->flag = ctxt->eflags; |
2134 | tss->ax = c->regs[VCPU_REGS_RAX]; | 2082 | tss->ax = ctxt->regs[VCPU_REGS_RAX]; |
2135 | tss->cx = c->regs[VCPU_REGS_RCX]; | 2083 | tss->cx = ctxt->regs[VCPU_REGS_RCX]; |
2136 | tss->dx = c->regs[VCPU_REGS_RDX]; | 2084 | tss->dx = ctxt->regs[VCPU_REGS_RDX]; |
2137 | tss->bx = c->regs[VCPU_REGS_RBX]; | 2085 | tss->bx = ctxt->regs[VCPU_REGS_RBX]; |
2138 | tss->sp = c->regs[VCPU_REGS_RSP]; | 2086 | tss->sp = ctxt->regs[VCPU_REGS_RSP]; |
2139 | tss->bp = c->regs[VCPU_REGS_RBP]; | 2087 | tss->bp = ctxt->regs[VCPU_REGS_RBP]; |
2140 | tss->si = c->regs[VCPU_REGS_RSI]; | 2088 | tss->si = ctxt->regs[VCPU_REGS_RSI]; |
2141 | tss->di = c->regs[VCPU_REGS_RDI]; | 2089 | tss->di = ctxt->regs[VCPU_REGS_RDI]; |
2142 | 2090 | ||
2143 | tss->es = get_segment_selector(ctxt, VCPU_SREG_ES); | 2091 | tss->es = get_segment_selector(ctxt, VCPU_SREG_ES); |
2144 | tss->cs = get_segment_selector(ctxt, VCPU_SREG_CS); | 2092 | tss->cs = get_segment_selector(ctxt, VCPU_SREG_CS); |
@@ -2148,22 +2096,20 @@ static void save_state_to_tss16(struct x86_emulate_ctxt *ctxt, | |||
2148 | } | 2096 | } |
2149 | 2097 | ||
2150 | static int load_state_from_tss16(struct x86_emulate_ctxt *ctxt, | 2098 | static int load_state_from_tss16(struct x86_emulate_ctxt *ctxt, |
2151 | struct x86_emulate_ops *ops, | ||
2152 | struct tss_segment_16 *tss) | 2099 | struct tss_segment_16 *tss) |
2153 | { | 2100 | { |
2154 | struct decode_cache *c = &ctxt->decode; | ||
2155 | int ret; | 2101 | int ret; |
2156 | 2102 | ||
2157 | c->eip = tss->ip; | 2103 | ctxt->_eip = tss->ip; |
2158 | ctxt->eflags = tss->flag | 2; | 2104 | ctxt->eflags = tss->flag | 2; |
2159 | c->regs[VCPU_REGS_RAX] = tss->ax; | 2105 | ctxt->regs[VCPU_REGS_RAX] = tss->ax; |
2160 | c->regs[VCPU_REGS_RCX] = tss->cx; | 2106 | ctxt->regs[VCPU_REGS_RCX] = tss->cx; |
2161 | c->regs[VCPU_REGS_RDX] = tss->dx; | 2107 | ctxt->regs[VCPU_REGS_RDX] = tss->dx; |
2162 | c->regs[VCPU_REGS_RBX] = tss->bx; | 2108 | ctxt->regs[VCPU_REGS_RBX] = tss->bx; |
2163 | c->regs[VCPU_REGS_RSP] = tss->sp; | 2109 | ctxt->regs[VCPU_REGS_RSP] = tss->sp; |
2164 | c->regs[VCPU_REGS_RBP] = tss->bp; | 2110 | ctxt->regs[VCPU_REGS_RBP] = tss->bp; |
2165 | c->regs[VCPU_REGS_RSI] = tss->si; | 2111 | ctxt->regs[VCPU_REGS_RSI] = tss->si; |
2166 | c->regs[VCPU_REGS_RDI] = tss->di; | 2112 | ctxt->regs[VCPU_REGS_RDI] = tss->di; |
2167 | 2113 | ||
2168 | /* | 2114 | /* |
2169 | * SDM says that segment selectors are loaded before segment | 2115 | * SDM says that segment selectors are loaded before segment |
@@ -2179,19 +2125,19 @@ static int load_state_from_tss16(struct x86_emulate_ctxt *ctxt, | |||
2179 | * Now load segment descriptors. If fault happenes at this stage | 2125 | * Now load segment descriptors. If fault happenes at this stage |
2180 | * it is handled in a context of new task | 2126 | * it is handled in a context of new task |
2181 | */ | 2127 | */ |
2182 | ret = load_segment_descriptor(ctxt, ops, tss->ldt, VCPU_SREG_LDTR); | 2128 | ret = load_segment_descriptor(ctxt, tss->ldt, VCPU_SREG_LDTR); |
2183 | if (ret != X86EMUL_CONTINUE) | 2129 | if (ret != X86EMUL_CONTINUE) |
2184 | return ret; | 2130 | return ret; |
2185 | ret = load_segment_descriptor(ctxt, ops, tss->es, VCPU_SREG_ES); | 2131 | ret = load_segment_descriptor(ctxt, tss->es, VCPU_SREG_ES); |
2186 | if (ret != X86EMUL_CONTINUE) | 2132 | if (ret != X86EMUL_CONTINUE) |
2187 | return ret; | 2133 | return ret; |
2188 | ret = load_segment_descriptor(ctxt, ops, tss->cs, VCPU_SREG_CS); | 2134 | ret = load_segment_descriptor(ctxt, tss->cs, VCPU_SREG_CS); |
2189 | if (ret != X86EMUL_CONTINUE) | 2135 | if (ret != X86EMUL_CONTINUE) |
2190 | return ret; | 2136 | return ret; |
2191 | ret = load_segment_descriptor(ctxt, ops, tss->ss, VCPU_SREG_SS); | 2137 | ret = load_segment_descriptor(ctxt, tss->ss, VCPU_SREG_SS); |
2192 | if (ret != X86EMUL_CONTINUE) | 2138 | if (ret != X86EMUL_CONTINUE) |
2193 | return ret; | 2139 | return ret; |
2194 | ret = load_segment_descriptor(ctxt, ops, tss->ds, VCPU_SREG_DS); | 2140 | ret = load_segment_descriptor(ctxt, tss->ds, VCPU_SREG_DS); |
2195 | if (ret != X86EMUL_CONTINUE) | 2141 | if (ret != X86EMUL_CONTINUE) |
2196 | return ret; | 2142 | return ret; |
2197 | 2143 | ||
@@ -2199,10 +2145,10 @@ static int load_state_from_tss16(struct x86_emulate_ctxt *ctxt, | |||
2199 | } | 2145 | } |
2200 | 2146 | ||
2201 | static int task_switch_16(struct x86_emulate_ctxt *ctxt, | 2147 | static int task_switch_16(struct x86_emulate_ctxt *ctxt, |
2202 | struct x86_emulate_ops *ops, | ||
2203 | u16 tss_selector, u16 old_tss_sel, | 2148 | u16 tss_selector, u16 old_tss_sel, |
2204 | ulong old_tss_base, struct desc_struct *new_desc) | 2149 | ulong old_tss_base, struct desc_struct *new_desc) |
2205 | { | 2150 | { |
2151 | struct x86_emulate_ops *ops = ctxt->ops; | ||
2206 | struct tss_segment_16 tss_seg; | 2152 | struct tss_segment_16 tss_seg; |
2207 | int ret; | 2153 | int ret; |
2208 | u32 new_tss_base = get_desc_base(new_desc); | 2154 | u32 new_tss_base = get_desc_base(new_desc); |
@@ -2213,7 +2159,7 @@ static int task_switch_16(struct x86_emulate_ctxt *ctxt, | |||
2213 | /* FIXME: need to provide precise fault address */ | 2159 | /* FIXME: need to provide precise fault address */ |
2214 | return ret; | 2160 | return ret; |
2215 | 2161 | ||
2216 | save_state_to_tss16(ctxt, ops, &tss_seg); | 2162 | save_state_to_tss16(ctxt, &tss_seg); |
2217 | 2163 | ||
2218 | ret = ops->write_std(ctxt, old_tss_base, &tss_seg, sizeof tss_seg, | 2164 | ret = ops->write_std(ctxt, old_tss_base, &tss_seg, sizeof tss_seg, |
2219 | &ctxt->exception); | 2165 | &ctxt->exception); |
@@ -2239,26 +2185,23 @@ static int task_switch_16(struct x86_emulate_ctxt *ctxt, | |||
2239 | return ret; | 2185 | return ret; |
2240 | } | 2186 | } |
2241 | 2187 | ||
2242 | return load_state_from_tss16(ctxt, ops, &tss_seg); | 2188 | return load_state_from_tss16(ctxt, &tss_seg); |
2243 | } | 2189 | } |
2244 | 2190 | ||
2245 | static void save_state_to_tss32(struct x86_emulate_ctxt *ctxt, | 2191 | static void save_state_to_tss32(struct x86_emulate_ctxt *ctxt, |
2246 | struct x86_emulate_ops *ops, | ||
2247 | struct tss_segment_32 *tss) | 2192 | struct tss_segment_32 *tss) |
2248 | { | 2193 | { |
2249 | struct decode_cache *c = &ctxt->decode; | 2194 | tss->cr3 = ctxt->ops->get_cr(ctxt, 3); |
2250 | 2195 | tss->eip = ctxt->_eip; | |
2251 | tss->cr3 = ops->get_cr(ctxt, 3); | ||
2252 | tss->eip = c->eip; | ||
2253 | tss->eflags = ctxt->eflags; | 2196 | tss->eflags = ctxt->eflags; |
2254 | tss->eax = c->regs[VCPU_REGS_RAX]; | 2197 | tss->eax = ctxt->regs[VCPU_REGS_RAX]; |
2255 | tss->ecx = c->regs[VCPU_REGS_RCX]; | 2198 | tss->ecx = ctxt->regs[VCPU_REGS_RCX]; |
2256 | tss->edx = c->regs[VCPU_REGS_RDX]; | 2199 | tss->edx = ctxt->regs[VCPU_REGS_RDX]; |
2257 | tss->ebx = c->regs[VCPU_REGS_RBX]; | 2200 | tss->ebx = ctxt->regs[VCPU_REGS_RBX]; |
2258 | tss->esp = c->regs[VCPU_REGS_RSP]; | 2201 | tss->esp = ctxt->regs[VCPU_REGS_RSP]; |
2259 | tss->ebp = c->regs[VCPU_REGS_RBP]; | 2202 | tss->ebp = ctxt->regs[VCPU_REGS_RBP]; |
2260 | tss->esi = c->regs[VCPU_REGS_RSI]; | 2203 | tss->esi = ctxt->regs[VCPU_REGS_RSI]; |
2261 | tss->edi = c->regs[VCPU_REGS_RDI]; | 2204 | tss->edi = ctxt->regs[VCPU_REGS_RDI]; |
2262 | 2205 | ||
2263 | tss->es = get_segment_selector(ctxt, VCPU_SREG_ES); | 2206 | tss->es = get_segment_selector(ctxt, VCPU_SREG_ES); |
2264 | tss->cs = get_segment_selector(ctxt, VCPU_SREG_CS); | 2207 | tss->cs = get_segment_selector(ctxt, VCPU_SREG_CS); |
@@ -2270,24 +2213,22 @@ static void save_state_to_tss32(struct x86_emulate_ctxt *ctxt, | |||
2270 | } | 2213 | } |
2271 | 2214 | ||
2272 | static int load_state_from_tss32(struct x86_emulate_ctxt *ctxt, | 2215 | static int load_state_from_tss32(struct x86_emulate_ctxt *ctxt, |
2273 | struct x86_emulate_ops *ops, | ||
2274 | struct tss_segment_32 *tss) | 2216 | struct tss_segment_32 *tss) |
2275 | { | 2217 | { |
2276 | struct decode_cache *c = &ctxt->decode; | ||
2277 | int ret; | 2218 | int ret; |
2278 | 2219 | ||
2279 | if (ops->set_cr(ctxt, 3, tss->cr3)) | 2220 | if (ctxt->ops->set_cr(ctxt, 3, tss->cr3)) |
2280 | return emulate_gp(ctxt, 0); | 2221 | return emulate_gp(ctxt, 0); |
2281 | c->eip = tss->eip; | 2222 | ctxt->_eip = tss->eip; |
2282 | ctxt->eflags = tss->eflags | 2; | 2223 | ctxt->eflags = tss->eflags | 2; |
2283 | c->regs[VCPU_REGS_RAX] = tss->eax; | 2224 | ctxt->regs[VCPU_REGS_RAX] = tss->eax; |
2284 | c->regs[VCPU_REGS_RCX] = tss->ecx; | 2225 | ctxt->regs[VCPU_REGS_RCX] = tss->ecx; |
2285 | c->regs[VCPU_REGS_RDX] = tss->edx; | 2226 | ctxt->regs[VCPU_REGS_RDX] = tss->edx; |
2286 | c->regs[VCPU_REGS_RBX] = tss->ebx; | 2227 | ctxt->regs[VCPU_REGS_RBX] = tss->ebx; |
2287 | c->regs[VCPU_REGS_RSP] = tss->esp; | 2228 | ctxt->regs[VCPU_REGS_RSP] = tss->esp; |
2288 | c->regs[VCPU_REGS_RBP] = tss->ebp; | 2229 | ctxt->regs[VCPU_REGS_RBP] = tss->ebp; |
2289 | c->regs[VCPU_REGS_RSI] = tss->esi; | 2230 | ctxt->regs[VCPU_REGS_RSI] = tss->esi; |
2290 | c->regs[VCPU_REGS_RDI] = tss->edi; | 2231 | ctxt->regs[VCPU_REGS_RDI] = tss->edi; |
2291 | 2232 | ||
2292 | /* | 2233 | /* |
2293 | * SDM says that segment selectors are loaded before segment | 2234 | * SDM says that segment selectors are loaded before segment |
@@ -2305,25 +2246,25 @@ static int load_state_from_tss32(struct x86_emulate_ctxt *ctxt, | |||
2305 | * Now load segment descriptors. If fault happenes at this stage | 2246 | * Now load segment descriptors. If fault happenes at this stage |
2306 | * it is handled in a context of new task | 2247 | * it is handled in a context of new task |
2307 | */ | 2248 | */ |
2308 | ret = load_segment_descriptor(ctxt, ops, tss->ldt_selector, VCPU_SREG_LDTR); | 2249 | ret = load_segment_descriptor(ctxt, tss->ldt_selector, VCPU_SREG_LDTR); |
2309 | if (ret != X86EMUL_CONTINUE) | 2250 | if (ret != X86EMUL_CONTINUE) |
2310 | return ret; | 2251 | return ret; |
2311 | ret = load_segment_descriptor(ctxt, ops, tss->es, VCPU_SREG_ES); | 2252 | ret = load_segment_descriptor(ctxt, tss->es, VCPU_SREG_ES); |
2312 | if (ret != X86EMUL_CONTINUE) | 2253 | if (ret != X86EMUL_CONTINUE) |
2313 | return ret; | 2254 | return ret; |
2314 | ret = load_segment_descriptor(ctxt, ops, tss->cs, VCPU_SREG_CS); | 2255 | ret = load_segment_descriptor(ctxt, tss->cs, VCPU_SREG_CS); |
2315 | if (ret != X86EMUL_CONTINUE) | 2256 | if (ret != X86EMUL_CONTINUE) |
2316 | return ret; | 2257 | return ret; |
2317 | ret = load_segment_descriptor(ctxt, ops, tss->ss, VCPU_SREG_SS); | 2258 | ret = load_segment_descriptor(ctxt, tss->ss, VCPU_SREG_SS); |
2318 | if (ret != X86EMUL_CONTINUE) | 2259 | if (ret != X86EMUL_CONTINUE) |
2319 | return ret; | 2260 | return ret; |
2320 | ret = load_segment_descriptor(ctxt, ops, tss->ds, VCPU_SREG_DS); | 2261 | ret = load_segment_descriptor(ctxt, tss->ds, VCPU_SREG_DS); |
2321 | if (ret != X86EMUL_CONTINUE) | 2262 | if (ret != X86EMUL_CONTINUE) |
2322 | return ret; | 2263 | return ret; |
2323 | ret = load_segment_descriptor(ctxt, ops, tss->fs, VCPU_SREG_FS); | 2264 | ret = load_segment_descriptor(ctxt, tss->fs, VCPU_SREG_FS); |
2324 | if (ret != X86EMUL_CONTINUE) | 2265 | if (ret != X86EMUL_CONTINUE) |
2325 | return ret; | 2266 | return ret; |
2326 | ret = load_segment_descriptor(ctxt, ops, tss->gs, VCPU_SREG_GS); | 2267 | ret = load_segment_descriptor(ctxt, tss->gs, VCPU_SREG_GS); |
2327 | if (ret != X86EMUL_CONTINUE) | 2268 | if (ret != X86EMUL_CONTINUE) |
2328 | return ret; | 2269 | return ret; |
2329 | 2270 | ||
@@ -2331,10 +2272,10 @@ static int load_state_from_tss32(struct x86_emulate_ctxt *ctxt, | |||
2331 | } | 2272 | } |
2332 | 2273 | ||
2333 | static int task_switch_32(struct x86_emulate_ctxt *ctxt, | 2274 | static int task_switch_32(struct x86_emulate_ctxt *ctxt, |
2334 | struct x86_emulate_ops *ops, | ||
2335 | u16 tss_selector, u16 old_tss_sel, | 2275 | u16 tss_selector, u16 old_tss_sel, |
2336 | ulong old_tss_base, struct desc_struct *new_desc) | 2276 | ulong old_tss_base, struct desc_struct *new_desc) |
2337 | { | 2277 | { |
2278 | struct x86_emulate_ops *ops = ctxt->ops; | ||
2338 | struct tss_segment_32 tss_seg; | 2279 | struct tss_segment_32 tss_seg; |
2339 | int ret; | 2280 | int ret; |
2340 | u32 new_tss_base = get_desc_base(new_desc); | 2281 | u32 new_tss_base = get_desc_base(new_desc); |
@@ -2345,7 +2286,7 @@ static int task_switch_32(struct x86_emulate_ctxt *ctxt, | |||
2345 | /* FIXME: need to provide precise fault address */ | 2286 | /* FIXME: need to provide precise fault address */ |
2346 | return ret; | 2287 | return ret; |
2347 | 2288 | ||
2348 | save_state_to_tss32(ctxt, ops, &tss_seg); | 2289 | save_state_to_tss32(ctxt, &tss_seg); |
2349 | 2290 | ||
2350 | ret = ops->write_std(ctxt, old_tss_base, &tss_seg, sizeof tss_seg, | 2291 | ret = ops->write_std(ctxt, old_tss_base, &tss_seg, sizeof tss_seg, |
2351 | &ctxt->exception); | 2292 | &ctxt->exception); |
@@ -2371,14 +2312,14 @@ static int task_switch_32(struct x86_emulate_ctxt *ctxt, | |||
2371 | return ret; | 2312 | return ret; |
2372 | } | 2313 | } |
2373 | 2314 | ||
2374 | return load_state_from_tss32(ctxt, ops, &tss_seg); | 2315 | return load_state_from_tss32(ctxt, &tss_seg); |
2375 | } | 2316 | } |
2376 | 2317 | ||
2377 | static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt, | 2318 | static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt, |
2378 | struct x86_emulate_ops *ops, | ||
2379 | u16 tss_selector, int reason, | 2319 | u16 tss_selector, int reason, |
2380 | bool has_error_code, u32 error_code) | 2320 | bool has_error_code, u32 error_code) |
2381 | { | 2321 | { |
2322 | struct x86_emulate_ops *ops = ctxt->ops; | ||
2382 | struct desc_struct curr_tss_desc, next_tss_desc; | 2323 | struct desc_struct curr_tss_desc, next_tss_desc; |
2383 | int ret; | 2324 | int ret; |
2384 | u16 old_tss_sel = get_segment_selector(ctxt, VCPU_SREG_TR); | 2325 | u16 old_tss_sel = get_segment_selector(ctxt, VCPU_SREG_TR); |
@@ -2388,10 +2329,10 @@ static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt, | |||
2388 | 2329 | ||
2389 | /* FIXME: old_tss_base == ~0 ? */ | 2330 | /* FIXME: old_tss_base == ~0 ? */ |
2390 | 2331 | ||
2391 | ret = read_segment_descriptor(ctxt, ops, tss_selector, &next_tss_desc); | 2332 | ret = read_segment_descriptor(ctxt, tss_selector, &next_tss_desc); |
2392 | if (ret != X86EMUL_CONTINUE) | 2333 | if (ret != X86EMUL_CONTINUE) |
2393 | return ret; | 2334 | return ret; |
2394 | ret = read_segment_descriptor(ctxt, ops, old_tss_sel, &curr_tss_desc); | 2335 | ret = read_segment_descriptor(ctxt, old_tss_sel, &curr_tss_desc); |
2395 | if (ret != X86EMUL_CONTINUE) | 2336 | if (ret != X86EMUL_CONTINUE) |
2396 | return ret; | 2337 | return ret; |
2397 | 2338 | ||
@@ -2413,8 +2354,7 @@ static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt, | |||
2413 | 2354 | ||
2414 | if (reason == TASK_SWITCH_IRET || reason == TASK_SWITCH_JMP) { | 2355 | if (reason == TASK_SWITCH_IRET || reason == TASK_SWITCH_JMP) { |
2415 | curr_tss_desc.type &= ~(1 << 1); /* clear busy flag */ | 2356 | curr_tss_desc.type &= ~(1 << 1); /* clear busy flag */ |
2416 | write_segment_descriptor(ctxt, ops, old_tss_sel, | 2357 | write_segment_descriptor(ctxt, old_tss_sel, &curr_tss_desc); |
2417 | &curr_tss_desc); | ||
2418 | } | 2358 | } |
2419 | 2359 | ||
2420 | if (reason == TASK_SWITCH_IRET) | 2360 | if (reason == TASK_SWITCH_IRET) |
@@ -2426,10 +2366,10 @@ static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt, | |||
2426 | old_tss_sel = 0xffff; | 2366 | old_tss_sel = 0xffff; |
2427 | 2367 | ||
2428 | if (next_tss_desc.type & 8) | 2368 | if (next_tss_desc.type & 8) |
2429 | ret = task_switch_32(ctxt, ops, tss_selector, old_tss_sel, | 2369 | ret = task_switch_32(ctxt, tss_selector, old_tss_sel, |
2430 | old_tss_base, &next_tss_desc); | 2370 | old_tss_base, &next_tss_desc); |
2431 | else | 2371 | else |
2432 | ret = task_switch_16(ctxt, ops, tss_selector, old_tss_sel, | 2372 | ret = task_switch_16(ctxt, tss_selector, old_tss_sel, |
2433 | old_tss_base, &next_tss_desc); | 2373 | old_tss_base, &next_tss_desc); |
2434 | if (ret != X86EMUL_CONTINUE) | 2374 | if (ret != X86EMUL_CONTINUE) |
2435 | return ret; | 2375 | return ret; |
@@ -2439,19 +2379,16 @@ static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt, | |||
2439 | 2379 | ||
2440 | if (reason != TASK_SWITCH_IRET) { | 2380 | if (reason != TASK_SWITCH_IRET) { |
2441 | next_tss_desc.type |= (1 << 1); /* set busy flag */ | 2381 | next_tss_desc.type |= (1 << 1); /* set busy flag */ |
2442 | write_segment_descriptor(ctxt, ops, tss_selector, | 2382 | write_segment_descriptor(ctxt, tss_selector, &next_tss_desc); |
2443 | &next_tss_desc); | ||
2444 | } | 2383 | } |
2445 | 2384 | ||
2446 | ops->set_cr(ctxt, 0, ops->get_cr(ctxt, 0) | X86_CR0_TS); | 2385 | ops->set_cr(ctxt, 0, ops->get_cr(ctxt, 0) | X86_CR0_TS); |
2447 | ops->set_segment(ctxt, tss_selector, &next_tss_desc, 0, VCPU_SREG_TR); | 2386 | ops->set_segment(ctxt, tss_selector, &next_tss_desc, 0, VCPU_SREG_TR); |
2448 | 2387 | ||
2449 | if (has_error_code) { | 2388 | if (has_error_code) { |
2450 | struct decode_cache *c = &ctxt->decode; | 2389 | ctxt->op_bytes = ctxt->ad_bytes = (next_tss_desc.type & 8) ? 4 : 2; |
2451 | 2390 | ctxt->lock_prefix = 0; | |
2452 | c->op_bytes = c->ad_bytes = (next_tss_desc.type & 8) ? 4 : 2; | 2391 | ctxt->src.val = (unsigned long) error_code; |
2453 | c->lock_prefix = 0; | ||
2454 | c->src.val = (unsigned long) error_code; | ||
2455 | ret = em_push(ctxt); | 2392 | ret = em_push(ctxt); |
2456 | } | 2393 | } |
2457 | 2394 | ||
@@ -2462,18 +2399,16 @@ int emulator_task_switch(struct x86_emulate_ctxt *ctxt, | |||
2462 | u16 tss_selector, int reason, | 2399 | u16 tss_selector, int reason, |
2463 | bool has_error_code, u32 error_code) | 2400 | bool has_error_code, u32 error_code) |
2464 | { | 2401 | { |
2465 | struct x86_emulate_ops *ops = ctxt->ops; | ||
2466 | struct decode_cache *c = &ctxt->decode; | ||
2467 | int rc; | 2402 | int rc; |
2468 | 2403 | ||
2469 | c->eip = ctxt->eip; | 2404 | ctxt->_eip = ctxt->eip; |
2470 | c->dst.type = OP_NONE; | 2405 | ctxt->dst.type = OP_NONE; |
2471 | 2406 | ||
2472 | rc = emulator_do_task_switch(ctxt, ops, tss_selector, reason, | 2407 | rc = emulator_do_task_switch(ctxt, tss_selector, reason, |
2473 | has_error_code, error_code); | 2408 | has_error_code, error_code); |
2474 | 2409 | ||
2475 | if (rc == X86EMUL_CONTINUE) | 2410 | if (rc == X86EMUL_CONTINUE) |
2476 | ctxt->eip = c->eip; | 2411 | ctxt->eip = ctxt->_eip; |
2477 | 2412 | ||
2478 | return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; | 2413 | return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; |
2479 | } | 2414 | } |
@@ -2481,22 +2416,20 @@ int emulator_task_switch(struct x86_emulate_ctxt *ctxt, | |||
2481 | static void string_addr_inc(struct x86_emulate_ctxt *ctxt, unsigned seg, | 2416 | static void string_addr_inc(struct x86_emulate_ctxt *ctxt, unsigned seg, |
2482 | int reg, struct operand *op) | 2417 | int reg, struct operand *op) |
2483 | { | 2418 | { |
2484 | struct decode_cache *c = &ctxt->decode; | ||
2485 | int df = (ctxt->eflags & EFLG_DF) ? -1 : 1; | 2419 | int df = (ctxt->eflags & EFLG_DF) ? -1 : 1; |
2486 | 2420 | ||
2487 | register_address_increment(c, &c->regs[reg], df * op->bytes); | 2421 | register_address_increment(ctxt, &ctxt->regs[reg], df * op->bytes); |
2488 | op->addr.mem.ea = register_address(c, c->regs[reg]); | 2422 | op->addr.mem.ea = register_address(ctxt, ctxt->regs[reg]); |
2489 | op->addr.mem.seg = seg; | 2423 | op->addr.mem.seg = seg; |
2490 | } | 2424 | } |
2491 | 2425 | ||
2492 | static int em_das(struct x86_emulate_ctxt *ctxt) | 2426 | static int em_das(struct x86_emulate_ctxt *ctxt) |
2493 | { | 2427 | { |
2494 | struct decode_cache *c = &ctxt->decode; | ||
2495 | u8 al, old_al; | 2428 | u8 al, old_al; |
2496 | bool af, cf, old_cf; | 2429 | bool af, cf, old_cf; |
2497 | 2430 | ||
2498 | cf = ctxt->eflags & X86_EFLAGS_CF; | 2431 | cf = ctxt->eflags & X86_EFLAGS_CF; |
2499 | al = c->dst.val; | 2432 | al = ctxt->dst.val; |
2500 | 2433 | ||
2501 | old_al = al; | 2434 | old_al = al; |
2502 | old_cf = cf; | 2435 | old_cf = cf; |
@@ -2514,12 +2447,12 @@ static int em_das(struct x86_emulate_ctxt *ctxt) | |||
2514 | cf = true; | 2447 | cf = true; |
2515 | } | 2448 | } |
2516 | 2449 | ||
2517 | c->dst.val = al; | 2450 | ctxt->dst.val = al; |
2518 | /* Set PF, ZF, SF */ | 2451 | /* Set PF, ZF, SF */ |
2519 | c->src.type = OP_IMM; | 2452 | ctxt->src.type = OP_IMM; |
2520 | c->src.val = 0; | 2453 | ctxt->src.val = 0; |
2521 | c->src.bytes = 1; | 2454 | ctxt->src.bytes = 1; |
2522 | emulate_2op_SrcV("or", c->src, c->dst, ctxt->eflags); | 2455 | emulate_2op_SrcV("or", ctxt->src, ctxt->dst, ctxt->eflags); |
2523 | ctxt->eflags &= ~(X86_EFLAGS_AF | X86_EFLAGS_CF); | 2456 | ctxt->eflags &= ~(X86_EFLAGS_AF | X86_EFLAGS_CF); |
2524 | if (cf) | 2457 | if (cf) |
2525 | ctxt->eflags |= X86_EFLAGS_CF; | 2458 | ctxt->eflags |= X86_EFLAGS_CF; |
@@ -2530,175 +2463,189 @@ static int em_das(struct x86_emulate_ctxt *ctxt) | |||
2530 | 2463 | ||
2531 | static int em_call_far(struct x86_emulate_ctxt *ctxt) | 2464 | static int em_call_far(struct x86_emulate_ctxt *ctxt) |
2532 | { | 2465 | { |
2533 | struct decode_cache *c = &ctxt->decode; | ||
2534 | u16 sel, old_cs; | 2466 | u16 sel, old_cs; |
2535 | ulong old_eip; | 2467 | ulong old_eip; |
2536 | int rc; | 2468 | int rc; |
2537 | 2469 | ||
2538 | old_cs = get_segment_selector(ctxt, VCPU_SREG_CS); | 2470 | old_cs = get_segment_selector(ctxt, VCPU_SREG_CS); |
2539 | old_eip = c->eip; | 2471 | old_eip = ctxt->_eip; |
2540 | 2472 | ||
2541 | memcpy(&sel, c->src.valptr + c->op_bytes, 2); | 2473 | memcpy(&sel, ctxt->src.valptr + ctxt->op_bytes, 2); |
2542 | if (load_segment_descriptor(ctxt, ctxt->ops, sel, VCPU_SREG_CS)) | 2474 | if (load_segment_descriptor(ctxt, sel, VCPU_SREG_CS)) |
2543 | return X86EMUL_CONTINUE; | 2475 | return X86EMUL_CONTINUE; |
2544 | 2476 | ||
2545 | c->eip = 0; | 2477 | ctxt->_eip = 0; |
2546 | memcpy(&c->eip, c->src.valptr, c->op_bytes); | 2478 | memcpy(&ctxt->_eip, ctxt->src.valptr, ctxt->op_bytes); |
2547 | 2479 | ||
2548 | c->src.val = old_cs; | 2480 | ctxt->src.val = old_cs; |
2549 | rc = em_push(ctxt); | 2481 | rc = em_push(ctxt); |
2550 | if (rc != X86EMUL_CONTINUE) | 2482 | if (rc != X86EMUL_CONTINUE) |
2551 | return rc; | 2483 | return rc; |
2552 | 2484 | ||
2553 | c->src.val = old_eip; | 2485 | ctxt->src.val = old_eip; |
2554 | return em_push(ctxt); | 2486 | return em_push(ctxt); |
2555 | } | 2487 | } |
2556 | 2488 | ||
2557 | static int em_ret_near_imm(struct x86_emulate_ctxt *ctxt) | 2489 | static int em_ret_near_imm(struct x86_emulate_ctxt *ctxt) |
2558 | { | 2490 | { |
2559 | struct decode_cache *c = &ctxt->decode; | ||
2560 | int rc; | 2491 | int rc; |
2561 | 2492 | ||
2562 | c->dst.type = OP_REG; | 2493 | ctxt->dst.type = OP_REG; |
2563 | c->dst.addr.reg = &c->eip; | 2494 | ctxt->dst.addr.reg = &ctxt->_eip; |
2564 | c->dst.bytes = c->op_bytes; | 2495 | ctxt->dst.bytes = ctxt->op_bytes; |
2565 | rc = emulate_pop(ctxt, &c->dst.val, c->op_bytes); | 2496 | rc = emulate_pop(ctxt, &ctxt->dst.val, ctxt->op_bytes); |
2566 | if (rc != X86EMUL_CONTINUE) | 2497 | if (rc != X86EMUL_CONTINUE) |
2567 | return rc; | 2498 | return rc; |
2568 | register_address_increment(c, &c->regs[VCPU_REGS_RSP], c->src.val); | 2499 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], ctxt->src.val); |
2569 | return X86EMUL_CONTINUE; | 2500 | return X86EMUL_CONTINUE; |
2570 | } | 2501 | } |
2571 | 2502 | ||
2572 | static int em_add(struct x86_emulate_ctxt *ctxt) | 2503 | static int em_add(struct x86_emulate_ctxt *ctxt) |
2573 | { | 2504 | { |
2574 | struct decode_cache *c = &ctxt->decode; | 2505 | emulate_2op_SrcV("add", ctxt->src, ctxt->dst, ctxt->eflags); |
2575 | |||
2576 | emulate_2op_SrcV("add", c->src, c->dst, ctxt->eflags); | ||
2577 | return X86EMUL_CONTINUE; | 2506 | return X86EMUL_CONTINUE; |
2578 | } | 2507 | } |
2579 | 2508 | ||
2580 | static int em_or(struct x86_emulate_ctxt *ctxt) | 2509 | static int em_or(struct x86_emulate_ctxt *ctxt) |
2581 | { | 2510 | { |
2582 | struct decode_cache *c = &ctxt->decode; | 2511 | emulate_2op_SrcV("or", ctxt->src, ctxt->dst, ctxt->eflags); |
2583 | |||
2584 | emulate_2op_SrcV("or", c->src, c->dst, ctxt->eflags); | ||
2585 | return X86EMUL_CONTINUE; | 2512 | return X86EMUL_CONTINUE; |
2586 | } | 2513 | } |
2587 | 2514 | ||
2588 | static int em_adc(struct x86_emulate_ctxt *ctxt) | 2515 | static int em_adc(struct x86_emulate_ctxt *ctxt) |
2589 | { | 2516 | { |
2590 | struct decode_cache *c = &ctxt->decode; | 2517 | emulate_2op_SrcV("adc", ctxt->src, ctxt->dst, ctxt->eflags); |
2591 | |||
2592 | emulate_2op_SrcV("adc", c->src, c->dst, ctxt->eflags); | ||
2593 | return X86EMUL_CONTINUE; | 2518 | return X86EMUL_CONTINUE; |
2594 | } | 2519 | } |
2595 | 2520 | ||
2596 | static int em_sbb(struct x86_emulate_ctxt *ctxt) | 2521 | static int em_sbb(struct x86_emulate_ctxt *ctxt) |
2597 | { | 2522 | { |
2598 | struct decode_cache *c = &ctxt->decode; | 2523 | emulate_2op_SrcV("sbb", ctxt->src, ctxt->dst, ctxt->eflags); |
2599 | |||
2600 | emulate_2op_SrcV("sbb", c->src, c->dst, ctxt->eflags); | ||
2601 | return X86EMUL_CONTINUE; | 2524 | return X86EMUL_CONTINUE; |
2602 | } | 2525 | } |
2603 | 2526 | ||
2604 | static int em_and(struct x86_emulate_ctxt *ctxt) | 2527 | static int em_and(struct x86_emulate_ctxt *ctxt) |
2605 | { | 2528 | { |
2606 | struct decode_cache *c = &ctxt->decode; | 2529 | emulate_2op_SrcV("and", ctxt->src, ctxt->dst, ctxt->eflags); |
2607 | |||
2608 | emulate_2op_SrcV("and", c->src, c->dst, ctxt->eflags); | ||
2609 | return X86EMUL_CONTINUE; | 2530 | return X86EMUL_CONTINUE; |
2610 | } | 2531 | } |
2611 | 2532 | ||
2612 | static int em_sub(struct x86_emulate_ctxt *ctxt) | 2533 | static int em_sub(struct x86_emulate_ctxt *ctxt) |
2613 | { | 2534 | { |
2614 | struct decode_cache *c = &ctxt->decode; | 2535 | emulate_2op_SrcV("sub", ctxt->src, ctxt->dst, ctxt->eflags); |
2615 | |||
2616 | emulate_2op_SrcV("sub", c->src, c->dst, ctxt->eflags); | ||
2617 | return X86EMUL_CONTINUE; | 2536 | return X86EMUL_CONTINUE; |
2618 | } | 2537 | } |
2619 | 2538 | ||
2620 | static int em_xor(struct x86_emulate_ctxt *ctxt) | 2539 | static int em_xor(struct x86_emulate_ctxt *ctxt) |
2621 | { | 2540 | { |
2622 | struct decode_cache *c = &ctxt->decode; | 2541 | emulate_2op_SrcV("xor", ctxt->src, ctxt->dst, ctxt->eflags); |
2623 | |||
2624 | emulate_2op_SrcV("xor", c->src, c->dst, ctxt->eflags); | ||
2625 | return X86EMUL_CONTINUE; | 2542 | return X86EMUL_CONTINUE; |
2626 | } | 2543 | } |
2627 | 2544 | ||
2628 | static int em_cmp(struct x86_emulate_ctxt *ctxt) | 2545 | static int em_cmp(struct x86_emulate_ctxt *ctxt) |
2629 | { | 2546 | { |
2630 | struct decode_cache *c = &ctxt->decode; | 2547 | emulate_2op_SrcV("cmp", ctxt->src, ctxt->dst, ctxt->eflags); |
2631 | |||
2632 | emulate_2op_SrcV("cmp", c->src, c->dst, ctxt->eflags); | ||
2633 | /* Disable writeback. */ | 2548 | /* Disable writeback. */ |
2634 | c->dst.type = OP_NONE; | 2549 | ctxt->dst.type = OP_NONE; |
2635 | return X86EMUL_CONTINUE; | 2550 | return X86EMUL_CONTINUE; |
2636 | } | 2551 | } |
2637 | 2552 | ||
2638 | static int em_imul(struct x86_emulate_ctxt *ctxt) | 2553 | static int em_test(struct x86_emulate_ctxt *ctxt) |
2554 | { | ||
2555 | emulate_2op_SrcV("test", ctxt->src, ctxt->dst, ctxt->eflags); | ||
2556 | return X86EMUL_CONTINUE; | ||
2557 | } | ||
2558 | |||
2559 | static int em_xchg(struct x86_emulate_ctxt *ctxt) | ||
2639 | { | 2560 | { |
2640 | struct decode_cache *c = &ctxt->decode; | 2561 | /* Write back the register source. */ |
2562 | ctxt->src.val = ctxt->dst.val; | ||
2563 | write_register_operand(&ctxt->src); | ||
2641 | 2564 | ||
2642 | emulate_2op_SrcV_nobyte("imul", c->src, c->dst, ctxt->eflags); | 2565 | /* Write back the memory destination with implicit LOCK prefix. */ |
2566 | ctxt->dst.val = ctxt->src.orig_val; | ||
2567 | ctxt->lock_prefix = 1; | ||
2643 | return X86EMUL_CONTINUE; | 2568 | return X86EMUL_CONTINUE; |
2644 | } | 2569 | } |
2645 | 2570 | ||
2646 | static int em_imul_3op(struct x86_emulate_ctxt *ctxt) | 2571 | static int em_imul(struct x86_emulate_ctxt *ctxt) |
2647 | { | 2572 | { |
2648 | struct decode_cache *c = &ctxt->decode; | 2573 | emulate_2op_SrcV_nobyte("imul", ctxt->src, ctxt->dst, ctxt->eflags); |
2574 | return X86EMUL_CONTINUE; | ||
2575 | } | ||
2649 | 2576 | ||
2650 | c->dst.val = c->src2.val; | 2577 | static int em_imul_3op(struct x86_emulate_ctxt *ctxt) |
2578 | { | ||
2579 | ctxt->dst.val = ctxt->src2.val; | ||
2651 | return em_imul(ctxt); | 2580 | return em_imul(ctxt); |
2652 | } | 2581 | } |
2653 | 2582 | ||
2654 | static int em_cwd(struct x86_emulate_ctxt *ctxt) | 2583 | static int em_cwd(struct x86_emulate_ctxt *ctxt) |
2655 | { | 2584 | { |
2656 | struct decode_cache *c = &ctxt->decode; | 2585 | ctxt->dst.type = OP_REG; |
2657 | 2586 | ctxt->dst.bytes = ctxt->src.bytes; | |
2658 | c->dst.type = OP_REG; | 2587 | ctxt->dst.addr.reg = &ctxt->regs[VCPU_REGS_RDX]; |
2659 | c->dst.bytes = c->src.bytes; | 2588 | ctxt->dst.val = ~((ctxt->src.val >> (ctxt->src.bytes * 8 - 1)) - 1); |
2660 | c->dst.addr.reg = &c->regs[VCPU_REGS_RDX]; | ||
2661 | c->dst.val = ~((c->src.val >> (c->src.bytes * 8 - 1)) - 1); | ||
2662 | 2589 | ||
2663 | return X86EMUL_CONTINUE; | 2590 | return X86EMUL_CONTINUE; |
2664 | } | 2591 | } |
2665 | 2592 | ||
2666 | static int em_rdtsc(struct x86_emulate_ctxt *ctxt) | 2593 | static int em_rdtsc(struct x86_emulate_ctxt *ctxt) |
2667 | { | 2594 | { |
2668 | struct decode_cache *c = &ctxt->decode; | ||
2669 | u64 tsc = 0; | 2595 | u64 tsc = 0; |
2670 | 2596 | ||
2671 | ctxt->ops->get_msr(ctxt, MSR_IA32_TSC, &tsc); | 2597 | ctxt->ops->get_msr(ctxt, MSR_IA32_TSC, &tsc); |
2672 | c->regs[VCPU_REGS_RAX] = (u32)tsc; | 2598 | ctxt->regs[VCPU_REGS_RAX] = (u32)tsc; |
2673 | c->regs[VCPU_REGS_RDX] = tsc >> 32; | 2599 | ctxt->regs[VCPU_REGS_RDX] = tsc >> 32; |
2674 | return X86EMUL_CONTINUE; | 2600 | return X86EMUL_CONTINUE; |
2675 | } | 2601 | } |
2676 | 2602 | ||
2677 | static int em_mov(struct x86_emulate_ctxt *ctxt) | 2603 | static int em_mov(struct x86_emulate_ctxt *ctxt) |
2678 | { | 2604 | { |
2679 | struct decode_cache *c = &ctxt->decode; | 2605 | ctxt->dst.val = ctxt->src.val; |
2680 | c->dst.val = c->src.val; | ||
2681 | return X86EMUL_CONTINUE; | 2606 | return X86EMUL_CONTINUE; |
2682 | } | 2607 | } |
2683 | 2608 | ||
2609 | static int em_mov_rm_sreg(struct x86_emulate_ctxt *ctxt) | ||
2610 | { | ||
2611 | if (ctxt->modrm_reg > VCPU_SREG_GS) | ||
2612 | return emulate_ud(ctxt); | ||
2613 | |||
2614 | ctxt->dst.val = get_segment_selector(ctxt, ctxt->modrm_reg); | ||
2615 | return X86EMUL_CONTINUE; | ||
2616 | } | ||
2617 | |||
2618 | static int em_mov_sreg_rm(struct x86_emulate_ctxt *ctxt) | ||
2619 | { | ||
2620 | u16 sel = ctxt->src.val; | ||
2621 | |||
2622 | if (ctxt->modrm_reg == VCPU_SREG_CS || ctxt->modrm_reg > VCPU_SREG_GS) | ||
2623 | return emulate_ud(ctxt); | ||
2624 | |||
2625 | if (ctxt->modrm_reg == VCPU_SREG_SS) | ||
2626 | ctxt->interruptibility = KVM_X86_SHADOW_INT_MOV_SS; | ||
2627 | |||
2628 | /* Disable writeback. */ | ||
2629 | ctxt->dst.type = OP_NONE; | ||
2630 | return load_segment_descriptor(ctxt, sel, ctxt->modrm_reg); | ||
2631 | } | ||
2632 | |||
2684 | static int em_movdqu(struct x86_emulate_ctxt *ctxt) | 2633 | static int em_movdqu(struct x86_emulate_ctxt *ctxt) |
2685 | { | 2634 | { |
2686 | struct decode_cache *c = &ctxt->decode; | 2635 | memcpy(&ctxt->dst.vec_val, &ctxt->src.vec_val, ctxt->op_bytes); |
2687 | memcpy(&c->dst.vec_val, &c->src.vec_val, c->op_bytes); | ||
2688 | return X86EMUL_CONTINUE; | 2636 | return X86EMUL_CONTINUE; |
2689 | } | 2637 | } |
2690 | 2638 | ||
2691 | static int em_invlpg(struct x86_emulate_ctxt *ctxt) | 2639 | static int em_invlpg(struct x86_emulate_ctxt *ctxt) |
2692 | { | 2640 | { |
2693 | struct decode_cache *c = &ctxt->decode; | ||
2694 | int rc; | 2641 | int rc; |
2695 | ulong linear; | 2642 | ulong linear; |
2696 | 2643 | ||
2697 | rc = linearize(ctxt, c->src.addr.mem, 1, false, &linear); | 2644 | rc = linearize(ctxt, ctxt->src.addr.mem, 1, false, &linear); |
2698 | if (rc == X86EMUL_CONTINUE) | 2645 | if (rc == X86EMUL_CONTINUE) |
2699 | ctxt->ops->invlpg(ctxt, linear); | 2646 | ctxt->ops->invlpg(ctxt, linear); |
2700 | /* Disable writeback. */ | 2647 | /* Disable writeback. */ |
2701 | c->dst.type = OP_NONE; | 2648 | ctxt->dst.type = OP_NONE; |
2702 | return X86EMUL_CONTINUE; | 2649 | return X86EMUL_CONTINUE; |
2703 | } | 2650 | } |
2704 | 2651 | ||
@@ -2714,10 +2661,9 @@ static int em_clts(struct x86_emulate_ctxt *ctxt) | |||
2714 | 2661 | ||
2715 | static int em_vmcall(struct x86_emulate_ctxt *ctxt) | 2662 | static int em_vmcall(struct x86_emulate_ctxt *ctxt) |
2716 | { | 2663 | { |
2717 | struct decode_cache *c = &ctxt->decode; | ||
2718 | int rc; | 2664 | int rc; |
2719 | 2665 | ||
2720 | if (c->modrm_mod != 3 || c->modrm_rm != 1) | 2666 | if (ctxt->modrm_mod != 3 || ctxt->modrm_rm != 1) |
2721 | return X86EMUL_UNHANDLEABLE; | 2667 | return X86EMUL_UNHANDLEABLE; |
2722 | 2668 | ||
2723 | rc = ctxt->ops->fix_hypercall(ctxt); | 2669 | rc = ctxt->ops->fix_hypercall(ctxt); |
@@ -2725,73 +2671,104 @@ static int em_vmcall(struct x86_emulate_ctxt *ctxt) | |||
2725 | return rc; | 2671 | return rc; |
2726 | 2672 | ||
2727 | /* Let the processor re-execute the fixed hypercall */ | 2673 | /* Let the processor re-execute the fixed hypercall */ |
2728 | c->eip = ctxt->eip; | 2674 | ctxt->_eip = ctxt->eip; |
2729 | /* Disable writeback. */ | 2675 | /* Disable writeback. */ |
2730 | c->dst.type = OP_NONE; | 2676 | ctxt->dst.type = OP_NONE; |
2731 | return X86EMUL_CONTINUE; | 2677 | return X86EMUL_CONTINUE; |
2732 | } | 2678 | } |
2733 | 2679 | ||
2734 | static int em_lgdt(struct x86_emulate_ctxt *ctxt) | 2680 | static int em_lgdt(struct x86_emulate_ctxt *ctxt) |
2735 | { | 2681 | { |
2736 | struct decode_cache *c = &ctxt->decode; | ||
2737 | struct desc_ptr desc_ptr; | 2682 | struct desc_ptr desc_ptr; |
2738 | int rc; | 2683 | int rc; |
2739 | 2684 | ||
2740 | rc = read_descriptor(ctxt, c->src.addr.mem, | 2685 | rc = read_descriptor(ctxt, ctxt->src.addr.mem, |
2741 | &desc_ptr.size, &desc_ptr.address, | 2686 | &desc_ptr.size, &desc_ptr.address, |
2742 | c->op_bytes); | 2687 | ctxt->op_bytes); |
2743 | if (rc != X86EMUL_CONTINUE) | 2688 | if (rc != X86EMUL_CONTINUE) |
2744 | return rc; | 2689 | return rc; |
2745 | ctxt->ops->set_gdt(ctxt, &desc_ptr); | 2690 | ctxt->ops->set_gdt(ctxt, &desc_ptr); |
2746 | /* Disable writeback. */ | 2691 | /* Disable writeback. */ |
2747 | c->dst.type = OP_NONE; | 2692 | ctxt->dst.type = OP_NONE; |
2748 | return X86EMUL_CONTINUE; | 2693 | return X86EMUL_CONTINUE; |
2749 | } | 2694 | } |
2750 | 2695 | ||
2751 | static int em_vmmcall(struct x86_emulate_ctxt *ctxt) | 2696 | static int em_vmmcall(struct x86_emulate_ctxt *ctxt) |
2752 | { | 2697 | { |
2753 | struct decode_cache *c = &ctxt->decode; | ||
2754 | int rc; | 2698 | int rc; |
2755 | 2699 | ||
2756 | rc = ctxt->ops->fix_hypercall(ctxt); | 2700 | rc = ctxt->ops->fix_hypercall(ctxt); |
2757 | 2701 | ||
2758 | /* Disable writeback. */ | 2702 | /* Disable writeback. */ |
2759 | c->dst.type = OP_NONE; | 2703 | ctxt->dst.type = OP_NONE; |
2760 | return rc; | 2704 | return rc; |
2761 | } | 2705 | } |
2762 | 2706 | ||
2763 | static int em_lidt(struct x86_emulate_ctxt *ctxt) | 2707 | static int em_lidt(struct x86_emulate_ctxt *ctxt) |
2764 | { | 2708 | { |
2765 | struct decode_cache *c = &ctxt->decode; | ||
2766 | struct desc_ptr desc_ptr; | 2709 | struct desc_ptr desc_ptr; |
2767 | int rc; | 2710 | int rc; |
2768 | 2711 | ||
2769 | rc = read_descriptor(ctxt, c->src.addr.mem, | 2712 | rc = read_descriptor(ctxt, ctxt->src.addr.mem, |
2770 | &desc_ptr.size, &desc_ptr.address, | 2713 | &desc_ptr.size, &desc_ptr.address, |
2771 | c->op_bytes); | 2714 | ctxt->op_bytes); |
2772 | if (rc != X86EMUL_CONTINUE) | 2715 | if (rc != X86EMUL_CONTINUE) |
2773 | return rc; | 2716 | return rc; |
2774 | ctxt->ops->set_idt(ctxt, &desc_ptr); | 2717 | ctxt->ops->set_idt(ctxt, &desc_ptr); |
2775 | /* Disable writeback. */ | 2718 | /* Disable writeback. */ |
2776 | c->dst.type = OP_NONE; | 2719 | ctxt->dst.type = OP_NONE; |
2777 | return X86EMUL_CONTINUE; | 2720 | return X86EMUL_CONTINUE; |
2778 | } | 2721 | } |
2779 | 2722 | ||
2780 | static int em_smsw(struct x86_emulate_ctxt *ctxt) | 2723 | static int em_smsw(struct x86_emulate_ctxt *ctxt) |
2781 | { | 2724 | { |
2782 | struct decode_cache *c = &ctxt->decode; | 2725 | ctxt->dst.bytes = 2; |
2783 | 2726 | ctxt->dst.val = ctxt->ops->get_cr(ctxt, 0); | |
2784 | c->dst.bytes = 2; | ||
2785 | c->dst.val = ctxt->ops->get_cr(ctxt, 0); | ||
2786 | return X86EMUL_CONTINUE; | 2727 | return X86EMUL_CONTINUE; |
2787 | } | 2728 | } |
2788 | 2729 | ||
2789 | static int em_lmsw(struct x86_emulate_ctxt *ctxt) | 2730 | static int em_lmsw(struct x86_emulate_ctxt *ctxt) |
2790 | { | 2731 | { |
2791 | struct decode_cache *c = &ctxt->decode; | ||
2792 | ctxt->ops->set_cr(ctxt, 0, (ctxt->ops->get_cr(ctxt, 0) & ~0x0eul) | 2732 | ctxt->ops->set_cr(ctxt, 0, (ctxt->ops->get_cr(ctxt, 0) & ~0x0eul) |
2793 | | (c->src.val & 0x0f)); | 2733 | | (ctxt->src.val & 0x0f)); |
2794 | c->dst.type = OP_NONE; | 2734 | ctxt->dst.type = OP_NONE; |
2735 | return X86EMUL_CONTINUE; | ||
2736 | } | ||
2737 | |||
2738 | static int em_loop(struct x86_emulate_ctxt *ctxt) | ||
2739 | { | ||
2740 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RCX], -1); | ||
2741 | if ((address_mask(ctxt, ctxt->regs[VCPU_REGS_RCX]) != 0) && | ||
2742 | (ctxt->b == 0xe2 || test_cc(ctxt->b ^ 0x5, ctxt->eflags))) | ||
2743 | jmp_rel(ctxt, ctxt->src.val); | ||
2744 | |||
2745 | return X86EMUL_CONTINUE; | ||
2746 | } | ||
2747 | |||
2748 | static int em_jcxz(struct x86_emulate_ctxt *ctxt) | ||
2749 | { | ||
2750 | if (address_mask(ctxt, ctxt->regs[VCPU_REGS_RCX]) == 0) | ||
2751 | jmp_rel(ctxt, ctxt->src.val); | ||
2752 | |||
2753 | return X86EMUL_CONTINUE; | ||
2754 | } | ||
2755 | |||
2756 | static int em_cli(struct x86_emulate_ctxt *ctxt) | ||
2757 | { | ||
2758 | if (emulator_bad_iopl(ctxt)) | ||
2759 | return emulate_gp(ctxt, 0); | ||
2760 | |||
2761 | ctxt->eflags &= ~X86_EFLAGS_IF; | ||
2762 | return X86EMUL_CONTINUE; | ||
2763 | } | ||
2764 | |||
2765 | static int em_sti(struct x86_emulate_ctxt *ctxt) | ||
2766 | { | ||
2767 | if (emulator_bad_iopl(ctxt)) | ||
2768 | return emulate_gp(ctxt, 0); | ||
2769 | |||
2770 | ctxt->interruptibility = KVM_X86_SHADOW_INT_STI; | ||
2771 | ctxt->eflags |= X86_EFLAGS_IF; | ||
2795 | return X86EMUL_CONTINUE; | 2772 | return X86EMUL_CONTINUE; |
2796 | } | 2773 | } |
2797 | 2774 | ||
@@ -2809,9 +2786,7 @@ static bool valid_cr(int nr) | |||
2809 | 2786 | ||
2810 | static int check_cr_read(struct x86_emulate_ctxt *ctxt) | 2787 | static int check_cr_read(struct x86_emulate_ctxt *ctxt) |
2811 | { | 2788 | { |
2812 | struct decode_cache *c = &ctxt->decode; | 2789 | if (!valid_cr(ctxt->modrm_reg)) |
2813 | |||
2814 | if (!valid_cr(c->modrm_reg)) | ||
2815 | return emulate_ud(ctxt); | 2790 | return emulate_ud(ctxt); |
2816 | 2791 | ||
2817 | return X86EMUL_CONTINUE; | 2792 | return X86EMUL_CONTINUE; |
@@ -2819,9 +2794,8 @@ static int check_cr_read(struct x86_emulate_ctxt *ctxt) | |||
2819 | 2794 | ||
2820 | static int check_cr_write(struct x86_emulate_ctxt *ctxt) | 2795 | static int check_cr_write(struct x86_emulate_ctxt *ctxt) |
2821 | { | 2796 | { |
2822 | struct decode_cache *c = &ctxt->decode; | 2797 | u64 new_val = ctxt->src.val64; |
2823 | u64 new_val = c->src.val64; | 2798 | int cr = ctxt->modrm_reg; |
2824 | int cr = c->modrm_reg; | ||
2825 | u64 efer = 0; | 2799 | u64 efer = 0; |
2826 | 2800 | ||
2827 | static u64 cr_reserved_bits[] = { | 2801 | static u64 cr_reserved_bits[] = { |
@@ -2898,8 +2872,7 @@ static int check_dr7_gd(struct x86_emulate_ctxt *ctxt) | |||
2898 | 2872 | ||
2899 | static int check_dr_read(struct x86_emulate_ctxt *ctxt) | 2873 | static int check_dr_read(struct x86_emulate_ctxt *ctxt) |
2900 | { | 2874 | { |
2901 | struct decode_cache *c = &ctxt->decode; | 2875 | int dr = ctxt->modrm_reg; |
2902 | int dr = c->modrm_reg; | ||
2903 | u64 cr4; | 2876 | u64 cr4; |
2904 | 2877 | ||
2905 | if (dr > 7) | 2878 | if (dr > 7) |
@@ -2917,9 +2890,8 @@ static int check_dr_read(struct x86_emulate_ctxt *ctxt) | |||
2917 | 2890 | ||
2918 | static int check_dr_write(struct x86_emulate_ctxt *ctxt) | 2891 | static int check_dr_write(struct x86_emulate_ctxt *ctxt) |
2919 | { | 2892 | { |
2920 | struct decode_cache *c = &ctxt->decode; | 2893 | u64 new_val = ctxt->src.val64; |
2921 | u64 new_val = c->src.val64; | 2894 | int dr = ctxt->modrm_reg; |
2922 | int dr = c->modrm_reg; | ||
2923 | 2895 | ||
2924 | if ((dr == 6 || dr == 7) && (new_val & 0xffffffff00000000ULL)) | 2896 | if ((dr == 6 || dr == 7) && (new_val & 0xffffffff00000000ULL)) |
2925 | return emulate_gp(ctxt, 0); | 2897 | return emulate_gp(ctxt, 0); |
@@ -2941,7 +2913,7 @@ static int check_svme(struct x86_emulate_ctxt *ctxt) | |||
2941 | 2913 | ||
2942 | static int check_svme_pa(struct x86_emulate_ctxt *ctxt) | 2914 | static int check_svme_pa(struct x86_emulate_ctxt *ctxt) |
2943 | { | 2915 | { |
2944 | u64 rax = ctxt->decode.regs[VCPU_REGS_RAX]; | 2916 | u64 rax = ctxt->regs[VCPU_REGS_RAX]; |
2945 | 2917 | ||
2946 | /* Valid physical address? */ | 2918 | /* Valid physical address? */ |
2947 | if (rax & 0xffff000000000000ULL) | 2919 | if (rax & 0xffff000000000000ULL) |
@@ -2963,7 +2935,7 @@ static int check_rdtsc(struct x86_emulate_ctxt *ctxt) | |||
2963 | static int check_rdpmc(struct x86_emulate_ctxt *ctxt) | 2935 | static int check_rdpmc(struct x86_emulate_ctxt *ctxt) |
2964 | { | 2936 | { |
2965 | u64 cr4 = ctxt->ops->get_cr(ctxt, 4); | 2937 | u64 cr4 = ctxt->ops->get_cr(ctxt, 4); |
2966 | u64 rcx = ctxt->decode.regs[VCPU_REGS_RCX]; | 2938 | u64 rcx = ctxt->regs[VCPU_REGS_RCX]; |
2967 | 2939 | ||
2968 | if ((!(cr4 & X86_CR4_PCE) && ctxt->ops->cpl(ctxt)) || | 2940 | if ((!(cr4 & X86_CR4_PCE) && ctxt->ops->cpl(ctxt)) || |
2969 | (rcx > 3)) | 2941 | (rcx > 3)) |
@@ -2974,10 +2946,8 @@ static int check_rdpmc(struct x86_emulate_ctxt *ctxt) | |||
2974 | 2946 | ||
2975 | static int check_perm_in(struct x86_emulate_ctxt *ctxt) | 2947 | static int check_perm_in(struct x86_emulate_ctxt *ctxt) |
2976 | { | 2948 | { |
2977 | struct decode_cache *c = &ctxt->decode; | 2949 | ctxt->dst.bytes = min(ctxt->dst.bytes, 4u); |
2978 | 2950 | if (!emulator_io_permited(ctxt, ctxt->src.val, ctxt->dst.bytes)) | |
2979 | c->dst.bytes = min(c->dst.bytes, 4u); | ||
2980 | if (!emulator_io_permited(ctxt, ctxt->ops, c->src.val, c->dst.bytes)) | ||
2981 | return emulate_gp(ctxt, 0); | 2951 | return emulate_gp(ctxt, 0); |
2982 | 2952 | ||
2983 | return X86EMUL_CONTINUE; | 2953 | return X86EMUL_CONTINUE; |
@@ -2985,10 +2955,8 @@ static int check_perm_in(struct x86_emulate_ctxt *ctxt) | |||
2985 | 2955 | ||
2986 | static int check_perm_out(struct x86_emulate_ctxt *ctxt) | 2956 | static int check_perm_out(struct x86_emulate_ctxt *ctxt) |
2987 | { | 2957 | { |
2988 | struct decode_cache *c = &ctxt->decode; | 2958 | ctxt->src.bytes = min(ctxt->src.bytes, 4u); |
2989 | 2959 | if (!emulator_io_permited(ctxt, ctxt->dst.val, ctxt->src.bytes)) | |
2990 | c->src.bytes = min(c->src.bytes, 4u); | ||
2991 | if (!emulator_io_permited(ctxt, ctxt->ops, c->dst.val, c->src.bytes)) | ||
2992 | return emulate_gp(ctxt, 0); | 2960 | return emulate_gp(ctxt, 0); |
2993 | 2961 | ||
2994 | return X86EMUL_CONTINUE; | 2962 | return X86EMUL_CONTINUE; |
@@ -3165,12 +3133,15 @@ static struct opcode opcode_table[256] = { | |||
3165 | G(DstMem | SrcImm | ModRM | Group, group1), | 3133 | G(DstMem | SrcImm | ModRM | Group, group1), |
3166 | G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1), | 3134 | G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1), |
3167 | G(DstMem | SrcImmByte | ModRM | Group, group1), | 3135 | G(DstMem | SrcImmByte | ModRM | Group, group1), |
3168 | D2bv(DstMem | SrcReg | ModRM), D2bv(DstMem | SrcReg | ModRM | Lock), | 3136 | I2bv(DstMem | SrcReg | ModRM, em_test), |
3137 | I2bv(DstMem | SrcReg | ModRM | Lock, em_xchg), | ||
3169 | /* 0x88 - 0x8F */ | 3138 | /* 0x88 - 0x8F */ |
3170 | I2bv(DstMem | SrcReg | ModRM | Mov, em_mov), | 3139 | I2bv(DstMem | SrcReg | ModRM | Mov, em_mov), |
3171 | I2bv(DstReg | SrcMem | ModRM | Mov, em_mov), | 3140 | I2bv(DstReg | SrcMem | ModRM | Mov, em_mov), |
3172 | D(DstMem | SrcNone | ModRM | Mov), D(ModRM | SrcMem | NoAccess | DstReg), | 3141 | I(DstMem | SrcNone | ModRM | Mov, em_mov_rm_sreg), |
3173 | D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A), | 3142 | D(ModRM | SrcMem | NoAccess | DstReg), |
3143 | I(ImplicitOps | SrcMem16 | ModRM, em_mov_sreg_rm), | ||
3144 | G(0, group1A), | ||
3174 | /* 0x90 - 0x97 */ | 3145 | /* 0x90 - 0x97 */ |
3175 | DI(SrcAcc | DstReg, pause), X7(D(SrcAcc | DstReg)), | 3146 | DI(SrcAcc | DstReg, pause), X7(D(SrcAcc | DstReg)), |
3176 | /* 0x98 - 0x9F */ | 3147 | /* 0x98 - 0x9F */ |
@@ -3184,7 +3155,7 @@ static struct opcode opcode_table[256] = { | |||
3184 | I2bv(SrcSI | DstDI | Mov | String, em_mov), | 3155 | I2bv(SrcSI | DstDI | Mov | String, em_mov), |
3185 | I2bv(SrcSI | DstDI | String, em_cmp), | 3156 | I2bv(SrcSI | DstDI | String, em_cmp), |
3186 | /* 0xA8 - 0xAF */ | 3157 | /* 0xA8 - 0xAF */ |
3187 | D2bv(DstAcc | SrcImm), | 3158 | I2bv(DstAcc | SrcImm, em_test), |
3188 | I2bv(SrcAcc | DstDI | Mov | String, em_mov), | 3159 | I2bv(SrcAcc | DstDI | Mov | String, em_mov), |
3189 | I2bv(SrcSI | DstAcc | Mov | String, em_mov), | 3160 | I2bv(SrcSI | DstAcc | Mov | String, em_mov), |
3190 | I2bv(SrcAcc | DstDI | String, em_cmp), | 3161 | I2bv(SrcAcc | DstDI | String, em_cmp), |
@@ -3195,25 +3166,26 @@ static struct opcode opcode_table[256] = { | |||
3195 | /* 0xC0 - 0xC7 */ | 3166 | /* 0xC0 - 0xC7 */ |
3196 | D2bv(DstMem | SrcImmByte | ModRM), | 3167 | D2bv(DstMem | SrcImmByte | ModRM), |
3197 | I(ImplicitOps | Stack | SrcImmU16, em_ret_near_imm), | 3168 | I(ImplicitOps | Stack | SrcImmU16, em_ret_near_imm), |
3198 | D(ImplicitOps | Stack), | 3169 | I(ImplicitOps | Stack, em_ret), |
3199 | D(DstReg | SrcMemFAddr | ModRM | No64), D(DstReg | SrcMemFAddr | ModRM | No64), | 3170 | D(DstReg | SrcMemFAddr | ModRM | No64), D(DstReg | SrcMemFAddr | ModRM | No64), |
3200 | G(ByteOp, group11), G(0, group11), | 3171 | G(ByteOp, group11), G(0, group11), |
3201 | /* 0xC8 - 0xCF */ | 3172 | /* 0xC8 - 0xCF */ |
3202 | N, N, N, D(ImplicitOps | Stack), | 3173 | N, N, N, I(ImplicitOps | Stack, em_ret_far), |
3203 | D(ImplicitOps), DI(SrcImmByte, intn), | 3174 | D(ImplicitOps), DI(SrcImmByte, intn), |
3204 | D(ImplicitOps | No64), DI(ImplicitOps, iret), | 3175 | D(ImplicitOps | No64), II(ImplicitOps, em_iret, iret), |
3205 | /* 0xD0 - 0xD7 */ | 3176 | /* 0xD0 - 0xD7 */ |
3206 | D2bv(DstMem | SrcOne | ModRM), D2bv(DstMem | ModRM), | 3177 | D2bv(DstMem | SrcOne | ModRM), D2bv(DstMem | ModRM), |
3207 | N, N, N, N, | 3178 | N, N, N, N, |
3208 | /* 0xD8 - 0xDF */ | 3179 | /* 0xD8 - 0xDF */ |
3209 | N, N, N, N, N, N, N, N, | 3180 | N, N, N, N, N, N, N, N, |
3210 | /* 0xE0 - 0xE7 */ | 3181 | /* 0xE0 - 0xE7 */ |
3211 | X4(D(SrcImmByte)), | 3182 | X3(I(SrcImmByte, em_loop)), |
3183 | I(SrcImmByte, em_jcxz), | ||
3212 | D2bvIP(SrcImmUByte | DstAcc, in, check_perm_in), | 3184 | D2bvIP(SrcImmUByte | DstAcc, in, check_perm_in), |
3213 | D2bvIP(SrcAcc | DstImmUByte, out, check_perm_out), | 3185 | D2bvIP(SrcAcc | DstImmUByte, out, check_perm_out), |
3214 | /* 0xE8 - 0xEF */ | 3186 | /* 0xE8 - 0xEF */ |
3215 | D(SrcImm | Stack), D(SrcImm | ImplicitOps), | 3187 | D(SrcImm | Stack), D(SrcImm | ImplicitOps), |
3216 | D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps), | 3188 | I(SrcImmFAddr | No64, em_jmp_far), D(SrcImmByte | ImplicitOps), |
3217 | D2bvIP(SrcDX | DstAcc, in, check_perm_in), | 3189 | D2bvIP(SrcDX | DstAcc, in, check_perm_in), |
3218 | D2bvIP(SrcAcc | DstDX, out, check_perm_out), | 3190 | D2bvIP(SrcAcc | DstDX, out, check_perm_out), |
3219 | /* 0xF0 - 0xF7 */ | 3191 | /* 0xF0 - 0xF7 */ |
@@ -3221,14 +3193,16 @@ static struct opcode opcode_table[256] = { | |||
3221 | DI(ImplicitOps | Priv, hlt), D(ImplicitOps), | 3193 | DI(ImplicitOps | Priv, hlt), D(ImplicitOps), |
3222 | G(ByteOp, group3), G(0, group3), | 3194 | G(ByteOp, group3), G(0, group3), |
3223 | /* 0xF8 - 0xFF */ | 3195 | /* 0xF8 - 0xFF */ |
3224 | D(ImplicitOps), D(ImplicitOps), D(ImplicitOps), D(ImplicitOps), | 3196 | D(ImplicitOps), D(ImplicitOps), |
3197 | I(ImplicitOps, em_cli), I(ImplicitOps, em_sti), | ||
3225 | D(ImplicitOps), D(ImplicitOps), G(0, group4), G(0, group5), | 3198 | D(ImplicitOps), D(ImplicitOps), G(0, group4), G(0, group5), |
3226 | }; | 3199 | }; |
3227 | 3200 | ||
3228 | static struct opcode twobyte_table[256] = { | 3201 | static struct opcode twobyte_table[256] = { |
3229 | /* 0x00 - 0x0F */ | 3202 | /* 0x00 - 0x0F */ |
3230 | G(0, group6), GD(0, &group7), N, N, | 3203 | G(0, group6), GD(0, &group7), N, N, |
3231 | N, D(ImplicitOps | VendorSpecific), DI(ImplicitOps | Priv, clts), N, | 3204 | N, I(ImplicitOps | VendorSpecific, em_syscall), |
3205 | II(ImplicitOps | Priv, em_clts, clts), N, | ||
3232 | DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N, | 3206 | DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N, |
3233 | N, D(ImplicitOps | ModRM), N, N, | 3207 | N, D(ImplicitOps | ModRM), N, N, |
3234 | /* 0x10 - 0x1F */ | 3208 | /* 0x10 - 0x1F */ |
@@ -3245,7 +3219,8 @@ static struct opcode twobyte_table[256] = { | |||
3245 | IIP(ImplicitOps, em_rdtsc, rdtsc, check_rdtsc), | 3219 | IIP(ImplicitOps, em_rdtsc, rdtsc, check_rdtsc), |
3246 | DI(ImplicitOps | Priv, rdmsr), | 3220 | DI(ImplicitOps | Priv, rdmsr), |
3247 | DIP(ImplicitOps | Priv, rdpmc, check_rdpmc), | 3221 | DIP(ImplicitOps | Priv, rdpmc, check_rdpmc), |
3248 | D(ImplicitOps | VendorSpecific), D(ImplicitOps | Priv | VendorSpecific), | 3222 | I(ImplicitOps | VendorSpecific, em_sysenter), |
3223 | I(ImplicitOps | Priv | VendorSpecific, em_sysexit), | ||
3249 | N, N, | 3224 | N, N, |
3250 | N, N, N, N, N, N, N, N, | 3225 | N, N, N, N, N, N, N, N, |
3251 | /* 0x40 - 0x4F */ | 3226 | /* 0x40 - 0x4F */ |
@@ -3313,11 +3288,11 @@ static struct opcode twobyte_table[256] = { | |||
3313 | #undef I2bv | 3288 | #undef I2bv |
3314 | #undef I6ALU | 3289 | #undef I6ALU |
3315 | 3290 | ||
3316 | static unsigned imm_size(struct decode_cache *c) | 3291 | static unsigned imm_size(struct x86_emulate_ctxt *ctxt) |
3317 | { | 3292 | { |
3318 | unsigned size; | 3293 | unsigned size; |
3319 | 3294 | ||
3320 | size = (c->d & ByteOp) ? 1 : c->op_bytes; | 3295 | size = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; |
3321 | if (size == 8) | 3296 | if (size == 8) |
3322 | size = 4; | 3297 | size = 4; |
3323 | return size; | 3298 | return size; |
@@ -3326,23 +3301,21 @@ static unsigned imm_size(struct decode_cache *c) | |||
3326 | static int decode_imm(struct x86_emulate_ctxt *ctxt, struct operand *op, | 3301 | static int decode_imm(struct x86_emulate_ctxt *ctxt, struct operand *op, |
3327 | unsigned size, bool sign_extension) | 3302 | unsigned size, bool sign_extension) |
3328 | { | 3303 | { |
3329 | struct decode_cache *c = &ctxt->decode; | ||
3330 | struct x86_emulate_ops *ops = ctxt->ops; | ||
3331 | int rc = X86EMUL_CONTINUE; | 3304 | int rc = X86EMUL_CONTINUE; |
3332 | 3305 | ||
3333 | op->type = OP_IMM; | 3306 | op->type = OP_IMM; |
3334 | op->bytes = size; | 3307 | op->bytes = size; |
3335 | op->addr.mem.ea = c->eip; | 3308 | op->addr.mem.ea = ctxt->_eip; |
3336 | /* NB. Immediates are sign-extended as necessary. */ | 3309 | /* NB. Immediates are sign-extended as necessary. */ |
3337 | switch (op->bytes) { | 3310 | switch (op->bytes) { |
3338 | case 1: | 3311 | case 1: |
3339 | op->val = insn_fetch(s8, 1, c->eip); | 3312 | op->val = insn_fetch(s8, 1, ctxt->_eip); |
3340 | break; | 3313 | break; |
3341 | case 2: | 3314 | case 2: |
3342 | op->val = insn_fetch(s16, 2, c->eip); | 3315 | op->val = insn_fetch(s16, 2, ctxt->_eip); |
3343 | break; | 3316 | break; |
3344 | case 4: | 3317 | case 4: |
3345 | op->val = insn_fetch(s32, 4, c->eip); | 3318 | op->val = insn_fetch(s32, 4, ctxt->_eip); |
3346 | break; | 3319 | break; |
3347 | } | 3320 | } |
3348 | if (!sign_extension) { | 3321 | if (!sign_extension) { |
@@ -3362,11 +3335,8 @@ done: | |||
3362 | return rc; | 3335 | return rc; |
3363 | } | 3336 | } |
3364 | 3337 | ||
3365 | int | 3338 | int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) |
3366 | x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) | ||
3367 | { | 3339 | { |
3368 | struct x86_emulate_ops *ops = ctxt->ops; | ||
3369 | struct decode_cache *c = &ctxt->decode; | ||
3370 | int rc = X86EMUL_CONTINUE; | 3340 | int rc = X86EMUL_CONTINUE; |
3371 | int mode = ctxt->mode; | 3341 | int mode = ctxt->mode; |
3372 | int def_op_bytes, def_ad_bytes, goffset, simd_prefix; | 3342 | int def_op_bytes, def_ad_bytes, goffset, simd_prefix; |
@@ -3374,11 +3344,11 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) | |||
3374 | struct opcode opcode; | 3344 | struct opcode opcode; |
3375 | struct operand memop = { .type = OP_NONE }, *memopp = NULL; | 3345 | struct operand memop = { .type = OP_NONE }, *memopp = NULL; |
3376 | 3346 | ||
3377 | c->eip = ctxt->eip; | 3347 | ctxt->_eip = ctxt->eip; |
3378 | c->fetch.start = c->eip; | 3348 | ctxt->fetch.start = ctxt->_eip; |
3379 | c->fetch.end = c->fetch.start + insn_len; | 3349 | ctxt->fetch.end = ctxt->fetch.start + insn_len; |
3380 | if (insn_len > 0) | 3350 | if (insn_len > 0) |
3381 | memcpy(c->fetch.data, insn, insn_len); | 3351 | memcpy(ctxt->fetch.data, insn, insn_len); |
3382 | 3352 | ||
3383 | switch (mode) { | 3353 | switch (mode) { |
3384 | case X86EMUL_MODE_REAL: | 3354 | case X86EMUL_MODE_REAL: |
@@ -3399,46 +3369,46 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) | |||
3399 | return -1; | 3369 | return -1; |
3400 | } | 3370 | } |
3401 | 3371 | ||
3402 | c->op_bytes = def_op_bytes; | 3372 | ctxt->op_bytes = def_op_bytes; |
3403 | c->ad_bytes = def_ad_bytes; | 3373 | ctxt->ad_bytes = def_ad_bytes; |
3404 | 3374 | ||
3405 | /* Legacy prefixes. */ | 3375 | /* Legacy prefixes. */ |
3406 | for (;;) { | 3376 | for (;;) { |
3407 | switch (c->b = insn_fetch(u8, 1, c->eip)) { | 3377 | switch (ctxt->b = insn_fetch(u8, 1, ctxt->_eip)) { |
3408 | case 0x66: /* operand-size override */ | 3378 | case 0x66: /* operand-size override */ |
3409 | op_prefix = true; | 3379 | op_prefix = true; |
3410 | /* switch between 2/4 bytes */ | 3380 | /* switch between 2/4 bytes */ |
3411 | c->op_bytes = def_op_bytes ^ 6; | 3381 | ctxt->op_bytes = def_op_bytes ^ 6; |
3412 | break; | 3382 | break; |
3413 | case 0x67: /* address-size override */ | 3383 | case 0x67: /* address-size override */ |
3414 | if (mode == X86EMUL_MODE_PROT64) | 3384 | if (mode == X86EMUL_MODE_PROT64) |
3415 | /* switch between 4/8 bytes */ | 3385 | /* switch between 4/8 bytes */ |
3416 | c->ad_bytes = def_ad_bytes ^ 12; | 3386 | ctxt->ad_bytes = def_ad_bytes ^ 12; |
3417 | else | 3387 | else |
3418 | /* switch between 2/4 bytes */ | 3388 | /* switch between 2/4 bytes */ |
3419 | c->ad_bytes = def_ad_bytes ^ 6; | 3389 | ctxt->ad_bytes = def_ad_bytes ^ 6; |
3420 | break; | 3390 | break; |
3421 | case 0x26: /* ES override */ | 3391 | case 0x26: /* ES override */ |
3422 | case 0x2e: /* CS override */ | 3392 | case 0x2e: /* CS override */ |
3423 | case 0x36: /* SS override */ | 3393 | case 0x36: /* SS override */ |
3424 | case 0x3e: /* DS override */ | 3394 | case 0x3e: /* DS override */ |
3425 | set_seg_override(c, (c->b >> 3) & 3); | 3395 | set_seg_override(ctxt, (ctxt->b >> 3) & 3); |
3426 | break; | 3396 | break; |
3427 | case 0x64: /* FS override */ | 3397 | case 0x64: /* FS override */ |
3428 | case 0x65: /* GS override */ | 3398 | case 0x65: /* GS override */ |
3429 | set_seg_override(c, c->b & 7); | 3399 | set_seg_override(ctxt, ctxt->b & 7); |
3430 | break; | 3400 | break; |
3431 | case 0x40 ... 0x4f: /* REX */ | 3401 | case 0x40 ... 0x4f: /* REX */ |
3432 | if (mode != X86EMUL_MODE_PROT64) | 3402 | if (mode != X86EMUL_MODE_PROT64) |
3433 | goto done_prefixes; | 3403 | goto done_prefixes; |
3434 | c->rex_prefix = c->b; | 3404 | ctxt->rex_prefix = ctxt->b; |
3435 | continue; | 3405 | continue; |
3436 | case 0xf0: /* LOCK */ | 3406 | case 0xf0: /* LOCK */ |
3437 | c->lock_prefix = 1; | 3407 | ctxt->lock_prefix = 1; |
3438 | break; | 3408 | break; |
3439 | case 0xf2: /* REPNE/REPNZ */ | 3409 | case 0xf2: /* REPNE/REPNZ */ |
3440 | case 0xf3: /* REP/REPE/REPZ */ | 3410 | case 0xf3: /* REP/REPE/REPZ */ |
3441 | c->rep_prefix = c->b; | 3411 | ctxt->rep_prefix = ctxt->b; |
3442 | break; | 3412 | break; |
3443 | default: | 3413 | default: |
3444 | goto done_prefixes; | 3414 | goto done_prefixes; |
@@ -3446,50 +3416,50 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) | |||
3446 | 3416 | ||
3447 | /* Any legacy prefix after a REX prefix nullifies its effect. */ | 3417 | /* Any legacy prefix after a REX prefix nullifies its effect. */ |
3448 | 3418 | ||
3449 | c->rex_prefix = 0; | 3419 | ctxt->rex_prefix = 0; |
3450 | } | 3420 | } |
3451 | 3421 | ||
3452 | done_prefixes: | 3422 | done_prefixes: |
3453 | 3423 | ||
3454 | /* REX prefix. */ | 3424 | /* REX prefix. */ |
3455 | if (c->rex_prefix & 8) | 3425 | if (ctxt->rex_prefix & 8) |
3456 | c->op_bytes = 8; /* REX.W */ | 3426 | ctxt->op_bytes = 8; /* REX.W */ |
3457 | 3427 | ||
3458 | /* Opcode byte(s). */ | 3428 | /* Opcode byte(s). */ |
3459 | opcode = opcode_table[c->b]; | 3429 | opcode = opcode_table[ctxt->b]; |
3460 | /* Two-byte opcode? */ | 3430 | /* Two-byte opcode? */ |
3461 | if (c->b == 0x0f) { | 3431 | if (ctxt->b == 0x0f) { |
3462 | c->twobyte = 1; | 3432 | ctxt->twobyte = 1; |
3463 | c->b = insn_fetch(u8, 1, c->eip); | 3433 | ctxt->b = insn_fetch(u8, 1, ctxt->_eip); |
3464 | opcode = twobyte_table[c->b]; | 3434 | opcode = twobyte_table[ctxt->b]; |
3465 | } | 3435 | } |
3466 | c->d = opcode.flags; | 3436 | ctxt->d = opcode.flags; |
3467 | 3437 | ||
3468 | while (c->d & GroupMask) { | 3438 | while (ctxt->d & GroupMask) { |
3469 | switch (c->d & GroupMask) { | 3439 | switch (ctxt->d & GroupMask) { |
3470 | case Group: | 3440 | case Group: |
3471 | c->modrm = insn_fetch(u8, 1, c->eip); | 3441 | ctxt->modrm = insn_fetch(u8, 1, ctxt->_eip); |
3472 | --c->eip; | 3442 | --ctxt->_eip; |
3473 | goffset = (c->modrm >> 3) & 7; | 3443 | goffset = (ctxt->modrm >> 3) & 7; |
3474 | opcode = opcode.u.group[goffset]; | 3444 | opcode = opcode.u.group[goffset]; |
3475 | break; | 3445 | break; |
3476 | case GroupDual: | 3446 | case GroupDual: |
3477 | c->modrm = insn_fetch(u8, 1, c->eip); | 3447 | ctxt->modrm = insn_fetch(u8, 1, ctxt->_eip); |
3478 | --c->eip; | 3448 | --ctxt->_eip; |
3479 | goffset = (c->modrm >> 3) & 7; | 3449 | goffset = (ctxt->modrm >> 3) & 7; |
3480 | if ((c->modrm >> 6) == 3) | 3450 | if ((ctxt->modrm >> 6) == 3) |
3481 | opcode = opcode.u.gdual->mod3[goffset]; | 3451 | opcode = opcode.u.gdual->mod3[goffset]; |
3482 | else | 3452 | else |
3483 | opcode = opcode.u.gdual->mod012[goffset]; | 3453 | opcode = opcode.u.gdual->mod012[goffset]; |
3484 | break; | 3454 | break; |
3485 | case RMExt: | 3455 | case RMExt: |
3486 | goffset = c->modrm & 7; | 3456 | goffset = ctxt->modrm & 7; |
3487 | opcode = opcode.u.group[goffset]; | 3457 | opcode = opcode.u.group[goffset]; |
3488 | break; | 3458 | break; |
3489 | case Prefix: | 3459 | case Prefix: |
3490 | if (c->rep_prefix && op_prefix) | 3460 | if (ctxt->rep_prefix && op_prefix) |
3491 | return X86EMUL_UNHANDLEABLE; | 3461 | return X86EMUL_UNHANDLEABLE; |
3492 | simd_prefix = op_prefix ? 0x66 : c->rep_prefix; | 3462 | simd_prefix = op_prefix ? 0x66 : ctxt->rep_prefix; |
3493 | switch (simd_prefix) { | 3463 | switch (simd_prefix) { |
3494 | case 0x00: opcode = opcode.u.gprefix->pfx_no; break; | 3464 | case 0x00: opcode = opcode.u.gprefix->pfx_no; break; |
3495 | case 0x66: opcode = opcode.u.gprefix->pfx_66; break; | 3465 | case 0x66: opcode = opcode.u.gprefix->pfx_66; break; |
@@ -3501,61 +3471,61 @@ done_prefixes: | |||
3501 | return X86EMUL_UNHANDLEABLE; | 3471 | return X86EMUL_UNHANDLEABLE; |
3502 | } | 3472 | } |
3503 | 3473 | ||
3504 | c->d &= ~GroupMask; | 3474 | ctxt->d &= ~GroupMask; |
3505 | c->d |= opcode.flags; | 3475 | ctxt->d |= opcode.flags; |
3506 | } | 3476 | } |
3507 | 3477 | ||
3508 | c->execute = opcode.u.execute; | 3478 | ctxt->execute = opcode.u.execute; |
3509 | c->check_perm = opcode.check_perm; | 3479 | ctxt->check_perm = opcode.check_perm; |
3510 | c->intercept = opcode.intercept; | 3480 | ctxt->intercept = opcode.intercept; |
3511 | 3481 | ||
3512 | /* Unrecognised? */ | 3482 | /* Unrecognised? */ |
3513 | if (c->d == 0 || (c->d & Undefined)) | 3483 | if (ctxt->d == 0 || (ctxt->d & Undefined)) |
3514 | return -1; | 3484 | return -1; |
3515 | 3485 | ||
3516 | if (!(c->d & VendorSpecific) && ctxt->only_vendor_specific_insn) | 3486 | if (!(ctxt->d & VendorSpecific) && ctxt->only_vendor_specific_insn) |
3517 | return -1; | 3487 | return -1; |
3518 | 3488 | ||
3519 | if (mode == X86EMUL_MODE_PROT64 && (c->d & Stack)) | 3489 | if (mode == X86EMUL_MODE_PROT64 && (ctxt->d & Stack)) |
3520 | c->op_bytes = 8; | 3490 | ctxt->op_bytes = 8; |
3521 | 3491 | ||
3522 | if (c->d & Op3264) { | 3492 | if (ctxt->d & Op3264) { |
3523 | if (mode == X86EMUL_MODE_PROT64) | 3493 | if (mode == X86EMUL_MODE_PROT64) |
3524 | c->op_bytes = 8; | 3494 | ctxt->op_bytes = 8; |
3525 | else | 3495 | else |
3526 | c->op_bytes = 4; | 3496 | ctxt->op_bytes = 4; |
3527 | } | 3497 | } |
3528 | 3498 | ||
3529 | if (c->d & Sse) | 3499 | if (ctxt->d & Sse) |
3530 | c->op_bytes = 16; | 3500 | ctxt->op_bytes = 16; |
3531 | 3501 | ||
3532 | /* ModRM and SIB bytes. */ | 3502 | /* ModRM and SIB bytes. */ |
3533 | if (c->d & ModRM) { | 3503 | if (ctxt->d & ModRM) { |
3534 | rc = decode_modrm(ctxt, ops, &memop); | 3504 | rc = decode_modrm(ctxt, &memop); |
3535 | if (!c->has_seg_override) | 3505 | if (!ctxt->has_seg_override) |
3536 | set_seg_override(c, c->modrm_seg); | 3506 | set_seg_override(ctxt, ctxt->modrm_seg); |
3537 | } else if (c->d & MemAbs) | 3507 | } else if (ctxt->d & MemAbs) |
3538 | rc = decode_abs(ctxt, ops, &memop); | 3508 | rc = decode_abs(ctxt, &memop); |
3539 | if (rc != X86EMUL_CONTINUE) | 3509 | if (rc != X86EMUL_CONTINUE) |
3540 | goto done; | 3510 | goto done; |
3541 | 3511 | ||
3542 | if (!c->has_seg_override) | 3512 | if (!ctxt->has_seg_override) |
3543 | set_seg_override(c, VCPU_SREG_DS); | 3513 | set_seg_override(ctxt, VCPU_SREG_DS); |
3544 | 3514 | ||
3545 | memop.addr.mem.seg = seg_override(ctxt, c); | 3515 | memop.addr.mem.seg = seg_override(ctxt); |
3546 | 3516 | ||
3547 | if (memop.type == OP_MEM && c->ad_bytes != 8) | 3517 | if (memop.type == OP_MEM && ctxt->ad_bytes != 8) |
3548 | memop.addr.mem.ea = (u32)memop.addr.mem.ea; | 3518 | memop.addr.mem.ea = (u32)memop.addr.mem.ea; |
3549 | 3519 | ||
3550 | /* | 3520 | /* |
3551 | * Decode and fetch the source operand: register, memory | 3521 | * Decode and fetch the source operand: register, memory |
3552 | * or immediate. | 3522 | * or immediate. |
3553 | */ | 3523 | */ |
3554 | switch (c->d & SrcMask) { | 3524 | switch (ctxt->d & SrcMask) { |
3555 | case SrcNone: | 3525 | case SrcNone: |
3556 | break; | 3526 | break; |
3557 | case SrcReg: | 3527 | case SrcReg: |
3558 | decode_register_operand(ctxt, &c->src, c, 0); | 3528 | decode_register_operand(ctxt, &ctxt->src, 0); |
3559 | break; | 3529 | break; |
3560 | case SrcMem16: | 3530 | case SrcMem16: |
3561 | memop.bytes = 2; | 3531 | memop.bytes = 2; |
@@ -3564,60 +3534,60 @@ done_prefixes: | |||
3564 | memop.bytes = 4; | 3534 | memop.bytes = 4; |
3565 | goto srcmem_common; | 3535 | goto srcmem_common; |
3566 | case SrcMem: | 3536 | case SrcMem: |
3567 | memop.bytes = (c->d & ByteOp) ? 1 : | 3537 | memop.bytes = (ctxt->d & ByteOp) ? 1 : |
3568 | c->op_bytes; | 3538 | ctxt->op_bytes; |
3569 | srcmem_common: | 3539 | srcmem_common: |
3570 | c->src = memop; | 3540 | ctxt->src = memop; |
3571 | memopp = &c->src; | 3541 | memopp = &ctxt->src; |
3572 | break; | 3542 | break; |
3573 | case SrcImmU16: | 3543 | case SrcImmU16: |
3574 | rc = decode_imm(ctxt, &c->src, 2, false); | 3544 | rc = decode_imm(ctxt, &ctxt->src, 2, false); |
3575 | break; | 3545 | break; |
3576 | case SrcImm: | 3546 | case SrcImm: |
3577 | rc = decode_imm(ctxt, &c->src, imm_size(c), true); | 3547 | rc = decode_imm(ctxt, &ctxt->src, imm_size(ctxt), true); |
3578 | break; | 3548 | break; |
3579 | case SrcImmU: | 3549 | case SrcImmU: |
3580 | rc = decode_imm(ctxt, &c->src, imm_size(c), false); | 3550 | rc = decode_imm(ctxt, &ctxt->src, imm_size(ctxt), false); |
3581 | break; | 3551 | break; |
3582 | case SrcImmByte: | 3552 | case SrcImmByte: |
3583 | rc = decode_imm(ctxt, &c->src, 1, true); | 3553 | rc = decode_imm(ctxt, &ctxt->src, 1, true); |
3584 | break; | 3554 | break; |
3585 | case SrcImmUByte: | 3555 | case SrcImmUByte: |
3586 | rc = decode_imm(ctxt, &c->src, 1, false); | 3556 | rc = decode_imm(ctxt, &ctxt->src, 1, false); |
3587 | break; | 3557 | break; |
3588 | case SrcAcc: | 3558 | case SrcAcc: |
3589 | c->src.type = OP_REG; | 3559 | ctxt->src.type = OP_REG; |
3590 | c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; | 3560 | ctxt->src.bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; |
3591 | c->src.addr.reg = &c->regs[VCPU_REGS_RAX]; | 3561 | ctxt->src.addr.reg = &ctxt->regs[VCPU_REGS_RAX]; |
3592 | fetch_register_operand(&c->src); | 3562 | fetch_register_operand(&ctxt->src); |
3593 | break; | 3563 | break; |
3594 | case SrcOne: | 3564 | case SrcOne: |
3595 | c->src.bytes = 1; | 3565 | ctxt->src.bytes = 1; |
3596 | c->src.val = 1; | 3566 | ctxt->src.val = 1; |
3597 | break; | 3567 | break; |
3598 | case SrcSI: | 3568 | case SrcSI: |
3599 | c->src.type = OP_MEM; | 3569 | ctxt->src.type = OP_MEM; |
3600 | c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; | 3570 | ctxt->src.bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; |
3601 | c->src.addr.mem.ea = | 3571 | ctxt->src.addr.mem.ea = |
3602 | register_address(c, c->regs[VCPU_REGS_RSI]); | 3572 | register_address(ctxt, ctxt->regs[VCPU_REGS_RSI]); |
3603 | c->src.addr.mem.seg = seg_override(ctxt, c); | 3573 | ctxt->src.addr.mem.seg = seg_override(ctxt); |
3604 | c->src.val = 0; | 3574 | ctxt->src.val = 0; |
3605 | break; | 3575 | break; |
3606 | case SrcImmFAddr: | 3576 | case SrcImmFAddr: |
3607 | c->src.type = OP_IMM; | 3577 | ctxt->src.type = OP_IMM; |
3608 | c->src.addr.mem.ea = c->eip; | 3578 | ctxt->src.addr.mem.ea = ctxt->_eip; |
3609 | c->src.bytes = c->op_bytes + 2; | 3579 | ctxt->src.bytes = ctxt->op_bytes + 2; |
3610 | insn_fetch_arr(c->src.valptr, c->src.bytes, c->eip); | 3580 | insn_fetch_arr(ctxt->src.valptr, ctxt->src.bytes, ctxt->_eip); |
3611 | break; | 3581 | break; |
3612 | case SrcMemFAddr: | 3582 | case SrcMemFAddr: |
3613 | memop.bytes = c->op_bytes + 2; | 3583 | memop.bytes = ctxt->op_bytes + 2; |
3614 | goto srcmem_common; | 3584 | goto srcmem_common; |
3615 | break; | 3585 | break; |
3616 | case SrcDX: | 3586 | case SrcDX: |
3617 | c->src.type = OP_REG; | 3587 | ctxt->src.type = OP_REG; |
3618 | c->src.bytes = 2; | 3588 | ctxt->src.bytes = 2; |
3619 | c->src.addr.reg = &c->regs[VCPU_REGS_RDX]; | 3589 | ctxt->src.addr.reg = &ctxt->regs[VCPU_REGS_RDX]; |
3620 | fetch_register_operand(&c->src); | 3590 | fetch_register_operand(&ctxt->src); |
3621 | break; | 3591 | break; |
3622 | } | 3592 | } |
3623 | 3593 | ||
@@ -3628,22 +3598,22 @@ done_prefixes: | |||
3628 | * Decode and fetch the second source operand: register, memory | 3598 | * Decode and fetch the second source operand: register, memory |
3629 | * or immediate. | 3599 | * or immediate. |
3630 | */ | 3600 | */ |
3631 | switch (c->d & Src2Mask) { | 3601 | switch (ctxt->d & Src2Mask) { |
3632 | case Src2None: | 3602 | case Src2None: |
3633 | break; | 3603 | break; |
3634 | case Src2CL: | 3604 | case Src2CL: |
3635 | c->src2.bytes = 1; | 3605 | ctxt->src2.bytes = 1; |
3636 | c->src2.val = c->regs[VCPU_REGS_RCX] & 0x8; | 3606 | ctxt->src2.val = ctxt->regs[VCPU_REGS_RCX] & 0x8; |
3637 | break; | 3607 | break; |
3638 | case Src2ImmByte: | 3608 | case Src2ImmByte: |
3639 | rc = decode_imm(ctxt, &c->src2, 1, true); | 3609 | rc = decode_imm(ctxt, &ctxt->src2, 1, true); |
3640 | break; | 3610 | break; |
3641 | case Src2One: | 3611 | case Src2One: |
3642 | c->src2.bytes = 1; | 3612 | ctxt->src2.bytes = 1; |
3643 | c->src2.val = 1; | 3613 | ctxt->src2.val = 1; |
3644 | break; | 3614 | break; |
3645 | case Src2Imm: | 3615 | case Src2Imm: |
3646 | rc = decode_imm(ctxt, &c->src2, imm_size(c), true); | 3616 | rc = decode_imm(ctxt, &ctxt->src2, imm_size(ctxt), true); |
3647 | break; | 3617 | break; |
3648 | } | 3618 | } |
3649 | 3619 | ||
@@ -3651,68 +3621,66 @@ done_prefixes: | |||
3651 | goto done; | 3621 | goto done; |
3652 | 3622 | ||
3653 | /* Decode and fetch the destination operand: register or memory. */ | 3623 | /* Decode and fetch the destination operand: register or memory. */ |
3654 | switch (c->d & DstMask) { | 3624 | switch (ctxt->d & DstMask) { |
3655 | case DstReg: | 3625 | case DstReg: |
3656 | decode_register_operand(ctxt, &c->dst, c, | 3626 | decode_register_operand(ctxt, &ctxt->dst, |
3657 | c->twobyte && (c->b == 0xb6 || c->b == 0xb7)); | 3627 | ctxt->twobyte && (ctxt->b == 0xb6 || ctxt->b == 0xb7)); |
3658 | break; | 3628 | break; |
3659 | case DstImmUByte: | 3629 | case DstImmUByte: |
3660 | c->dst.type = OP_IMM; | 3630 | ctxt->dst.type = OP_IMM; |
3661 | c->dst.addr.mem.ea = c->eip; | 3631 | ctxt->dst.addr.mem.ea = ctxt->_eip; |
3662 | c->dst.bytes = 1; | 3632 | ctxt->dst.bytes = 1; |
3663 | c->dst.val = insn_fetch(u8, 1, c->eip); | 3633 | ctxt->dst.val = insn_fetch(u8, 1, ctxt->_eip); |
3664 | break; | 3634 | break; |
3665 | case DstMem: | 3635 | case DstMem: |
3666 | case DstMem64: | 3636 | case DstMem64: |
3667 | c->dst = memop; | 3637 | ctxt->dst = memop; |
3668 | memopp = &c->dst; | 3638 | memopp = &ctxt->dst; |
3669 | if ((c->d & DstMask) == DstMem64) | 3639 | if ((ctxt->d & DstMask) == DstMem64) |
3670 | c->dst.bytes = 8; | 3640 | ctxt->dst.bytes = 8; |
3671 | else | 3641 | else |
3672 | c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; | 3642 | ctxt->dst.bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; |
3673 | if (c->d & BitOp) | 3643 | if (ctxt->d & BitOp) |
3674 | fetch_bit_operand(c); | 3644 | fetch_bit_operand(ctxt); |
3675 | c->dst.orig_val = c->dst.val; | 3645 | ctxt->dst.orig_val = ctxt->dst.val; |
3676 | break; | 3646 | break; |
3677 | case DstAcc: | 3647 | case DstAcc: |
3678 | c->dst.type = OP_REG; | 3648 | ctxt->dst.type = OP_REG; |
3679 | c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; | 3649 | ctxt->dst.bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; |
3680 | c->dst.addr.reg = &c->regs[VCPU_REGS_RAX]; | 3650 | ctxt->dst.addr.reg = &ctxt->regs[VCPU_REGS_RAX]; |
3681 | fetch_register_operand(&c->dst); | 3651 | fetch_register_operand(&ctxt->dst); |
3682 | c->dst.orig_val = c->dst.val; | 3652 | ctxt->dst.orig_val = ctxt->dst.val; |
3683 | break; | 3653 | break; |
3684 | case DstDI: | 3654 | case DstDI: |
3685 | c->dst.type = OP_MEM; | 3655 | ctxt->dst.type = OP_MEM; |
3686 | c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; | 3656 | ctxt->dst.bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; |
3687 | c->dst.addr.mem.ea = | 3657 | ctxt->dst.addr.mem.ea = |
3688 | register_address(c, c->regs[VCPU_REGS_RDI]); | 3658 | register_address(ctxt, ctxt->regs[VCPU_REGS_RDI]); |
3689 | c->dst.addr.mem.seg = VCPU_SREG_ES; | 3659 | ctxt->dst.addr.mem.seg = VCPU_SREG_ES; |
3690 | c->dst.val = 0; | 3660 | ctxt->dst.val = 0; |
3691 | break; | 3661 | break; |
3692 | case DstDX: | 3662 | case DstDX: |
3693 | c->dst.type = OP_REG; | 3663 | ctxt->dst.type = OP_REG; |
3694 | c->dst.bytes = 2; | 3664 | ctxt->dst.bytes = 2; |
3695 | c->dst.addr.reg = &c->regs[VCPU_REGS_RDX]; | 3665 | ctxt->dst.addr.reg = &ctxt->regs[VCPU_REGS_RDX]; |
3696 | fetch_register_operand(&c->dst); | 3666 | fetch_register_operand(&ctxt->dst); |
3697 | break; | 3667 | break; |
3698 | case ImplicitOps: | 3668 | case ImplicitOps: |
3699 | /* Special instructions do their own operand decoding. */ | 3669 | /* Special instructions do their own operand decoding. */ |
3700 | default: | 3670 | default: |
3701 | c->dst.type = OP_NONE; /* Disable writeback. */ | 3671 | ctxt->dst.type = OP_NONE; /* Disable writeback. */ |
3702 | break; | 3672 | break; |
3703 | } | 3673 | } |
3704 | 3674 | ||
3705 | done: | 3675 | done: |
3706 | if (memopp && memopp->type == OP_MEM && c->rip_relative) | 3676 | if (memopp && memopp->type == OP_MEM && ctxt->rip_relative) |
3707 | memopp->addr.mem.ea += c->eip; | 3677 | memopp->addr.mem.ea += ctxt->_eip; |
3708 | 3678 | ||
3709 | return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; | 3679 | return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; |
3710 | } | 3680 | } |
3711 | 3681 | ||
3712 | static bool string_insn_completed(struct x86_emulate_ctxt *ctxt) | 3682 | static bool string_insn_completed(struct x86_emulate_ctxt *ctxt) |
3713 | { | 3683 | { |
3714 | struct decode_cache *c = &ctxt->decode; | ||
3715 | |||
3716 | /* The second termination condition only applies for REPE | 3684 | /* The second termination condition only applies for REPE |
3717 | * and REPNE. Test if the repeat string operation prefix is | 3685 | * and REPNE. Test if the repeat string operation prefix is |
3718 | * REPE/REPZ or REPNE/REPNZ and if it's the case it tests the | 3686 | * REPE/REPZ or REPNE/REPNZ and if it's the case it tests the |
@@ -3720,304 +3688,232 @@ static bool string_insn_completed(struct x86_emulate_ctxt *ctxt) | |||
3720 | * - if REPE/REPZ and ZF = 0 then done | 3688 | * - if REPE/REPZ and ZF = 0 then done |
3721 | * - if REPNE/REPNZ and ZF = 1 then done | 3689 | * - if REPNE/REPNZ and ZF = 1 then done |
3722 | */ | 3690 | */ |
3723 | if (((c->b == 0xa6) || (c->b == 0xa7) || | 3691 | if (((ctxt->b == 0xa6) || (ctxt->b == 0xa7) || |
3724 | (c->b == 0xae) || (c->b == 0xaf)) | 3692 | (ctxt->b == 0xae) || (ctxt->b == 0xaf)) |
3725 | && (((c->rep_prefix == REPE_PREFIX) && | 3693 | && (((ctxt->rep_prefix == REPE_PREFIX) && |
3726 | ((ctxt->eflags & EFLG_ZF) == 0)) | 3694 | ((ctxt->eflags & EFLG_ZF) == 0)) |
3727 | || ((c->rep_prefix == REPNE_PREFIX) && | 3695 | || ((ctxt->rep_prefix == REPNE_PREFIX) && |
3728 | ((ctxt->eflags & EFLG_ZF) == EFLG_ZF)))) | 3696 | ((ctxt->eflags & EFLG_ZF) == EFLG_ZF)))) |
3729 | return true; | 3697 | return true; |
3730 | 3698 | ||
3731 | return false; | 3699 | return false; |
3732 | } | 3700 | } |
3733 | 3701 | ||
3734 | int | 3702 | int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) |
3735 | x86_emulate_insn(struct x86_emulate_ctxt *ctxt) | ||
3736 | { | 3703 | { |
3737 | struct x86_emulate_ops *ops = ctxt->ops; | 3704 | struct x86_emulate_ops *ops = ctxt->ops; |
3738 | u64 msr_data; | 3705 | u64 msr_data; |
3739 | struct decode_cache *c = &ctxt->decode; | ||
3740 | int rc = X86EMUL_CONTINUE; | 3706 | int rc = X86EMUL_CONTINUE; |
3741 | int saved_dst_type = c->dst.type; | 3707 | int saved_dst_type = ctxt->dst.type; |
3742 | int irq; /* Used for int 3, int, and into */ | ||
3743 | 3708 | ||
3744 | ctxt->decode.mem_read.pos = 0; | 3709 | ctxt->mem_read.pos = 0; |
3745 | 3710 | ||
3746 | if (ctxt->mode == X86EMUL_MODE_PROT64 && (c->d & No64)) { | 3711 | if (ctxt->mode == X86EMUL_MODE_PROT64 && (ctxt->d & No64)) { |
3747 | rc = emulate_ud(ctxt); | 3712 | rc = emulate_ud(ctxt); |
3748 | goto done; | 3713 | goto done; |
3749 | } | 3714 | } |
3750 | 3715 | ||
3751 | /* LOCK prefix is allowed only with some instructions */ | 3716 | /* LOCK prefix is allowed only with some instructions */ |
3752 | if (c->lock_prefix && (!(c->d & Lock) || c->dst.type != OP_MEM)) { | 3717 | if (ctxt->lock_prefix && (!(ctxt->d & Lock) || ctxt->dst.type != OP_MEM)) { |
3753 | rc = emulate_ud(ctxt); | 3718 | rc = emulate_ud(ctxt); |
3754 | goto done; | 3719 | goto done; |
3755 | } | 3720 | } |
3756 | 3721 | ||
3757 | if ((c->d & SrcMask) == SrcMemFAddr && c->src.type != OP_MEM) { | 3722 | if ((ctxt->d & SrcMask) == SrcMemFAddr && ctxt->src.type != OP_MEM) { |
3758 | rc = emulate_ud(ctxt); | 3723 | rc = emulate_ud(ctxt); |
3759 | goto done; | 3724 | goto done; |
3760 | } | 3725 | } |
3761 | 3726 | ||
3762 | if ((c->d & Sse) | 3727 | if ((ctxt->d & Sse) |
3763 | && ((ops->get_cr(ctxt, 0) & X86_CR0_EM) | 3728 | && ((ops->get_cr(ctxt, 0) & X86_CR0_EM) |
3764 | || !(ops->get_cr(ctxt, 4) & X86_CR4_OSFXSR))) { | 3729 | || !(ops->get_cr(ctxt, 4) & X86_CR4_OSFXSR))) { |
3765 | rc = emulate_ud(ctxt); | 3730 | rc = emulate_ud(ctxt); |
3766 | goto done; | 3731 | goto done; |
3767 | } | 3732 | } |
3768 | 3733 | ||
3769 | if ((c->d & Sse) && (ops->get_cr(ctxt, 0) & X86_CR0_TS)) { | 3734 | if ((ctxt->d & Sse) && (ops->get_cr(ctxt, 0) & X86_CR0_TS)) { |
3770 | rc = emulate_nm(ctxt); | 3735 | rc = emulate_nm(ctxt); |
3771 | goto done; | 3736 | goto done; |
3772 | } | 3737 | } |
3773 | 3738 | ||
3774 | if (unlikely(ctxt->guest_mode) && c->intercept) { | 3739 | if (unlikely(ctxt->guest_mode) && ctxt->intercept) { |
3775 | rc = emulator_check_intercept(ctxt, c->intercept, | 3740 | rc = emulator_check_intercept(ctxt, ctxt->intercept, |
3776 | X86_ICPT_PRE_EXCEPT); | 3741 | X86_ICPT_PRE_EXCEPT); |
3777 | if (rc != X86EMUL_CONTINUE) | 3742 | if (rc != X86EMUL_CONTINUE) |
3778 | goto done; | 3743 | goto done; |
3779 | } | 3744 | } |
3780 | 3745 | ||
3781 | /* Privileged instruction can be executed only in CPL=0 */ | 3746 | /* Privileged instruction can be executed only in CPL=0 */ |
3782 | if ((c->d & Priv) && ops->cpl(ctxt)) { | 3747 | if ((ctxt->d & Priv) && ops->cpl(ctxt)) { |
3783 | rc = emulate_gp(ctxt, 0); | 3748 | rc = emulate_gp(ctxt, 0); |
3784 | goto done; | 3749 | goto done; |
3785 | } | 3750 | } |
3786 | 3751 | ||
3787 | /* Instruction can only be executed in protected mode */ | 3752 | /* Instruction can only be executed in protected mode */ |
3788 | if ((c->d & Prot) && !(ctxt->mode & X86EMUL_MODE_PROT)) { | 3753 | if ((ctxt->d & Prot) && !(ctxt->mode & X86EMUL_MODE_PROT)) { |
3789 | rc = emulate_ud(ctxt); | 3754 | rc = emulate_ud(ctxt); |
3790 | goto done; | 3755 | goto done; |
3791 | } | 3756 | } |
3792 | 3757 | ||
3793 | /* Do instruction specific permission checks */ | 3758 | /* Do instruction specific permission checks */ |
3794 | if (c->check_perm) { | 3759 | if (ctxt->check_perm) { |
3795 | rc = c->check_perm(ctxt); | 3760 | rc = ctxt->check_perm(ctxt); |
3796 | if (rc != X86EMUL_CONTINUE) | 3761 | if (rc != X86EMUL_CONTINUE) |
3797 | goto done; | 3762 | goto done; |
3798 | } | 3763 | } |
3799 | 3764 | ||
3800 | if (unlikely(ctxt->guest_mode) && c->intercept) { | 3765 | if (unlikely(ctxt->guest_mode) && ctxt->intercept) { |
3801 | rc = emulator_check_intercept(ctxt, c->intercept, | 3766 | rc = emulator_check_intercept(ctxt, ctxt->intercept, |
3802 | X86_ICPT_POST_EXCEPT); | 3767 | X86_ICPT_POST_EXCEPT); |
3803 | if (rc != X86EMUL_CONTINUE) | 3768 | if (rc != X86EMUL_CONTINUE) |
3804 | goto done; | 3769 | goto done; |
3805 | } | 3770 | } |
3806 | 3771 | ||
3807 | if (c->rep_prefix && (c->d & String)) { | 3772 | if (ctxt->rep_prefix && (ctxt->d & String)) { |
3808 | /* All REP prefixes have the same first termination condition */ | 3773 | /* All REP prefixes have the same first termination condition */ |
3809 | if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0) { | 3774 | if (address_mask(ctxt, ctxt->regs[VCPU_REGS_RCX]) == 0) { |
3810 | ctxt->eip = c->eip; | 3775 | ctxt->eip = ctxt->_eip; |
3811 | goto done; | 3776 | goto done; |
3812 | } | 3777 | } |
3813 | } | 3778 | } |
3814 | 3779 | ||
3815 | if ((c->src.type == OP_MEM) && !(c->d & NoAccess)) { | 3780 | if ((ctxt->src.type == OP_MEM) && !(ctxt->d & NoAccess)) { |
3816 | rc = segmented_read(ctxt, c->src.addr.mem, | 3781 | rc = segmented_read(ctxt, ctxt->src.addr.mem, |
3817 | c->src.valptr, c->src.bytes); | 3782 | ctxt->src.valptr, ctxt->src.bytes); |
3818 | if (rc != X86EMUL_CONTINUE) | 3783 | if (rc != X86EMUL_CONTINUE) |
3819 | goto done; | 3784 | goto done; |
3820 | c->src.orig_val64 = c->src.val64; | 3785 | ctxt->src.orig_val64 = ctxt->src.val64; |
3821 | } | 3786 | } |
3822 | 3787 | ||
3823 | if (c->src2.type == OP_MEM) { | 3788 | if (ctxt->src2.type == OP_MEM) { |
3824 | rc = segmented_read(ctxt, c->src2.addr.mem, | 3789 | rc = segmented_read(ctxt, ctxt->src2.addr.mem, |
3825 | &c->src2.val, c->src2.bytes); | 3790 | &ctxt->src2.val, ctxt->src2.bytes); |
3826 | if (rc != X86EMUL_CONTINUE) | 3791 | if (rc != X86EMUL_CONTINUE) |
3827 | goto done; | 3792 | goto done; |
3828 | } | 3793 | } |
3829 | 3794 | ||
3830 | if ((c->d & DstMask) == ImplicitOps) | 3795 | if ((ctxt->d & DstMask) == ImplicitOps) |
3831 | goto special_insn; | 3796 | goto special_insn; |
3832 | 3797 | ||
3833 | 3798 | ||
3834 | if ((c->dst.type == OP_MEM) && !(c->d & Mov)) { | 3799 | if ((ctxt->dst.type == OP_MEM) && !(ctxt->d & Mov)) { |
3835 | /* optimisation - avoid slow emulated read if Mov */ | 3800 | /* optimisation - avoid slow emulated read if Mov */ |
3836 | rc = segmented_read(ctxt, c->dst.addr.mem, | 3801 | rc = segmented_read(ctxt, ctxt->dst.addr.mem, |
3837 | &c->dst.val, c->dst.bytes); | 3802 | &ctxt->dst.val, ctxt->dst.bytes); |
3838 | if (rc != X86EMUL_CONTINUE) | 3803 | if (rc != X86EMUL_CONTINUE) |
3839 | goto done; | 3804 | goto done; |
3840 | } | 3805 | } |
3841 | c->dst.orig_val = c->dst.val; | 3806 | ctxt->dst.orig_val = ctxt->dst.val; |
3842 | 3807 | ||
3843 | special_insn: | 3808 | special_insn: |
3844 | 3809 | ||
3845 | if (unlikely(ctxt->guest_mode) && c->intercept) { | 3810 | if (unlikely(ctxt->guest_mode) && ctxt->intercept) { |
3846 | rc = emulator_check_intercept(ctxt, c->intercept, | 3811 | rc = emulator_check_intercept(ctxt, ctxt->intercept, |
3847 | X86_ICPT_POST_MEMACCESS); | 3812 | X86_ICPT_POST_MEMACCESS); |
3848 | if (rc != X86EMUL_CONTINUE) | 3813 | if (rc != X86EMUL_CONTINUE) |
3849 | goto done; | 3814 | goto done; |
3850 | } | 3815 | } |
3851 | 3816 | ||
3852 | if (c->execute) { | 3817 | if (ctxt->execute) { |
3853 | rc = c->execute(ctxt); | 3818 | rc = ctxt->execute(ctxt); |
3854 | if (rc != X86EMUL_CONTINUE) | 3819 | if (rc != X86EMUL_CONTINUE) |
3855 | goto done; | 3820 | goto done; |
3856 | goto writeback; | 3821 | goto writeback; |
3857 | } | 3822 | } |
3858 | 3823 | ||
3859 | if (c->twobyte) | 3824 | if (ctxt->twobyte) |
3860 | goto twobyte_insn; | 3825 | goto twobyte_insn; |
3861 | 3826 | ||
3862 | switch (c->b) { | 3827 | switch (ctxt->b) { |
3863 | case 0x06: /* push es */ | 3828 | case 0x06: /* push es */ |
3864 | rc = emulate_push_sreg(ctxt, ops, VCPU_SREG_ES); | 3829 | rc = emulate_push_sreg(ctxt, VCPU_SREG_ES); |
3865 | break; | 3830 | break; |
3866 | case 0x07: /* pop es */ | 3831 | case 0x07: /* pop es */ |
3867 | rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_ES); | 3832 | rc = emulate_pop_sreg(ctxt, VCPU_SREG_ES); |
3868 | break; | 3833 | break; |
3869 | case 0x0e: /* push cs */ | 3834 | case 0x0e: /* push cs */ |
3870 | rc = emulate_push_sreg(ctxt, ops, VCPU_SREG_CS); | 3835 | rc = emulate_push_sreg(ctxt, VCPU_SREG_CS); |
3871 | break; | 3836 | break; |
3872 | case 0x16: /* push ss */ | 3837 | case 0x16: /* push ss */ |
3873 | rc = emulate_push_sreg(ctxt, ops, VCPU_SREG_SS); | 3838 | rc = emulate_push_sreg(ctxt, VCPU_SREG_SS); |
3874 | break; | 3839 | break; |
3875 | case 0x17: /* pop ss */ | 3840 | case 0x17: /* pop ss */ |
3876 | rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_SS); | 3841 | rc = emulate_pop_sreg(ctxt, VCPU_SREG_SS); |
3877 | break; | 3842 | break; |
3878 | case 0x1e: /* push ds */ | 3843 | case 0x1e: /* push ds */ |
3879 | rc = emulate_push_sreg(ctxt, ops, VCPU_SREG_DS); | 3844 | rc = emulate_push_sreg(ctxt, VCPU_SREG_DS); |
3880 | break; | 3845 | break; |
3881 | case 0x1f: /* pop ds */ | 3846 | case 0x1f: /* pop ds */ |
3882 | rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_DS); | 3847 | rc = emulate_pop_sreg(ctxt, VCPU_SREG_DS); |
3883 | break; | 3848 | break; |
3884 | case 0x40 ... 0x47: /* inc r16/r32 */ | 3849 | case 0x40 ... 0x47: /* inc r16/r32 */ |
3885 | emulate_1op("inc", c->dst, ctxt->eflags); | 3850 | emulate_1op("inc", ctxt->dst, ctxt->eflags); |
3886 | break; | 3851 | break; |
3887 | case 0x48 ... 0x4f: /* dec r16/r32 */ | 3852 | case 0x48 ... 0x4f: /* dec r16/r32 */ |
3888 | emulate_1op("dec", c->dst, ctxt->eflags); | 3853 | emulate_1op("dec", ctxt->dst, ctxt->eflags); |
3889 | break; | 3854 | break; |
3890 | case 0x63: /* movsxd */ | 3855 | case 0x63: /* movsxd */ |
3891 | if (ctxt->mode != X86EMUL_MODE_PROT64) | 3856 | if (ctxt->mode != X86EMUL_MODE_PROT64) |
3892 | goto cannot_emulate; | 3857 | goto cannot_emulate; |
3893 | c->dst.val = (s32) c->src.val; | 3858 | ctxt->dst.val = (s32) ctxt->src.val; |
3894 | break; | 3859 | break; |
3895 | case 0x6c: /* insb */ | 3860 | case 0x6c: /* insb */ |
3896 | case 0x6d: /* insw/insd */ | 3861 | case 0x6d: /* insw/insd */ |
3897 | c->src.val = c->regs[VCPU_REGS_RDX]; | 3862 | ctxt->src.val = ctxt->regs[VCPU_REGS_RDX]; |
3898 | goto do_io_in; | 3863 | goto do_io_in; |
3899 | case 0x6e: /* outsb */ | 3864 | case 0x6e: /* outsb */ |
3900 | case 0x6f: /* outsw/outsd */ | 3865 | case 0x6f: /* outsw/outsd */ |
3901 | c->dst.val = c->regs[VCPU_REGS_RDX]; | 3866 | ctxt->dst.val = ctxt->regs[VCPU_REGS_RDX]; |
3902 | goto do_io_out; | 3867 | goto do_io_out; |
3903 | break; | 3868 | break; |
3904 | case 0x70 ... 0x7f: /* jcc (short) */ | 3869 | case 0x70 ... 0x7f: /* jcc (short) */ |
3905 | if (test_cc(c->b, ctxt->eflags)) | 3870 | if (test_cc(ctxt->b, ctxt->eflags)) |
3906 | jmp_rel(c, c->src.val); | 3871 | jmp_rel(ctxt, ctxt->src.val); |
3907 | break; | ||
3908 | case 0x84 ... 0x85: | ||
3909 | test: | ||
3910 | emulate_2op_SrcV("test", c->src, c->dst, ctxt->eflags); | ||
3911 | break; | ||
3912 | case 0x86 ... 0x87: /* xchg */ | ||
3913 | xchg: | ||
3914 | /* Write back the register source. */ | ||
3915 | c->src.val = c->dst.val; | ||
3916 | write_register_operand(&c->src); | ||
3917 | /* | ||
3918 | * Write back the memory destination with implicit LOCK | ||
3919 | * prefix. | ||
3920 | */ | ||
3921 | c->dst.val = c->src.orig_val; | ||
3922 | c->lock_prefix = 1; | ||
3923 | break; | ||
3924 | case 0x8c: /* mov r/m, sreg */ | ||
3925 | if (c->modrm_reg > VCPU_SREG_GS) { | ||
3926 | rc = emulate_ud(ctxt); | ||
3927 | goto done; | ||
3928 | } | ||
3929 | c->dst.val = get_segment_selector(ctxt, c->modrm_reg); | ||
3930 | break; | 3872 | break; |
3931 | case 0x8d: /* lea r16/r32, m */ | 3873 | case 0x8d: /* lea r16/r32, m */ |
3932 | c->dst.val = c->src.addr.mem.ea; | 3874 | ctxt->dst.val = ctxt->src.addr.mem.ea; |
3933 | break; | 3875 | break; |
3934 | case 0x8e: { /* mov seg, r/m16 */ | ||
3935 | uint16_t sel; | ||
3936 | |||
3937 | sel = c->src.val; | ||
3938 | |||
3939 | if (c->modrm_reg == VCPU_SREG_CS || | ||
3940 | c->modrm_reg > VCPU_SREG_GS) { | ||
3941 | rc = emulate_ud(ctxt); | ||
3942 | goto done; | ||
3943 | } | ||
3944 | |||
3945 | if (c->modrm_reg == VCPU_SREG_SS) | ||
3946 | ctxt->interruptibility = KVM_X86_SHADOW_INT_MOV_SS; | ||
3947 | |||
3948 | rc = load_segment_descriptor(ctxt, ops, sel, c->modrm_reg); | ||
3949 | |||
3950 | c->dst.type = OP_NONE; /* Disable writeback. */ | ||
3951 | break; | ||
3952 | } | ||
3953 | case 0x8f: /* pop (sole member of Grp1a) */ | 3876 | case 0x8f: /* pop (sole member of Grp1a) */ |
3954 | rc = em_grp1a(ctxt); | 3877 | rc = em_grp1a(ctxt); |
3955 | break; | 3878 | break; |
3956 | case 0x90 ... 0x97: /* nop / xchg reg, rax */ | 3879 | case 0x90 ... 0x97: /* nop / xchg reg, rax */ |
3957 | if (c->dst.addr.reg == &c->regs[VCPU_REGS_RAX]) | 3880 | if (ctxt->dst.addr.reg == &ctxt->regs[VCPU_REGS_RAX]) |
3958 | break; | 3881 | break; |
3959 | goto xchg; | 3882 | rc = em_xchg(ctxt); |
3883 | break; | ||
3960 | case 0x98: /* cbw/cwde/cdqe */ | 3884 | case 0x98: /* cbw/cwde/cdqe */ |
3961 | switch (c->op_bytes) { | 3885 | switch (ctxt->op_bytes) { |
3962 | case 2: c->dst.val = (s8)c->dst.val; break; | 3886 | case 2: ctxt->dst.val = (s8)ctxt->dst.val; break; |
3963 | case 4: c->dst.val = (s16)c->dst.val; break; | 3887 | case 4: ctxt->dst.val = (s16)ctxt->dst.val; break; |
3964 | case 8: c->dst.val = (s32)c->dst.val; break; | 3888 | case 8: ctxt->dst.val = (s32)ctxt->dst.val; break; |
3965 | } | 3889 | } |
3966 | break; | 3890 | break; |
3967 | case 0xa8 ... 0xa9: /* test ax, imm */ | ||
3968 | goto test; | ||
3969 | case 0xc0 ... 0xc1: | 3891 | case 0xc0 ... 0xc1: |
3970 | rc = em_grp2(ctxt); | 3892 | rc = em_grp2(ctxt); |
3971 | break; | 3893 | break; |
3972 | case 0xc3: /* ret */ | ||
3973 | c->dst.type = OP_REG; | ||
3974 | c->dst.addr.reg = &c->eip; | ||
3975 | c->dst.bytes = c->op_bytes; | ||
3976 | rc = em_pop(ctxt); | ||
3977 | break; | ||
3978 | case 0xc4: /* les */ | 3894 | case 0xc4: /* les */ |
3979 | rc = emulate_load_segment(ctxt, ops, VCPU_SREG_ES); | 3895 | rc = emulate_load_segment(ctxt, VCPU_SREG_ES); |
3980 | break; | 3896 | break; |
3981 | case 0xc5: /* lds */ | 3897 | case 0xc5: /* lds */ |
3982 | rc = emulate_load_segment(ctxt, ops, VCPU_SREG_DS); | 3898 | rc = emulate_load_segment(ctxt, VCPU_SREG_DS); |
3983 | break; | ||
3984 | case 0xcb: /* ret far */ | ||
3985 | rc = emulate_ret_far(ctxt, ops); | ||
3986 | break; | 3899 | break; |
3987 | case 0xcc: /* int3 */ | 3900 | case 0xcc: /* int3 */ |
3988 | irq = 3; | 3901 | rc = emulate_int(ctxt, 3); |
3989 | goto do_interrupt; | 3902 | break; |
3990 | case 0xcd: /* int n */ | 3903 | case 0xcd: /* int n */ |
3991 | irq = c->src.val; | 3904 | rc = emulate_int(ctxt, ctxt->src.val); |
3992 | do_interrupt: | ||
3993 | rc = emulate_int(ctxt, ops, irq); | ||
3994 | break; | 3905 | break; |
3995 | case 0xce: /* into */ | 3906 | case 0xce: /* into */ |
3996 | if (ctxt->eflags & EFLG_OF) { | 3907 | if (ctxt->eflags & EFLG_OF) |
3997 | irq = 4; | 3908 | rc = emulate_int(ctxt, 4); |
3998 | goto do_interrupt; | ||
3999 | } | ||
4000 | break; | ||
4001 | case 0xcf: /* iret */ | ||
4002 | rc = emulate_iret(ctxt, ops); | ||
4003 | break; | 3909 | break; |
4004 | case 0xd0 ... 0xd1: /* Grp2 */ | 3910 | case 0xd0 ... 0xd1: /* Grp2 */ |
4005 | rc = em_grp2(ctxt); | 3911 | rc = em_grp2(ctxt); |
4006 | break; | 3912 | break; |
4007 | case 0xd2 ... 0xd3: /* Grp2 */ | 3913 | case 0xd2 ... 0xd3: /* Grp2 */ |
4008 | c->src.val = c->regs[VCPU_REGS_RCX]; | 3914 | ctxt->src.val = ctxt->regs[VCPU_REGS_RCX]; |
4009 | rc = em_grp2(ctxt); | 3915 | rc = em_grp2(ctxt); |
4010 | break; | 3916 | break; |
4011 | case 0xe0 ... 0xe2: /* loop/loopz/loopnz */ | ||
4012 | register_address_increment(c, &c->regs[VCPU_REGS_RCX], -1); | ||
4013 | if (address_mask(c, c->regs[VCPU_REGS_RCX]) != 0 && | ||
4014 | (c->b == 0xe2 || test_cc(c->b ^ 0x5, ctxt->eflags))) | ||
4015 | jmp_rel(c, c->src.val); | ||
4016 | break; | ||
4017 | case 0xe3: /* jcxz/jecxz/jrcxz */ | ||
4018 | if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0) | ||
4019 | jmp_rel(c, c->src.val); | ||
4020 | break; | ||
4021 | case 0xe4: /* inb */ | 3917 | case 0xe4: /* inb */ |
4022 | case 0xe5: /* in */ | 3918 | case 0xe5: /* in */ |
4023 | goto do_io_in; | 3919 | goto do_io_in; |
@@ -4025,35 +3921,30 @@ special_insn: | |||
4025 | case 0xe7: /* out */ | 3921 | case 0xe7: /* out */ |
4026 | goto do_io_out; | 3922 | goto do_io_out; |
4027 | case 0xe8: /* call (near) */ { | 3923 | case 0xe8: /* call (near) */ { |
4028 | long int rel = c->src.val; | 3924 | long int rel = ctxt->src.val; |
4029 | c->src.val = (unsigned long) c->eip; | 3925 | ctxt->src.val = (unsigned long) ctxt->_eip; |
4030 | jmp_rel(c, rel); | 3926 | jmp_rel(ctxt, rel); |
4031 | rc = em_push(ctxt); | 3927 | rc = em_push(ctxt); |
4032 | break; | 3928 | break; |
4033 | } | 3929 | } |
4034 | case 0xe9: /* jmp rel */ | 3930 | case 0xe9: /* jmp rel */ |
4035 | goto jmp; | 3931 | case 0xeb: /* jmp rel short */ |
4036 | case 0xea: /* jmp far */ | 3932 | jmp_rel(ctxt, ctxt->src.val); |
4037 | rc = em_jmp_far(ctxt); | 3933 | ctxt->dst.type = OP_NONE; /* Disable writeback. */ |
4038 | break; | ||
4039 | case 0xeb: | ||
4040 | jmp: /* jmp rel short */ | ||
4041 | jmp_rel(c, c->src.val); | ||
4042 | c->dst.type = OP_NONE; /* Disable writeback. */ | ||
4043 | break; | 3934 | break; |
4044 | case 0xec: /* in al,dx */ | 3935 | case 0xec: /* in al,dx */ |
4045 | case 0xed: /* in (e/r)ax,dx */ | 3936 | case 0xed: /* in (e/r)ax,dx */ |
4046 | do_io_in: | 3937 | do_io_in: |
4047 | if (!pio_in_emulated(ctxt, ops, c->dst.bytes, c->src.val, | 3938 | if (!pio_in_emulated(ctxt, ctxt->dst.bytes, ctxt->src.val, |
4048 | &c->dst.val)) | 3939 | &ctxt->dst.val)) |
4049 | goto done; /* IO is needed */ | 3940 | goto done; /* IO is needed */ |
4050 | break; | 3941 | break; |
4051 | case 0xee: /* out dx,al */ | 3942 | case 0xee: /* out dx,al */ |
4052 | case 0xef: /* out dx,(e/r)ax */ | 3943 | case 0xef: /* out dx,(e/r)ax */ |
4053 | do_io_out: | 3944 | do_io_out: |
4054 | ops->pio_out_emulated(ctxt, c->src.bytes, c->dst.val, | 3945 | ops->pio_out_emulated(ctxt, ctxt->src.bytes, ctxt->dst.val, |
4055 | &c->src.val, 1); | 3946 | &ctxt->src.val, 1); |
4056 | c->dst.type = OP_NONE; /* Disable writeback. */ | 3947 | ctxt->dst.type = OP_NONE; /* Disable writeback. */ |
4057 | break; | 3948 | break; |
4058 | case 0xf4: /* hlt */ | 3949 | case 0xf4: /* hlt */ |
4059 | ctxt->ops->halt(ctxt); | 3950 | ctxt->ops->halt(ctxt); |
@@ -4071,22 +3962,6 @@ special_insn: | |||
4071 | case 0xf9: /* stc */ | 3962 | case 0xf9: /* stc */ |
4072 | ctxt->eflags |= EFLG_CF; | 3963 | ctxt->eflags |= EFLG_CF; |
4073 | break; | 3964 | break; |
4074 | case 0xfa: /* cli */ | ||
4075 | if (emulator_bad_iopl(ctxt, ops)) { | ||
4076 | rc = emulate_gp(ctxt, 0); | ||
4077 | goto done; | ||
4078 | } else | ||
4079 | ctxt->eflags &= ~X86_EFLAGS_IF; | ||
4080 | break; | ||
4081 | case 0xfb: /* sti */ | ||
4082 | if (emulator_bad_iopl(ctxt, ops)) { | ||
4083 | rc = emulate_gp(ctxt, 0); | ||
4084 | goto done; | ||
4085 | } else { | ||
4086 | ctxt->interruptibility = KVM_X86_SHADOW_INT_STI; | ||
4087 | ctxt->eflags |= X86_EFLAGS_IF; | ||
4088 | } | ||
4089 | break; | ||
4090 | case 0xfc: /* cld */ | 3965 | case 0xfc: /* cld */ |
4091 | ctxt->eflags &= ~EFLG_DF; | 3966 | ctxt->eflags &= ~EFLG_DF; |
4092 | break; | 3967 | break; |
@@ -4115,40 +3990,40 @@ writeback: | |||
4115 | * restore dst type in case the decoding will be reused | 3990 | * restore dst type in case the decoding will be reused |
4116 | * (happens for string instruction ) | 3991 | * (happens for string instruction ) |
4117 | */ | 3992 | */ |
4118 | c->dst.type = saved_dst_type; | 3993 | ctxt->dst.type = saved_dst_type; |
4119 | 3994 | ||
4120 | if ((c->d & SrcMask) == SrcSI) | 3995 | if ((ctxt->d & SrcMask) == SrcSI) |
4121 | string_addr_inc(ctxt, seg_override(ctxt, c), | 3996 | string_addr_inc(ctxt, seg_override(ctxt), |
4122 | VCPU_REGS_RSI, &c->src); | 3997 | VCPU_REGS_RSI, &ctxt->src); |
4123 | 3998 | ||
4124 | if ((c->d & DstMask) == DstDI) | 3999 | if ((ctxt->d & DstMask) == DstDI) |
4125 | string_addr_inc(ctxt, VCPU_SREG_ES, VCPU_REGS_RDI, | 4000 | string_addr_inc(ctxt, VCPU_SREG_ES, VCPU_REGS_RDI, |
4126 | &c->dst); | 4001 | &ctxt->dst); |
4127 | 4002 | ||
4128 | if (c->rep_prefix && (c->d & String)) { | 4003 | if (ctxt->rep_prefix && (ctxt->d & String)) { |
4129 | struct read_cache *r = &ctxt->decode.io_read; | 4004 | struct read_cache *r = &ctxt->io_read; |
4130 | register_address_increment(c, &c->regs[VCPU_REGS_RCX], -1); | 4005 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RCX], -1); |
4131 | 4006 | ||
4132 | if (!string_insn_completed(ctxt)) { | 4007 | if (!string_insn_completed(ctxt)) { |
4133 | /* | 4008 | /* |
4134 | * Re-enter guest when pio read ahead buffer is empty | 4009 | * Re-enter guest when pio read ahead buffer is empty |
4135 | * or, if it is not used, after each 1024 iteration. | 4010 | * or, if it is not used, after each 1024 iteration. |
4136 | */ | 4011 | */ |
4137 | if ((r->end != 0 || c->regs[VCPU_REGS_RCX] & 0x3ff) && | 4012 | if ((r->end != 0 || ctxt->regs[VCPU_REGS_RCX] & 0x3ff) && |
4138 | (r->end == 0 || r->end != r->pos)) { | 4013 | (r->end == 0 || r->end != r->pos)) { |
4139 | /* | 4014 | /* |
4140 | * Reset read cache. Usually happens before | 4015 | * Reset read cache. Usually happens before |
4141 | * decode, but since instruction is restarted | 4016 | * decode, but since instruction is restarted |
4142 | * we have to do it here. | 4017 | * we have to do it here. |
4143 | */ | 4018 | */ |
4144 | ctxt->decode.mem_read.end = 0; | 4019 | ctxt->mem_read.end = 0; |
4145 | return EMULATION_RESTART; | 4020 | return EMULATION_RESTART; |
4146 | } | 4021 | } |
4147 | goto done; /* skip rip writeback */ | 4022 | goto done; /* skip rip writeback */ |
4148 | } | 4023 | } |
4149 | } | 4024 | } |
4150 | 4025 | ||
4151 | ctxt->eip = c->eip; | 4026 | ctxt->eip = ctxt->_eip; |
4152 | 4027 | ||
4153 | done: | 4028 | done: |
4154 | if (rc == X86EMUL_PROPAGATE_FAULT) | 4029 | if (rc == X86EMUL_PROPAGATE_FAULT) |
@@ -4159,13 +4034,7 @@ done: | |||
4159 | return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; | 4034 | return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK; |
4160 | 4035 | ||
4161 | twobyte_insn: | 4036 | twobyte_insn: |
4162 | switch (c->b) { | 4037 | switch (ctxt->b) { |
4163 | case 0x05: /* syscall */ | ||
4164 | rc = emulate_syscall(ctxt, ops); | ||
4165 | break; | ||
4166 | case 0x06: | ||
4167 | rc = em_clts(ctxt); | ||
4168 | break; | ||
4169 | case 0x09: /* wbinvd */ | 4038 | case 0x09: /* wbinvd */ |
4170 | (ctxt->ops->wbinvd)(ctxt); | 4039 | (ctxt->ops->wbinvd)(ctxt); |
4171 | break; | 4040 | break; |
@@ -4174,21 +4043,21 @@ twobyte_insn: | |||
4174 | case 0x18: /* Grp16 (prefetch/nop) */ | 4043 | case 0x18: /* Grp16 (prefetch/nop) */ |
4175 | break; | 4044 | break; |
4176 | case 0x20: /* mov cr, reg */ | 4045 | case 0x20: /* mov cr, reg */ |
4177 | c->dst.val = ops->get_cr(ctxt, c->modrm_reg); | 4046 | ctxt->dst.val = ops->get_cr(ctxt, ctxt->modrm_reg); |
4178 | break; | 4047 | break; |
4179 | case 0x21: /* mov from dr to reg */ | 4048 | case 0x21: /* mov from dr to reg */ |
4180 | ops->get_dr(ctxt, c->modrm_reg, &c->dst.val); | 4049 | ops->get_dr(ctxt, ctxt->modrm_reg, &ctxt->dst.val); |
4181 | break; | 4050 | break; |
4182 | case 0x22: /* mov reg, cr */ | 4051 | case 0x22: /* mov reg, cr */ |
4183 | if (ops->set_cr(ctxt, c->modrm_reg, c->src.val)) { | 4052 | if (ops->set_cr(ctxt, ctxt->modrm_reg, ctxt->src.val)) { |
4184 | emulate_gp(ctxt, 0); | 4053 | emulate_gp(ctxt, 0); |
4185 | rc = X86EMUL_PROPAGATE_FAULT; | 4054 | rc = X86EMUL_PROPAGATE_FAULT; |
4186 | goto done; | 4055 | goto done; |
4187 | } | 4056 | } |
4188 | c->dst.type = OP_NONE; | 4057 | ctxt->dst.type = OP_NONE; |
4189 | break; | 4058 | break; |
4190 | case 0x23: /* mov from reg to dr */ | 4059 | case 0x23: /* mov from reg to dr */ |
4191 | if (ops->set_dr(ctxt, c->modrm_reg, c->src.val & | 4060 | if (ops->set_dr(ctxt, ctxt->modrm_reg, ctxt->src.val & |
4192 | ((ctxt->mode == X86EMUL_MODE_PROT64) ? | 4061 | ((ctxt->mode == X86EMUL_MODE_PROT64) ? |
4193 | ~0ULL : ~0U)) < 0) { | 4062 | ~0ULL : ~0U)) < 0) { |
4194 | /* #UD condition is already handled by the code above */ | 4063 | /* #UD condition is already handled by the code above */ |
@@ -4197,13 +4066,13 @@ twobyte_insn: | |||
4197 | goto done; | 4066 | goto done; |
4198 | } | 4067 | } |
4199 | 4068 | ||
4200 | c->dst.type = OP_NONE; /* no writeback */ | 4069 | ctxt->dst.type = OP_NONE; /* no writeback */ |
4201 | break; | 4070 | break; |
4202 | case 0x30: | 4071 | case 0x30: |
4203 | /* wrmsr */ | 4072 | /* wrmsr */ |
4204 | msr_data = (u32)c->regs[VCPU_REGS_RAX] | 4073 | msr_data = (u32)ctxt->regs[VCPU_REGS_RAX] |
4205 | | ((u64)c->regs[VCPU_REGS_RDX] << 32); | 4074 | | ((u64)ctxt->regs[VCPU_REGS_RDX] << 32); |
4206 | if (ops->set_msr(ctxt, c->regs[VCPU_REGS_RCX], msr_data)) { | 4075 | if (ops->set_msr(ctxt, ctxt->regs[VCPU_REGS_RCX], msr_data)) { |
4207 | emulate_gp(ctxt, 0); | 4076 | emulate_gp(ctxt, 0); |
4208 | rc = X86EMUL_PROPAGATE_FAULT; | 4077 | rc = X86EMUL_PROPAGATE_FAULT; |
4209 | goto done; | 4078 | goto done; |
@@ -4212,64 +4081,58 @@ twobyte_insn: | |||
4212 | break; | 4081 | break; |
4213 | case 0x32: | 4082 | case 0x32: |
4214 | /* rdmsr */ | 4083 | /* rdmsr */ |
4215 | if (ops->get_msr(ctxt, c->regs[VCPU_REGS_RCX], &msr_data)) { | 4084 | if (ops->get_msr(ctxt, ctxt->regs[VCPU_REGS_RCX], &msr_data)) { |
4216 | emulate_gp(ctxt, 0); | 4085 | emulate_gp(ctxt, 0); |
4217 | rc = X86EMUL_PROPAGATE_FAULT; | 4086 | rc = X86EMUL_PROPAGATE_FAULT; |
4218 | goto done; | 4087 | goto done; |
4219 | } else { | 4088 | } else { |
4220 | c->regs[VCPU_REGS_RAX] = (u32)msr_data; | 4089 | ctxt->regs[VCPU_REGS_RAX] = (u32)msr_data; |
4221 | c->regs[VCPU_REGS_RDX] = msr_data >> 32; | 4090 | ctxt->regs[VCPU_REGS_RDX] = msr_data >> 32; |
4222 | } | 4091 | } |
4223 | rc = X86EMUL_CONTINUE; | 4092 | rc = X86EMUL_CONTINUE; |
4224 | break; | 4093 | break; |
4225 | case 0x34: /* sysenter */ | ||
4226 | rc = emulate_sysenter(ctxt, ops); | ||
4227 | break; | ||
4228 | case 0x35: /* sysexit */ | ||
4229 | rc = emulate_sysexit(ctxt, ops); | ||
4230 | break; | ||
4231 | case 0x40 ... 0x4f: /* cmov */ | 4094 | case 0x40 ... 0x4f: /* cmov */ |
4232 | c->dst.val = c->dst.orig_val = c->src.val; | 4095 | ctxt->dst.val = ctxt->dst.orig_val = ctxt->src.val; |
4233 | if (!test_cc(c->b, ctxt->eflags)) | 4096 | if (!test_cc(ctxt->b, ctxt->eflags)) |
4234 | c->dst.type = OP_NONE; /* no writeback */ | 4097 | ctxt->dst.type = OP_NONE; /* no writeback */ |
4235 | break; | 4098 | break; |
4236 | case 0x80 ... 0x8f: /* jnz rel, etc*/ | 4099 | case 0x80 ... 0x8f: /* jnz rel, etc*/ |
4237 | if (test_cc(c->b, ctxt->eflags)) | 4100 | if (test_cc(ctxt->b, ctxt->eflags)) |
4238 | jmp_rel(c, c->src.val); | 4101 | jmp_rel(ctxt, ctxt->src.val); |
4239 | break; | 4102 | break; |
4240 | case 0x90 ... 0x9f: /* setcc r/m8 */ | 4103 | case 0x90 ... 0x9f: /* setcc r/m8 */ |
4241 | c->dst.val = test_cc(c->b, ctxt->eflags); | 4104 | ctxt->dst.val = test_cc(ctxt->b, ctxt->eflags); |
4242 | break; | 4105 | break; |
4243 | case 0xa0: /* push fs */ | 4106 | case 0xa0: /* push fs */ |
4244 | rc = emulate_push_sreg(ctxt, ops, VCPU_SREG_FS); | 4107 | rc = emulate_push_sreg(ctxt, VCPU_SREG_FS); |
4245 | break; | 4108 | break; |
4246 | case 0xa1: /* pop fs */ | 4109 | case 0xa1: /* pop fs */ |
4247 | rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_FS); | 4110 | rc = emulate_pop_sreg(ctxt, VCPU_SREG_FS); |
4248 | break; | 4111 | break; |
4249 | case 0xa3: | 4112 | case 0xa3: |
4250 | bt: /* bt */ | 4113 | bt: /* bt */ |
4251 | c->dst.type = OP_NONE; | 4114 | ctxt->dst.type = OP_NONE; |
4252 | /* only subword offset */ | 4115 | /* only subword offset */ |
4253 | c->src.val &= (c->dst.bytes << 3) - 1; | 4116 | ctxt->src.val &= (ctxt->dst.bytes << 3) - 1; |
4254 | emulate_2op_SrcV_nobyte("bt", c->src, c->dst, ctxt->eflags); | 4117 | emulate_2op_SrcV_nobyte("bt", ctxt->src, ctxt->dst, ctxt->eflags); |
4255 | break; | 4118 | break; |
4256 | case 0xa4: /* shld imm8, r, r/m */ | 4119 | case 0xa4: /* shld imm8, r, r/m */ |
4257 | case 0xa5: /* shld cl, r, r/m */ | 4120 | case 0xa5: /* shld cl, r, r/m */ |
4258 | emulate_2op_cl("shld", c->src2, c->src, c->dst, ctxt->eflags); | 4121 | emulate_2op_cl("shld", ctxt->src2, ctxt->src, ctxt->dst, ctxt->eflags); |
4259 | break; | 4122 | break; |
4260 | case 0xa8: /* push gs */ | 4123 | case 0xa8: /* push gs */ |
4261 | rc = emulate_push_sreg(ctxt, ops, VCPU_SREG_GS); | 4124 | rc = emulate_push_sreg(ctxt, VCPU_SREG_GS); |
4262 | break; | 4125 | break; |
4263 | case 0xa9: /* pop gs */ | 4126 | case 0xa9: /* pop gs */ |
4264 | rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_GS); | 4127 | rc = emulate_pop_sreg(ctxt, VCPU_SREG_GS); |
4265 | break; | 4128 | break; |
4266 | case 0xab: | 4129 | case 0xab: |
4267 | bts: /* bts */ | 4130 | bts: /* bts */ |
4268 | emulate_2op_SrcV_nobyte("bts", c->src, c->dst, ctxt->eflags); | 4131 | emulate_2op_SrcV_nobyte("bts", ctxt->src, ctxt->dst, ctxt->eflags); |
4269 | break; | 4132 | break; |
4270 | case 0xac: /* shrd imm8, r, r/m */ | 4133 | case 0xac: /* shrd imm8, r, r/m */ |
4271 | case 0xad: /* shrd cl, r, r/m */ | 4134 | case 0xad: /* shrd cl, r, r/m */ |
4272 | emulate_2op_cl("shrd", c->src2, c->src, c->dst, ctxt->eflags); | 4135 | emulate_2op_cl("shrd", ctxt->src2, ctxt->src, ctxt->dst, ctxt->eflags); |
4273 | break; | 4136 | break; |
4274 | case 0xae: /* clflush */ | 4137 | case 0xae: /* clflush */ |
4275 | break; | 4138 | break; |
@@ -4278,38 +4141,38 @@ twobyte_insn: | |||
4278 | * Save real source value, then compare EAX against | 4141 | * Save real source value, then compare EAX against |
4279 | * destination. | 4142 | * destination. |
4280 | */ | 4143 | */ |
4281 | c->src.orig_val = c->src.val; | 4144 | ctxt->src.orig_val = ctxt->src.val; |
4282 | c->src.val = c->regs[VCPU_REGS_RAX]; | 4145 | ctxt->src.val = ctxt->regs[VCPU_REGS_RAX]; |
4283 | emulate_2op_SrcV("cmp", c->src, c->dst, ctxt->eflags); | 4146 | emulate_2op_SrcV("cmp", ctxt->src, ctxt->dst, ctxt->eflags); |
4284 | if (ctxt->eflags & EFLG_ZF) { | 4147 | if (ctxt->eflags & EFLG_ZF) { |
4285 | /* Success: write back to memory. */ | 4148 | /* Success: write back to memory. */ |
4286 | c->dst.val = c->src.orig_val; | 4149 | ctxt->dst.val = ctxt->src.orig_val; |
4287 | } else { | 4150 | } else { |
4288 | /* Failure: write the value we saw to EAX. */ | 4151 | /* Failure: write the value we saw to EAX. */ |
4289 | c->dst.type = OP_REG; | 4152 | ctxt->dst.type = OP_REG; |
4290 | c->dst.addr.reg = (unsigned long *)&c->regs[VCPU_REGS_RAX]; | 4153 | ctxt->dst.addr.reg = (unsigned long *)&ctxt->regs[VCPU_REGS_RAX]; |
4291 | } | 4154 | } |
4292 | break; | 4155 | break; |
4293 | case 0xb2: /* lss */ | 4156 | case 0xb2: /* lss */ |
4294 | rc = emulate_load_segment(ctxt, ops, VCPU_SREG_SS); | 4157 | rc = emulate_load_segment(ctxt, VCPU_SREG_SS); |
4295 | break; | 4158 | break; |
4296 | case 0xb3: | 4159 | case 0xb3: |
4297 | btr: /* btr */ | 4160 | btr: /* btr */ |
4298 | emulate_2op_SrcV_nobyte("btr", c->src, c->dst, ctxt->eflags); | 4161 | emulate_2op_SrcV_nobyte("btr", ctxt->src, ctxt->dst, ctxt->eflags); |
4299 | break; | 4162 | break; |
4300 | case 0xb4: /* lfs */ | 4163 | case 0xb4: /* lfs */ |
4301 | rc = emulate_load_segment(ctxt, ops, VCPU_SREG_FS); | 4164 | rc = emulate_load_segment(ctxt, VCPU_SREG_FS); |
4302 | break; | 4165 | break; |
4303 | case 0xb5: /* lgs */ | 4166 | case 0xb5: /* lgs */ |
4304 | rc = emulate_load_segment(ctxt, ops, VCPU_SREG_GS); | 4167 | rc = emulate_load_segment(ctxt, VCPU_SREG_GS); |
4305 | break; | 4168 | break; |
4306 | case 0xb6 ... 0xb7: /* movzx */ | 4169 | case 0xb6 ... 0xb7: /* movzx */ |
4307 | c->dst.bytes = c->op_bytes; | 4170 | ctxt->dst.bytes = ctxt->op_bytes; |
4308 | c->dst.val = (c->d & ByteOp) ? (u8) c->src.val | 4171 | ctxt->dst.val = (ctxt->d & ByteOp) ? (u8) ctxt->src.val |
4309 | : (u16) c->src.val; | 4172 | : (u16) ctxt->src.val; |
4310 | break; | 4173 | break; |
4311 | case 0xba: /* Grp8 */ | 4174 | case 0xba: /* Grp8 */ |
4312 | switch (c->modrm_reg & 3) { | 4175 | switch (ctxt->modrm_reg & 3) { |
4313 | case 0: | 4176 | case 0: |
4314 | goto bt; | 4177 | goto bt; |
4315 | case 1: | 4178 | case 1: |
@@ -4322,47 +4185,47 @@ twobyte_insn: | |||
4322 | break; | 4185 | break; |
4323 | case 0xbb: | 4186 | case 0xbb: |
4324 | btc: /* btc */ | 4187 | btc: /* btc */ |
4325 | emulate_2op_SrcV_nobyte("btc", c->src, c->dst, ctxt->eflags); | 4188 | emulate_2op_SrcV_nobyte("btc", ctxt->src, ctxt->dst, ctxt->eflags); |
4326 | break; | 4189 | break; |
4327 | case 0xbc: { /* bsf */ | 4190 | case 0xbc: { /* bsf */ |
4328 | u8 zf; | 4191 | u8 zf; |
4329 | __asm__ ("bsf %2, %0; setz %1" | 4192 | __asm__ ("bsf %2, %0; setz %1" |
4330 | : "=r"(c->dst.val), "=q"(zf) | 4193 | : "=r"(ctxt->dst.val), "=q"(zf) |
4331 | : "r"(c->src.val)); | 4194 | : "r"(ctxt->src.val)); |
4332 | ctxt->eflags &= ~X86_EFLAGS_ZF; | 4195 | ctxt->eflags &= ~X86_EFLAGS_ZF; |
4333 | if (zf) { | 4196 | if (zf) { |
4334 | ctxt->eflags |= X86_EFLAGS_ZF; | 4197 | ctxt->eflags |= X86_EFLAGS_ZF; |
4335 | c->dst.type = OP_NONE; /* Disable writeback. */ | 4198 | ctxt->dst.type = OP_NONE; /* Disable writeback. */ |
4336 | } | 4199 | } |
4337 | break; | 4200 | break; |
4338 | } | 4201 | } |
4339 | case 0xbd: { /* bsr */ | 4202 | case 0xbd: { /* bsr */ |
4340 | u8 zf; | 4203 | u8 zf; |
4341 | __asm__ ("bsr %2, %0; setz %1" | 4204 | __asm__ ("bsr %2, %0; setz %1" |
4342 | : "=r"(c->dst.val), "=q"(zf) | 4205 | : "=r"(ctxt->dst.val), "=q"(zf) |
4343 | : "r"(c->src.val)); | 4206 | : "r"(ctxt->src.val)); |
4344 | ctxt->eflags &= ~X86_EFLAGS_ZF; | 4207 | ctxt->eflags &= ~X86_EFLAGS_ZF; |
4345 | if (zf) { | 4208 | if (zf) { |
4346 | ctxt->eflags |= X86_EFLAGS_ZF; | 4209 | ctxt->eflags |= X86_EFLAGS_ZF; |
4347 | c->dst.type = OP_NONE; /* Disable writeback. */ | 4210 | ctxt->dst.type = OP_NONE; /* Disable writeback. */ |
4348 | } | 4211 | } |
4349 | break; | 4212 | break; |
4350 | } | 4213 | } |
4351 | case 0xbe ... 0xbf: /* movsx */ | 4214 | case 0xbe ... 0xbf: /* movsx */ |
4352 | c->dst.bytes = c->op_bytes; | 4215 | ctxt->dst.bytes = ctxt->op_bytes; |
4353 | c->dst.val = (c->d & ByteOp) ? (s8) c->src.val : | 4216 | ctxt->dst.val = (ctxt->d & ByteOp) ? (s8) ctxt->src.val : |
4354 | (s16) c->src.val; | 4217 | (s16) ctxt->src.val; |
4355 | break; | 4218 | break; |
4356 | case 0xc0 ... 0xc1: /* xadd */ | 4219 | case 0xc0 ... 0xc1: /* xadd */ |
4357 | emulate_2op_SrcV("add", c->src, c->dst, ctxt->eflags); | 4220 | emulate_2op_SrcV("add", ctxt->src, ctxt->dst, ctxt->eflags); |
4358 | /* Write back the register source. */ | 4221 | /* Write back the register source. */ |
4359 | c->src.val = c->dst.orig_val; | 4222 | ctxt->src.val = ctxt->dst.orig_val; |
4360 | write_register_operand(&c->src); | 4223 | write_register_operand(&ctxt->src); |
4361 | break; | 4224 | break; |
4362 | case 0xc3: /* movnti */ | 4225 | case 0xc3: /* movnti */ |
4363 | c->dst.bytes = c->op_bytes; | 4226 | ctxt->dst.bytes = ctxt->op_bytes; |
4364 | c->dst.val = (c->op_bytes == 4) ? (u32) c->src.val : | 4227 | ctxt->dst.val = (ctxt->op_bytes == 4) ? (u32) ctxt->src.val : |
4365 | (u64) c->src.val; | 4228 | (u64) ctxt->src.val; |
4366 | break; | 4229 | break; |
4367 | case 0xc7: /* Grp9 (cmpxchg8b) */ | 4230 | case 0xc7: /* Grp9 (cmpxchg8b) */ |
4368 | rc = em_grp9(ctxt); | 4231 | rc = em_grp9(ctxt); |