Revision b8b6a50b target-i386/op.c
b/target-i386/op.c | ||
---|---|---|
276 | 276 |
#ifdef TARGET_X86_64 |
277 | 277 |
void OPPROTO op_mulq_EAX_T0(void) |
278 | 278 |
{ |
279 |
helper_mulq_EAX_T0(); |
|
279 |
helper_mulq_EAX_T0(T0);
|
|
280 | 280 |
} |
281 | 281 |
|
282 | 282 |
void OPPROTO op_imulq_EAX_T0(void) |
283 | 283 |
{ |
284 |
helper_imulq_EAX_T0(); |
|
284 |
helper_imulq_EAX_T0(T0);
|
|
285 | 285 |
} |
286 | 286 |
|
287 | 287 |
void OPPROTO op_imulq_T0_T1(void) |
288 | 288 |
{ |
289 |
helper_imulq_T0_T1();
|
|
289 |
T0 = helper_imulq_T0_T1(T0, T1);
|
|
290 | 290 |
} |
291 | 291 |
#endif |
292 | 292 |
|
... | ... | |
351 | 351 |
|
352 | 352 |
void OPPROTO op_cmpxchg8b(void) |
353 | 353 |
{ |
354 |
helper_cmpxchg8b(); |
|
354 |
helper_cmpxchg8b(A0);
|
|
355 | 355 |
} |
356 | 356 |
|
357 | 357 |
/* multiple size ops */ |
... | ... | |
522 | 522 |
|
523 | 523 |
/* segment handling */ |
524 | 524 |
|
525 |
/* never use it with R_CS */ |
|
526 |
void OPPROTO op_movl_seg_T0(void) |
|
527 |
{ |
|
528 |
helper_load_seg(PARAM1, T0); |
|
529 |
} |
|
530 |
|
|
531 | 525 |
/* faster VM86 version */ |
532 | 526 |
void OPPROTO op_movl_seg_T0_vm(void) |
533 | 527 |
{ |
... | ... | |
548 | 542 |
|
549 | 543 |
void OPPROTO op_lsl(void) |
550 | 544 |
{ |
551 |
helper_lsl(T0); |
|
545 |
uint32_t val; |
|
546 |
val = helper_lsl(T0); |
|
547 |
if (CC_SRC & CC_Z) |
|
548 |
T1 = val; |
|
549 |
FORCE_RET(); |
|
552 | 550 |
} |
553 | 551 |
|
554 | 552 |
void OPPROTO op_lar(void) |
555 | 553 |
{ |
556 |
helper_lar(T0); |
|
554 |
uint32_t val; |
|
555 |
val = helper_lar(T0); |
|
556 |
if (CC_SRC & CC_Z) |
|
557 |
T1 = val; |
|
558 |
FORCE_RET(); |
|
557 | 559 |
} |
558 | 560 |
|
559 | 561 |
void OPPROTO op_verr(void) |
... | ... | |
585 | 587 |
CC_SRC = (eflags & ~CC_Z) | T1; |
586 | 588 |
} |
587 | 589 |
|
588 |
/* T0: segment, T1:eip */ |
|
589 |
void OPPROTO op_ljmp_protected_T0_T1(void) |
|
590 |
{ |
|
591 |
helper_ljmp_protected_T0_T1(PARAM1); |
|
592 |
} |
|
593 |
|
|
594 |
void OPPROTO op_lcall_real_T0_T1(void) |
|
595 |
{ |
|
596 |
helper_lcall_real_T0_T1(PARAM1, PARAM2); |
|
597 |
} |
|
598 |
|
|
599 |
void OPPROTO op_lcall_protected_T0_T1(void) |
|
600 |
{ |
|
601 |
helper_lcall_protected_T0_T1(PARAM1, PARAM2); |
|
602 |
} |
|
603 |
|
|
604 |
void OPPROTO op_iret_real(void) |
|
605 |
{ |
|
606 |
helper_iret_real(PARAM1); |
|
607 |
} |
|
608 |
|
|
609 |
void OPPROTO op_iret_protected(void) |
|
610 |
{ |
|
611 |
helper_iret_protected(PARAM1, PARAM2); |
|
612 |
} |
|
613 |
|
|
614 |
void OPPROTO op_lret_protected(void) |
|
615 |
{ |
|
616 |
helper_lret_protected(PARAM1, PARAM2); |
|
617 |
} |
|
618 |
|
|
619 |
/* CR registers access. */ |
|
620 |
void OPPROTO op_movl_crN_T0(void) |
|
621 |
{ |
|
622 |
helper_movl_crN_T0(PARAM1); |
|
623 |
} |
|
624 |
|
|
625 |
/* These pseudo-opcodes check for SVM intercepts. */ |
|
626 |
void OPPROTO op_svm_check_intercept(void) |
|
627 |
{ |
|
628 |
A0 = PARAM1 & PARAM2; |
|
629 |
svm_check_intercept(PARAMQ1); |
|
630 |
} |
|
631 |
|
|
632 |
void OPPROTO op_svm_check_intercept_param(void) |
|
633 |
{ |
|
634 |
A0 = PARAM1 & PARAM2; |
|
635 |
svm_check_intercept_param(PARAMQ1, T1); |
|
636 |
} |
|
637 |
|
|
638 |
void OPPROTO op_svm_vmexit(void) |
|
639 |
{ |
|
640 |
A0 = PARAM1 & PARAM2; |
|
641 |
vmexit(PARAMQ1, T1); |
|
642 |
} |
|
643 |
|
|
644 |
void OPPROTO op_geneflags(void) |
|
645 |
{ |
|
646 |
CC_SRC = cc_table[CC_OP].compute_all(); |
|
647 |
} |
|
648 |
|
|
649 |
/* This pseudo-opcode checks for IO intercepts. */ |
|
650 |
#if !defined(CONFIG_USER_ONLY) |
|
651 |
void OPPROTO op_svm_check_intercept_io(void) |
|
652 |
{ |
|
653 |
A0 = PARAM1 & PARAM2; |
|
654 |
/* PARAMQ1 = TYPE (0 = OUT, 1 = IN; 4 = STRING; 8 = REP) |
|
655 |
T0 = PORT |
|
656 |
T1 = next eip */ |
|
657 |
stq_phys(env->vm_vmcb + offsetof(struct vmcb, control.exit_info_2), T1); |
|
658 |
/* ASIZE does not appear on real hw */ |
|
659 |
svm_check_intercept_param(SVM_EXIT_IOIO, |
|
660 |
(PARAMQ1 & ~SVM_IOIO_ASIZE_MASK) | |
|
661 |
((T0 & 0xffff) << 16)); |
|
662 |
} |
|
663 |
#endif |
|
664 |
|
|
665 |
#if !defined(CONFIG_USER_ONLY) |
|
666 |
void OPPROTO op_movtl_T0_cr8(void) |
|
667 |
{ |
|
668 |
T0 = cpu_get_apic_tpr(env); |
|
669 |
} |
|
670 |
#endif |
|
671 |
|
|
672 |
/* DR registers access */ |
|
673 |
void OPPROTO op_movl_drN_T0(void) |
|
674 |
{ |
|
675 |
helper_movl_drN_T0(PARAM1); |
|
676 |
} |
|
677 |
|
|
678 |
void OPPROTO op_lmsw_T0(void) |
|
679 |
{ |
|
680 |
/* only 4 lower bits of CR0 are modified. PE cannot be set to zero |
|
681 |
if already set to one. */ |
|
682 |
T0 = (env->cr[0] & ~0xe) | (T0 & 0xf); |
|
683 |
helper_movl_crN_T0(0); |
|
684 |
} |
|
685 |
|
|
686 | 590 |
void OPPROTO op_movl_T0_env(void) |
687 | 591 |
{ |
688 | 592 |
T0 = *(uint32_t *)((char *)env + PARAM1); |
... | ... | |
718 | 622 |
*(target_ulong *)((char *)env + PARAM1) = T1; |
719 | 623 |
} |
720 | 624 |
|
721 |
void OPPROTO op_clts(void) |
|
722 |
{ |
|
723 |
env->cr[0] &= ~CR0_TS_MASK; |
|
724 |
env->hflags &= ~HF_TS_MASK; |
|
725 |
} |
|
726 |
|
|
727 | 625 |
/* flags handling */ |
728 | 626 |
|
729 | 627 |
void OPPROTO op_jmp_label(void) |
... | ... | |
1028 | 926 |
T0 = 0; |
1029 | 927 |
} |
1030 | 928 |
|
1031 |
/* threading support */ |
|
1032 |
void OPPROTO op_lock(void) |
|
1033 |
{ |
|
1034 |
cpu_lock(); |
|
1035 |
} |
|
1036 |
|
|
1037 |
void OPPROTO op_unlock(void) |
|
1038 |
{ |
|
1039 |
cpu_unlock(); |
|
1040 |
} |
|
1041 |
|
|
1042 | 929 |
/* SSE support */ |
1043 | 930 |
void OPPROTO op_com_dummy(void) |
1044 | 931 |
{ |
Also available in: Unified diff