Changeset 54689 in vbox
- Timestamp:
- Mar 9, 2015 7:31:39 AM (10 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/VMM/VMMR3/PATMA.asm (modified) (87 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/PATMA.asm
r54688 r54689 74 74 at PATCHASMRECORD.cbFunction, DD NAME(%1 %+ _EndProc) - NAME(%1) 75 75 at PATCHASMRECORD.cRelocs, DD %3 76 iend 77 %endmacro 78 79 ;; 80 ; Simple PATCHASMRECORD initializer 81 ; @param %1 The patch function name. 82 ; @param %2 Jump lable (or nothing). 83 ; @param %3 Relative jump label (or nothing). 84 ; @param %4 Size override label (or nothing). 85 ; @param %5 The number of fixups. 86 ; 87 %macro PATCHASMRECORD_INIT_EX 5 88 istruc PATCHASMRECORD 89 at PATCHASMRECORD.pbFunction, RTCCPTR_DEF NAME(%1) 90 %ifid %2 91 at PATCHASMRECORD.offJump, DD %2 - NAME(%1) 92 %else 93 at PATCHASMRECORD.offJump, DD 0 94 %endif 95 %ifid %3 96 at PATCHASMRECORD.offRelJump, DD %3 - NAME(%1) 97 %else 98 at PATCHASMRECORD.offRelJump, DD 0 99 %endif 100 %ifid %4 101 at PATCHASMRECORD.offSizeOverride,DD %4 - NAME(%1) 102 %else 103 at PATCHASMRECORD.offSizeOverride,DD 0 104 %endif 105 at PATCHASMRECORD.cbFunction, DD NAME(%1 %+ _EndProc) - NAME(%1) 106 at PATCHASMRECORD.cRelocs, DD %5 76 107 iend 77 108 %endmacro … … 318 349 BEGIN_PATCH_CODE_SECTION 319 350 BEGINPROC PATMStiReplacement 320 PATMStiStart:321 351 mov dword [ss:PATM_INTERRUPTFLAG], 0 322 352 mov dword [ss:PATM_INHIBITIRQADDR], PATM_NEXTINSTRADDR … … 335 365 popf 336 366 mov dword [ss:PATM_INTERRUPTFLAG], 1 337 PATMStiEnd:338 367 ENDPROC PATMStiReplacement 339 368 … … 341 370 BEGIN_PATCH_RODATA_SECTION 342 371 GLOBALNAME g_patmStiRecord 343 RTCCPTR_DEF PATMStiStart344 DD 0345 DD 0346 DD 0347 DD PATMStiEnd - PATMStiStart348 372 %ifdef PATM_LOG_PATCHINSTR 349 DD6373 PATCHASMRECORD_INIT PATMStiReplacement, 6 350 374 %else 351 DD 5 352 %endif 353 DD PATM_INTERRUPTFLAG 354 DD 0 355 DD PATM_INHIBITIRQADDR 356 DD 0 357 DD PATM_NEXTINSTRADDR 358 DD 0 375 PATCHASMRECORD_INIT PATMStiReplacement, 5 376 %endif 377 DD PATM_INTERRUPTFLAG, 0 378 DD PATM_INHIBITIRQADDR, 0 379 DD PATM_NEXTINSTRADDR, 0 359 380 %ifdef PATM_LOG_PATCHINSTR 360 DD PATM_PENDINGACTION 361 DD 0 362 %endif 363 DD PATM_VMFLAGS 364 DD 0 365 DD PATM_INTERRUPTFLAG 366 DD 0 367 DD 0ffffffffh 381 DD PATM_PENDINGACTION, 0 382 %endif 383 DD PATM_VMFLAGS, 0 384 DD PATM_INTERRUPTFLAG, 0 385 DD 0ffffffffh, 0ffffffffh 368 386 369 387 … … 383 401 BEGIN_PATCH_CODE_SECTION 384 402 BEGINPROC PATMTrapEntry 385 PATMTrapEntryStart:386 403 mov dword [ss:PATM_INTERRUPTFLAG], 0 387 404 pushf … … 425 442 PATMTrapEntryJump: 426 443 DD PATM_JUMPDELTA 427 PATMTrapEntryEnd:428 444 ENDPROC PATMTrapEntry 429 445 … … 431 447 BEGIN_PATCH_RODATA_SECTION 432 448 GLOBALNAME g_patmTrapEntryRecord 433 RTCCPTR_DEF PATMTrapEntryStart434 DD PATMTrapEntryJump - PATMTrapEntryStart435 DD 0436 DD 0437 DD PATMTrapEntryEnd - PATMTrapEntryStart438 449 %ifdef PATM_LOG_PATCHIRET 439 DD4450 PATCHASMRECORD_INIT_JUMP PATMTrapEntry, PATMTrapEntryJump, 4 440 451 %else 441 DD 3 442 %endif 443 DD PATM_INTERRUPTFLAG 444 DD 0 452 PATCHASMRECORD_INIT_JUMP PATMTrapEntry, PATMTrapEntryJump, 3 453 %endif 454 DD PATM_INTERRUPTFLAG, 0 445 455 %ifdef PATM_LOG_PATCHIRET 446 DD PATM_PENDINGACTION 447 DD 0 448 %endif 449 DD PATM_VMFLAGS 450 DD 0 451 DD PATM_INTERRUPTFLAG 452 DD 0 453 DD 0ffffffffh 456 DD PATM_PENDINGACTION, 0 457 %endif 458 DD PATM_VMFLAGS, 0 459 DD PATM_INTERRUPTFLAG, 0 460 DD 0ffffffffh, 0ffffffffh 454 461 455 462 … … 512 519 PATMTrapErrorCodeEntryJump: 513 520 DD PATM_JUMPDELTA 514 PATMTrapErrorCodeEntryEnd:515 521 ENDPROC PATMTrapEntryErrorCode 516 522 … … 518 524 BEGIN_PATCH_RODATA_SECTION 519 525 GLOBALNAME g_patmTrapEntryRecordErrorCode 520 RTCCPTR_DEF PATMTrapErrorCodeEntryStart521 DD PATMTrapErrorCodeEntryJump - PATMTrapErrorCodeEntryStart522 DD 0523 DD 0524 DD PATMTrapErrorCodeEntryEnd - PATMTrapErrorCodeEntryStart525 526 %ifdef PATM_LOG_PATCHIRET 526 DD4527 PATCHASMRECORD_INIT_JUMP PATMTrapEntryErrorCode, PATMTrapErrorCodeEntryJump, 4 527 528 %else 528 DD 3 529 %endif 530 DD PATM_INTERRUPTFLAG 531 DD 0 529 PATCHASMRECORD_INIT_JUMP PATMTrapEntryErrorCode, PATMTrapErrorCodeEntryJump, 3 530 %endif 531 DD PATM_INTERRUPTFLAG, 0 532 532 %ifdef PATM_LOG_PATCHIRET 533 DD PATM_PENDINGACTION 534 DD 0 535 %endif 536 DD PATM_VMFLAGS 537 DD 0 538 DD PATM_INTERRUPTFLAG 539 DD 0 540 DD 0ffffffffh 533 DD PATM_PENDINGACTION, 0 534 %endif 535 DD PATM_VMFLAGS, 0 536 DD PATM_INTERRUPTFLAG, 0 537 DD 0ffffffffh, 0ffffffffh 541 538 542 539 … … 556 553 BEGIN_PATCH_CODE_SECTION 557 554 BEGINPROC PATMIntEntry 558 PATMIntEntryStart:559 555 mov dword [ss:PATM_INTERRUPTFLAG], 0 560 556 pushf … … 595 591 popf 596 592 mov dword [ss:PATM_INTERRUPTFLAG], 1 597 PATMIntEntryEnd:598 593 ENDPROC PATMIntEntry 599 594 … … 601 596 BEGIN_PATCH_RODATA_SECTION 602 597 GLOBALNAME g_patmIntEntryRecord 603 RTCCPTR_DEF PATMIntEntryStart604 DD 0605 DD 0606 DD 0607 DD PATMIntEntryEnd - PATMIntEntryStart608 598 %ifdef PATM_LOG_PATCHIRET 609 DD4599 PATCHASMRECORD_INIT PATMIntEntry, 4 610 600 %else 611 DD 3 612 %endif 613 DD PATM_INTERRUPTFLAG 614 DD 0 601 PATCHASMRECORD_INIT PATMIntEntry, 3 602 %endif 603 DD PATM_INTERRUPTFLAG, 0 615 604 %ifdef PATM_LOG_PATCHIRET 616 DD PATM_PENDINGACTION 617 DD 0 618 %endif 619 DD PATM_VMFLAGS 620 DD 0 621 DD PATM_INTERRUPTFLAG 622 DD 0 623 DD 0ffffffffh 605 DD PATM_PENDINGACTION, 0 606 %endif 607 DD PATM_VMFLAGS, 0 608 DD PATM_INTERRUPTFLAG, 0 609 DD 0ffffffffh, 0ffffffffh 624 610 625 611 … … 640 626 BEGIN_PATCH_CODE_SECTION 641 627 BEGINPROC PATMIntEntryErrorCode 642 PATMIntEntryErrorCodeStart:643 628 mov dword [ss:PATM_INTERRUPTFLAG], 0 644 629 pushf … … 679 664 popf 680 665 mov dword [ss:PATM_INTERRUPTFLAG], 1 681 PATMIntEntryErrorCodeEnd:682 666 ENDPROC PATMIntEntryErrorCode 683 667 … … 685 669 BEGIN_PATCH_RODATA_SECTION 686 670 GLOBALNAME g_patmIntEntryRecordErrorCode 687 RTCCPTR_DEF PATMIntEntryErrorCodeStart688 DD 0689 DD 0690 DD 0691 DD PATMIntEntryErrorCodeEnd - PATMIntEntryErrorCodeStart692 671 %ifdef PATM_LOG_PATCHIRET 693 DD4672 PATCHASMRECORD_INIT PATMIntEntryErrorCode, 4 694 673 %else 695 DD 3 696 %endif 697 DD PATM_INTERRUPTFLAG 698 DD 0 674 PATCHASMRECORD_INIT PATMIntEntryErrorCode, 3 675 %endif 676 DD PATM_INTERRUPTFLAG, 0 699 677 %ifdef PATM_LOG_PATCHIRET 700 DD PATM_PENDINGACTION 701 DD 0 702 %endif 703 DD PATM_VMFLAGS 704 DD 0 705 DD PATM_INTERRUPTFLAG 706 DD 0 707 DD 0ffffffffh 678 DD PATM_PENDINGACTION, 0 679 %endif 680 DD PATM_VMFLAGS, 0 681 DD PATM_INTERRUPTFLAG, 0 682 DD 0ffffffffh, 0ffffffffh 708 683 709 684 … … 713 688 BEGIN_PATCH_CODE_SECTION 714 689 BEGINPROC PATMPopf32Replacement 715 PATMPopf32Start:716 690 mov dword [ss:PATM_INTERRUPTFLAG], 0 717 691 %ifdef PATM_LOG_PATCHINSTR … … 766 740 PATMPopf32Jump: 767 741 DD PATM_JUMPDELTA 768 PATMPopf32End:769 742 ENDPROC PATMPopf32Replacement 770 743 … … 772 745 BEGIN_PATCH_RODATA_SECTION 773 746 GLOBALNAME g_patmPopf32Record 774 RTCCPTR_DEF PATMPopf32Start775 DD PATMPopf32Jump - PATMPopf32Start776 DD 0777 DD 0778 DD PATMPopf32End - PATMPopf32Start779 747 %ifdef PATM_LOG_PATCHINSTR 780 DD12748 PATCHASMRECORD_INIT_JUMP PATMPopf32Replacement, PATMPopf32Jump, 12 781 749 %else 782 DD 11 783 %endif 784 DD PATM_INTERRUPTFLAG 785 DD 0 750 PATCHASMRECORD_INIT_JUMP PATMPopf32Replacement, PATMPopf32Jump, 11 751 %endif 752 DD PATM_INTERRUPTFLAG, 0 786 753 %ifdef PATM_LOG_PATCHINSTR 787 DD PATM_PENDINGACTION 788 DD 0 789 %endif 790 DD PATM_INTERRUPTFLAG 791 DD 0 792 DD PATM_VMFLAGS 793 DD 0 794 DD PATM_VM_FORCEDACTIONS 795 DD 0 796 DD PATM_TEMP_EAX 797 DD 0 798 DD PATM_TEMP_ECX 799 DD 0 800 DD PATM_TEMP_EDI 801 DD 0 802 DD PATM_TEMP_RESTORE_FLAGS 803 DD 0 804 DD PATM_PENDINGACTION 805 DD 0 806 DD PATM_NEXTINSTRADDR 807 DD 0 808 DD PATM_INTERRUPTFLAG 809 DD 0 810 DD 0ffffffffh 754 DD PATM_PENDINGACTION, 0 755 %endif 756 DD PATM_INTERRUPTFLAG, 0 757 DD PATM_VMFLAGS, 0 758 DD PATM_VM_FORCEDACTIONS, 0 759 DD PATM_TEMP_EAX, 0 760 DD PATM_TEMP_ECX, 0 761 DD PATM_TEMP_EDI, 0 762 DD PATM_TEMP_RESTORE_FLAGS, 0 763 DD PATM_PENDINGACTION, 0 764 DD PATM_NEXTINSTRADDR, 0 765 DD PATM_INTERRUPTFLAG, 0 766 DD 0ffffffffh, 0ffffffffh 811 767 812 768 … … 816 772 BEGIN_PATCH_CODE_SECTION 817 773 BEGINPROC PATMPopf32Replacement_NoExit 818 PATMPopf32_NoExitStart:819 774 mov dword [ss:PATM_INTERRUPTFLAG], 0 820 775 %ifdef PATM_LOG_PATCHINSTR … … 862 817 popfd 863 818 mov dword [ss:PATM_INTERRUPTFLAG], 1 864 PATMPopf32_NoExitEnd:865 819 ENDPROC PATMPopf32Replacement_NoExit 866 820 … … 868 822 BEGIN_PATCH_RODATA_SECTION 869 823 GLOBALNAME g_patmPopf32Record_NoExit 870 RTCCPTR_DEF PATMPopf32_NoExitStart871 DD 0872 DD 0873 DD 0874 DD PATMPopf32_NoExitEnd - PATMPopf32_NoExitStart875 824 %ifdef PATM_LOG_PATCHINSTR 876 DD14825 PATCHASMRECORD_INIT PATMPopf32Replacement_NoExit, 14 877 826 %else 878 DD 13 879 %endif 880 DD PATM_INTERRUPTFLAG 881 DD 0 827 PATCHASMRECORD_INIT PATMPopf32Replacement_NoExit, 13 828 %endif 829 DD PATM_INTERRUPTFLAG, 0 882 830 %ifdef PATM_LOG_PATCHINSTR 883 DD PATM_PENDINGACTION 884 DD 0 885 %endif 886 DD PATM_VM_FORCEDACTIONS 887 DD 0 888 DD PATM_TEMP_EAX 889 DD 0 890 DD PATM_TEMP_ECX 891 DD 0 892 DD PATM_TEMP_EDI 893 DD 0 894 DD PATM_TEMP_RESTORE_FLAGS 895 DD 0 896 DD PATM_PENDINGACTION 897 DD 0 898 DD PATM_NEXTINSTRADDR 899 DD 0 900 DD PATM_VMFLAGS 901 DD 0 902 DD PATM_VMFLAGS 903 DD 0 904 DD PATM_VMFLAGS 905 DD 0 906 DD PATM_VMFLAGS 907 DD 0 908 DD PATM_INTERRUPTFLAG 909 DD 0 910 DD 0ffffffffh 831 DD PATM_PENDINGACTION, 0 832 %endif 833 DD PATM_VM_FORCEDACTIONS, 0 834 DD PATM_TEMP_EAX, 0 835 DD PATM_TEMP_ECX, 0 836 DD PATM_TEMP_EDI, 0 837 DD PATM_TEMP_RESTORE_FLAGS, 0 838 DD PATM_PENDINGACTION, 0 839 DD PATM_NEXTINSTRADDR, 0 840 DD PATM_VMFLAGS, 0 841 DD PATM_VMFLAGS, 0 842 DD PATM_VMFLAGS, 0 843 DD PATM_VMFLAGS, 0 844 DD PATM_INTERRUPTFLAG, 0 845 DD 0ffffffffh, 0ffffffffh 911 846 912 847 … … 916 851 BEGIN_PATCH_CODE_SECTION 917 852 BEGINPROC PATMPopf16Replacement 918 PATMPopf16Start:919 853 mov dword [ss:PATM_INTERRUPTFLAG], 0 920 854 test word [esp], X86_EFL_IF … … 945 879 PATMPopf16Jump: 946 880 DD PATM_JUMPDELTA 947 PATMPopf16End:948 881 ENDPROC PATMPopf16Replacement 949 882 … … 951 884 BEGIN_PATCH_RODATA_SECTION 952 885 GLOBALNAME g_patmPopf16Record 953 RTCCPTR_DEF PATMPopf16Start 954 DD PATMPopf16Jump - PATMPopf16Start 955 DD 0 956 DD 0 957 DD PATMPopf16End - PATMPopf16Start 958 DD 9 959 DD PATM_INTERRUPTFLAG 960 DD 0 961 DD PATM_INTERRUPTFLAG 962 DD 0 963 DD PATM_VM_FORCEDACTIONS 964 DD 0 965 DD PATM_INTERRUPTFLAG 966 DD 0 967 DD PATM_VMFLAGS 968 DD 0 969 DD PATM_VMFLAGS 970 DD 0 971 DD PATM_VMFLAGS 972 DD 0 973 DD PATM_VMFLAGS 974 DD 0 975 DD PATM_INTERRUPTFLAG 976 DD 0 977 DD 0ffffffffh 886 PATCHASMRECORD_INIT_JUMP PATMPopf16Replacement, PATMPopf16Jump, 9 887 DD PATM_INTERRUPTFLAG, 0 888 DD PATM_INTERRUPTFLAG, 0 889 DD PATM_VM_FORCEDACTIONS, 0 890 DD PATM_INTERRUPTFLAG, 0 891 DD PATM_VMFLAGS, 0 892 DD PATM_VMFLAGS, 0 893 DD PATM_VMFLAGS, 0 894 DD PATM_VMFLAGS, 0 895 DD PATM_INTERRUPTFLAG, 0 896 DD 0ffffffffh, 0ffffffffh 978 897 979 898 … … 984 903 BEGIN_PATCH_CODE_SECTION 985 904 BEGINPROC PATMPopf16Replacement_NoExit 986 PATMPopf16Start_NoExit:987 905 mov dword [ss:PATM_INTERRUPTFLAG], 0 988 906 test word [esp], X86_EFL_IF … … 1009 927 popf ;after the and and or operations!! (flags must be preserved) 1010 928 mov dword [ss:PATM_INTERRUPTFLAG], 1 1011 PATMPopf16End_NoExit:1012 929 ENDPROC PATMPopf16Replacement_NoExit 1013 930 … … 1015 932 BEGIN_PATCH_RODATA_SECTION 1016 933 GLOBALNAME g_patmPopf16Record_NoExit 1017 RTCCPTR_DEF PATMPopf16Start_NoExit 1018 DD 0 1019 DD 0 1020 DD 0 1021 DD PATMPopf16End_NoExit - PATMPopf16Start_NoExit 1022 DD 9 1023 DD PATM_INTERRUPTFLAG 1024 DD 0 1025 DD PATM_INTERRUPTFLAG 1026 DD 0 1027 DD PATM_VM_FORCEDACTIONS 1028 DD 0 1029 DD PATM_INTERRUPTFLAG 1030 DD 0 1031 DD PATM_VMFLAGS 1032 DD 0 1033 DD PATM_VMFLAGS 1034 DD 0 1035 DD PATM_VMFLAGS 1036 DD 0 1037 DD PATM_VMFLAGS 1038 DD 0 1039 DD PATM_INTERRUPTFLAG 1040 DD 0 1041 DD 0ffffffffh 934 PATCHASMRECORD_INIT PATMPopf16Replacement_NoExit, 9 935 DD PATM_INTERRUPTFLAG, 0 936 DD PATM_INTERRUPTFLAG, 0 937 DD PATM_VM_FORCEDACTIONS, 0 938 DD PATM_INTERRUPTFLAG, 0 939 DD PATM_VMFLAGS, 0 940 DD PATM_VMFLAGS, 0 941 DD PATM_VMFLAGS, 0 942 DD PATM_VMFLAGS, 0 943 DD PATM_INTERRUPTFLAG, 0 944 DD 0ffffffffh, 0ffffffffh 1042 945 1043 946 … … 1047 950 BEGIN_PATCH_CODE_SECTION 1048 951 BEGINPROC PATMPushf32Replacement 1049 PATMPushf32Start:1050 952 mov dword [ss:PATM_INTERRUPTFLAG], 0 1051 953 pushfd … … 1070 972 popfd 1071 973 mov dword [ss:PATM_INTERRUPTFLAG], 1 1072 PATMPushf32End:1073 974 ENDPROC PATMPushf32Replacement 1074 975 … … 1076 977 BEGIN_PATCH_RODATA_SECTION 1077 978 GLOBALNAME g_patmPushf32Record 1078 RTCCPTR_DEF PATMPushf32Start1079 DD 01080 DD 01081 DD 01082 DD PATMPushf32End - PATMPushf32Start1083 979 %ifdef PATM_LOG_PATCHINSTR 1084 DD4980 PATCHASMRECORD_INIT PATMPushf32Replacement, 4 1085 981 %else 1086 DD 3 1087 %endif 1088 DD PATM_INTERRUPTFLAG 1089 DD 0 982 PATCHASMRECORD_INIT PATMPushf32Replacement, 3 983 %endif 984 DD PATM_INTERRUPTFLAG, 0 1090 985 %ifdef PATM_LOG_PATCHINSTR 1091 DD PATM_PENDINGACTION 1092 DD 0 1093 %endif 1094 DD PATM_VMFLAGS 1095 DD 0 1096 DD PATM_INTERRUPTFLAG 1097 DD 0 1098 DD 0ffffffffh 986 DD PATM_PENDINGACTION, 0 987 %endif 988 DD PATM_VMFLAGS, 0 989 DD PATM_INTERRUPTFLAG, 0 990 DD 0ffffffffh, 0ffffffffh 1099 991 1100 992 … … 1104 996 BEGIN_PATCH_CODE_SECTION 1105 997 BEGINPROC PATMPushf16Replacement 1106 PATMPushf16Start:1107 998 mov dword [ss:PATM_INTERRUPTFLAG], 0 1108 999 DB 0x66 ; size override … … 1121 1012 popf 1122 1013 mov dword [ss:PATM_INTERRUPTFLAG], 1 1123 PATMPushf16End:1124 1014 ENDPROC PATMPushf16Replacement 1125 1015 … … 1127 1017 BEGIN_PATCH_RODATA_SECTION 1128 1018 GLOBALNAME g_patmPushf16Record 1129 RTCCPTR_DEF PATMPushf16Start 1130 DD 0 1131 DD 0 1132 DD 0 1133 DD PATMPushf16End - PATMPushf16Start 1134 DD 3 1135 DD PATM_INTERRUPTFLAG 1136 DD 0 1137 DD PATM_VMFLAGS 1138 DD 0 1139 DD PATM_INTERRUPTFLAG 1140 DD 0 1141 DD 0ffffffffh 1019 PATCHASMRECORD_INIT PATMPushf16Replacement, 3 1020 DD PATM_INTERRUPTFLAG, 0 1021 DD PATM_VMFLAGS, 0 1022 DD PATM_INTERRUPTFLAG, 0 1023 DD 0ffffffffh, 0ffffffffh 1142 1024 1143 1025 … … 1147 1029 BEGIN_PATCH_CODE_SECTION 1148 1030 BEGINPROC PATMPushCSReplacement 1149 PATMPushCSStart:1150 1031 mov dword [ss:PATM_INTERRUPTFLAG], 0 1151 1032 push cs … … 1165 1046 PATMPushCSJump: 1166 1047 DD PATM_JUMPDELTA 1167 PATMPushCSEnd:1168 1048 ENDPROC PATMPushCSReplacement 1169 1049 … … 1171 1051 BEGIN_PATCH_RODATA_SECTION 1172 1052 GLOBALNAME g_patmPushCSRecord 1173 RTCCPTR_DEF PATMPushCSStart 1174 DD PATMPushCSJump - PATMPushCSStart 1175 DD 0 1176 DD 0 1177 DD PATMPushCSEnd - PATMPushCSStart 1178 DD 2 1179 DD PATM_INTERRUPTFLAG 1180 DD 0 1181 DD PATM_INTERRUPTFLAG 1182 DD 0 1183 DD 0ffffffffh 1184 1185 1186 ;;**************************************************** 1187 ;; Abstract: 1188 ;; 1189 ;; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0 1190 ;; then 1191 ;; if return to ring 0 (iretstack.new_cs & 3 == 0) 1192 ;; then 1193 ;; if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0 1194 ;; then 1195 ;; iretstack.new_cs |= 1 1196 ;; else 1197 ;; int 3 1198 ;; endif 1199 ;; uVMFlags &= ~X86_EFL_IF 1200 ;; iret 1201 ;; else 1202 ;; int 3 1203 ;;**************************************************** 1204 ;; 1053 PATCHASMRECORD_INIT_JUMP PATMPushCSReplacement, PATMPushCSJump, 2 1054 DD PATM_INTERRUPTFLAG, 0 1055 DD PATM_INTERRUPTFLAG, 0 1056 DD 0ffffffffh, 0ffffffffh 1057 1058 1059 ; 1060 ; 1061 ;**************************************************** 1062 ; Abstract: 1063 ; 1064 ; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0 1065 ; then 1066 ; if return to ring 0 (iretstack.new_cs & 3 == 0) 1067 ; then 1068 ; if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0 1069 ; then 1070 ; iretstack.new_cs |= 1 1071 ; else 1072 ; int 3 1073 ; endif 1074 ; uVMFlags &= ~X86_EFL_IF 1075 ; iret 1076 ; else 1077 ; int 3 1078 ;**************************************************** 1079 ; 1205 1080 ; Stack: 1206 1081 ; … … 1217 1092 BEGIN_PATCH_CODE_SECTION 1218 1093 BEGINPROC PATMIretReplacement 1219 PATMIretStart:1220 1094 mov dword [ss:PATM_INTERRUPTFLAG], 0 1221 1095 pushfd … … 1380 1254 TIMES PATCHJUMPTABLE_SIZE DB 0 ; lookup slots 1381 1255 1382 PATMIretEnd:1383 1256 ENDPROC PATMIretReplacement 1384 1257 … … 1386 1259 BEGIN_PATCH_RODATA_SECTION 1387 1260 GLOBALNAME g_patmIretRecord 1388 RTCCPTR_DEF PATMIretStart1389 DD 01390 DD 01391 DD 01392 DD PATMIretEnd- PATMIretStart1393 1261 %ifdef PATM_LOG_PATCHIRET 1394 DD261262 PATCHASMRECORD_INIT PATMIretReplacement, 26 1395 1263 %else 1396 DD 25 1397 %endif 1398 DD PATM_INTERRUPTFLAG 1399 DD 0 1264 PATCHASMRECORD_INIT PATMIretReplacement, 25 1265 %endif 1266 DD PATM_INTERRUPTFLAG, 0 1400 1267 %ifdef PATM_LOG_PATCHIRET 1401 DD PATM_PENDINGACTION 1402 DD 0 1403 %endif 1404 DD PATM_VM_FORCEDACTIONS 1405 DD 0 1406 DD PATM_TEMP_EAX 1407 DD 0 1408 DD PATM_TEMP_ECX 1409 DD 0 1410 DD PATM_TEMP_EDI 1411 DD 0 1412 DD PATM_TEMP_RESTORE_FLAGS 1413 DD 0 1414 DD PATM_PENDINGACTION 1415 DD 0 1416 DD PATM_CURINSTRADDR 1417 DD 0 1418 DD PATM_VMFLAGS 1419 DD 0 1420 DD PATM_VMFLAGS 1421 DD 0 1422 DD PATM_VMFLAGS 1423 DD 0 1424 DD PATM_INHIBITIRQADDR 1425 DD 0 1426 DD PATM_CURINSTRADDR 1427 DD 0 1428 DD PATM_INTERRUPTFLAG 1429 DD 0 1430 DD PATM_INTERRUPTFLAG 1431 DD 0 1432 DD PATM_INTERRUPTFLAG 1433 DD 0 1434 DD PATM_FIXUP 1435 DD PATMIretTable - PATMIretStart 1436 DD PATM_IRET_FUNCTION 1437 DD 0 1438 DD PATM_VMFLAGS 1439 DD 0 1440 DD PATM_VMFLAGS 1441 DD 0 1442 DD PATM_VMFLAGS 1443 DD 0 1444 DD PATM_TEMP_EAX 1445 DD 0 1446 DD PATM_TEMP_ECX 1447 DD 0 1448 DD PATM_TEMP_RESTORE_FLAGS 1449 DD 0 1450 DD PATM_PENDINGACTION 1451 DD 0 1452 DD 0ffffffffh 1453 1454 1455 ;;**************************************************** 1456 ;; Abstract: 1457 ;; 1458 ;; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0 1459 ;; then 1460 ;; if return to ring 0 (iretstack.new_cs & 3 == 0) 1461 ;; then 1462 ;; if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0 1463 ;; then 1464 ;; iretstack.new_cs |= 1 1465 ;; else 1466 ;; int 3 1467 ;; endif 1468 ;; uVMFlags &= ~X86_EFL_IF 1469 ;; iret 1470 ;; else 1471 ;; int 3 1472 ;;**************************************************** 1473 ;; 1268 DD PATM_PENDINGACTION, 0 1269 %endif 1270 DD PATM_VM_FORCEDACTIONS, 0 1271 DD PATM_TEMP_EAX, 0 1272 DD PATM_TEMP_ECX, 0 1273 DD PATM_TEMP_EDI, 0 1274 DD PATM_TEMP_RESTORE_FLAGS, 0 1275 DD PATM_PENDINGACTION, 0 1276 DD PATM_CURINSTRADDR, 0 1277 DD PATM_VMFLAGS, 0 1278 DD PATM_VMFLAGS, 0 1279 DD PATM_VMFLAGS, 0 1280 DD PATM_INHIBITIRQADDR, 0 1281 DD PATM_CURINSTRADDR, 0 1282 DD PATM_INTERRUPTFLAG, 0 1283 DD PATM_INTERRUPTFLAG, 0 1284 DD PATM_INTERRUPTFLAG, 0 1285 DD PATM_FIXUP, PATMIretTable - NAME(PATMIretReplacement) 1286 DD PATM_IRET_FUNCTION, 0 1287 DD PATM_VMFLAGS, 0 1288 DD PATM_VMFLAGS, 0 1289 DD PATM_VMFLAGS, 0 1290 DD PATM_TEMP_EAX, 0 1291 DD PATM_TEMP_ECX, 0 1292 DD PATM_TEMP_RESTORE_FLAGS, 0 1293 DD PATM_PENDINGACTION, 0 1294 DD 0ffffffffh, 0ffffffffh 1295 1296 1297 ; 1298 ; 1299 ;**************************************************** 1300 ; Abstract: 1301 ; 1302 ; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0 1303 ; then 1304 ; if return to ring 0 (iretstack.new_cs & 3 == 0) 1305 ; then 1306 ; if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0 1307 ; then 1308 ; iretstack.new_cs |= 1 1309 ; else 1310 ; int 3 1311 ; endif 1312 ; uVMFlags &= ~X86_EFL_IF 1313 ; iret 1314 ; else 1315 ; int 3 1316 ;**************************************************** 1317 ; 1474 1318 ; Stack: 1475 1319 ; … … 1483 1327 ; esp + 4 - CS 1484 1328 ; esp - EIP 1485 ; ;1329 ; 1486 1330 BEGIN_PATCH_CODE_SECTION 1487 1331 BEGINPROC PATMIretRing1Replacement 1488 PATMIretRing1Start:1489 1332 mov dword [ss:PATM_INTERRUPTFLAG], 0 1490 1333 pushfd … … 1679 1522 TIMES PATCHJUMPTABLE_SIZE DB 0 ; lookup slots 1680 1523 1681 PATMIretRing1End:1682 1524 ENDPROC PATMIretRing1Replacement 1683 1525 … … 1685 1527 BEGIN_PATCH_RODATA_SECTION 1686 1528 GLOBALNAME g_patmIretRing1Record 1687 RTCCPTR_DEF PATMIretRing1Start1688 DD 01689 DD 01690 DD 01691 DD PATMIretRing1End- PATMIretRing1Start1692 1529 %ifdef PATM_LOG_PATCHIRET 1693 DD261530 PATCHASMRECORD_INIT PATMIretRing1Replacement, 26 1694 1531 %else 1695 DD 25 1696 %endif 1697 DD PATM_INTERRUPTFLAG 1698 DD 0 1699 %ifdef PATM_LOG_PATCHIRET 1700 DD PATM_PENDINGACTION 1701 DD 0 1702 %endif 1703 DD PATM_VM_FORCEDACTIONS 1704 DD 0 1705 DD PATM_TEMP_EAX 1706 DD 0 1707 DD PATM_TEMP_ECX 1708 DD 0 1709 DD PATM_TEMP_EDI 1710 DD 0 1711 DD PATM_TEMP_RESTORE_FLAGS 1712 DD 0 1713 DD PATM_PENDINGACTION 1714 DD 0 1715 DD PATM_CURINSTRADDR 1716 DD 0 1717 DD PATM_VMFLAGS 1718 DD 0 1719 DD PATM_VMFLAGS 1720 DD 0 1721 DD PATM_VMFLAGS 1722 DD 0 1723 DD PATM_INHIBITIRQADDR 1724 DD 0 1725 DD PATM_CURINSTRADDR 1726 DD 0 1727 DD PATM_INTERRUPTFLAG 1728 DD 0 1729 DD PATM_INTERRUPTFLAG 1730 DD 0 1731 DD PATM_INTERRUPTFLAG 1732 DD 0 1733 DD PATM_FIXUP 1734 DD PATMIretRing1Table - PATMIretRing1Start 1735 DD PATM_IRET_FUNCTION 1736 DD 0 1737 DD PATM_VMFLAGS 1738 DD 0 1739 DD PATM_VMFLAGS 1740 DD 0 1741 DD PATM_VMFLAGS 1742 DD 0 1743 DD PATM_TEMP_EAX 1744 DD 0 1745 DD PATM_TEMP_ECX 1746 DD 0 1747 DD PATM_TEMP_RESTORE_FLAGS 1748 DD 0 1749 DD PATM_PENDINGACTION 1750 DD 0 1751 DD 0ffffffffh 1532 PATCHASMRECORD_INIT PATMIretRing1Replacement, 25 1533 %endif 1534 DD PATM_INTERRUPTFLAG, 0 1535 %ifdef PATM_LOG_PATCHIRET 1536 DD PATM_PENDINGACTION, 0 1537 %endif 1538 DD PATM_VM_FORCEDACTIONS, 0 1539 DD PATM_TEMP_EAX, 0 1540 DD PATM_TEMP_ECX, 0 1541 DD PATM_TEMP_EDI, 0 1542 DD PATM_TEMP_RESTORE_FLAGS, 0 1543 DD PATM_PENDINGACTION, 0 1544 DD PATM_CURINSTRADDR, 0 1545 DD PATM_VMFLAGS, 0 1546 DD PATM_VMFLAGS, 0 1547 DD PATM_VMFLAGS, 0 1548 DD PATM_INHIBITIRQADDR, 0 1549 DD PATM_CURINSTRADDR, 0 1550 DD PATM_INTERRUPTFLAG, 0 1551 DD PATM_INTERRUPTFLAG, 0 1552 DD PATM_INTERRUPTFLAG, 0 1553 DD PATM_FIXUP, PATMIretRing1Table - NAME(PATMIretRing1Replacement) 1554 DD PATM_IRET_FUNCTION, 0 1555 DD PATM_VMFLAGS, 0 1556 DD PATM_VMFLAGS, 0 1557 DD PATM_VMFLAGS, 0 1558 DD PATM_TEMP_EAX, 0 1559 DD PATM_TEMP_ECX, 0 1560 DD PATM_TEMP_RESTORE_FLAGS, 0 1561 DD PATM_PENDINGACTION, 0 1562 DD 0ffffffffh, 0ffffffffh 1752 1563 1753 1564 … … 1771 1582 BEGIN_PATCH_CODE_SECTION 1772 1583 BEGINPROC PATMIretFunction 1773 PATMIretFunction_Start:1774 1584 push ecx 1775 1585 push edx … … 1829 1639 pop ecx 1830 1640 ret 1831 1832 PATMIretFunction_End:1833 1641 ENDPROC PATMIretFunction 1834 1642 1835 1643 BEGIN_PATCH_RODATA_SECTION 1836 1644 GLOBALNAME g_patmIretFunctionRecord 1837 RTCCPTR_DEF PATMIretFunction_Start 1838 DD 0 1839 DD 0 1840 DD 0 1841 DD PATMIretFunction_End - PATMIretFunction_Start 1842 DD 2 1843 DD PATM_PENDINGACTION 1844 DD 0 1845 DD PATM_PATCHBASE 1846 DD 0 1847 DD 0ffffffffh 1645 PATCHASMRECORD_INIT PATMIretFunction, 2 1646 DD PATM_PENDINGACTION, 0 1647 DD PATM_PATCHBASE, 0 1648 DD 0ffffffffh, 0ffffffffh 1848 1649 1849 1650 … … 1853 1654 BEGIN_PATCH_CODE_SECTION 1854 1655 BEGINPROC PATMCpuidReplacement 1855 PATMCpuidStart:1856 1656 mov dword [ss:PATM_INTERRUPTFLAG], 0 1857 1657 pushf … … 1899 1699 popf 1900 1700 mov dword [ss:PATM_INTERRUPTFLAG], 1 1901 1902 PATMCpuidEnd:1903 1701 ENDPROC PATMCpuidReplacement 1904 1702 … … 1906 1704 BEGIN_PATCH_RODATA_SECTION 1907 1705 GLOBALNAME g_patmCpuidRecord 1908 istruc PATCHASMRECORD 1909 at PATCHASMRECORD.pbFunction, RTCCPTR_DEF PATMCpuidStart 1910 at PATCHASMRECORD.offJump, DD 0 1911 at PATCHASMRECORD.offRelJump, DD 0 1912 at PATCHASMRECORD.offSizeOverride,DD 0 1913 at PATCHASMRECORD.cbFunction, DD PATMCpuidEnd- PATMCpuidStart 1914 at PATCHASMRECORD.cRelocs, DD 9 1915 iend 1706 PATCHASMRECORD_INIT PATMCpuidReplacement, 9 1916 1707 DD PATM_INTERRUPTFLAG, 0 ; 0 1917 1708 DD PATM_CPUID_STD_MAX, 0 ; 1 … … 1931 1722 BEGIN_PATCH_CODE_SECTION 1932 1723 BEGINPROC PATMJEcxReplacement 1933 PATMJEcxStart:1934 1724 mov dword [ss:PATM_INTERRUPTFLAG], 0 1935 1725 pushfd … … 1948 1738 popfd 1949 1739 mov dword [ss:PATM_INTERRUPTFLAG], 1 1950 PATMJEcxEnd:1951 1740 ENDPROC PATMJEcxReplacement 1952 1741 1953 1742 ; Patch record for 'JEcx' 1954 1743 BEGIN_PATCH_RODATA_SECTION 1955 GLOBALNAME g_patmJEcxRecord 1956 RTCCPTR_DEF PATMJEcxStart 1957 DD 0 1958 DD PATMJEcxJump - PATMJEcxStart 1959 DD PATMJEcxSizeOverride - PATMJEcxStart 1960 DD PATMJEcxEnd- PATMJEcxStart 1961 DD 3 1962 DD PATM_INTERRUPTFLAG 1963 DD 0 1964 DD PATM_INTERRUPTFLAG 1965 DD 0 1966 DD PATM_INTERRUPTFLAG 1967 DD 0 1744 GLOBALNAME g_patmJEcxRecord 1745 PATCHASMRECORD_INIT_EX PATMJEcxReplacement, , PATMJEcxJump, PATMJEcxSizeOverride, 3 1746 DD PATM_INTERRUPTFLAG, 0 1747 DD PATM_INTERRUPTFLAG, 0 1748 DD PATM_INTERRUPTFLAG, 0 1968 1749 DD 0ffffffffh, 0ffffffffh 1969 1750 … … 1974 1755 BEGIN_PATCH_CODE_SECTION 1975 1756 BEGINPROC PATMLoopReplacement 1976 PATMLoopStart:1977 1757 mov dword [ss:PATM_INTERRUPTFLAG], 0 1978 1758 pushfd … … 1991 1771 popfd 1992 1772 mov dword [ss:PATM_INTERRUPTFLAG], 1 1993 PATMLoopEnd:1994 1773 ENDPROC PATMLoopReplacement 1995 1774 … … 1997 1776 BEGIN_PATCH_RODATA_SECTION 1998 1777 GLOBALNAME g_patmLoopRecord 1999 RTCCPTR_DEF PATMLoopStart 2000 DD 0 2001 DD PATMLoopJump - PATMLoopStart 2002 DD PATMLoopSizeOverride - PATMLoopStart 2003 DD PATMLoopEnd- PATMLoopStart 2004 DD 3 2005 DD PATM_INTERRUPTFLAG 2006 DD 0 2007 DD PATM_INTERRUPTFLAG 2008 DD 0 2009 DD PATM_INTERRUPTFLAG 2010 DD 0 2011 DD 0ffffffffh, 0ffffffffh 2012 2013 2014 ; 2015 ; 1778 PATCHASMRECORD_INIT_EX PATMLoopReplacement, , PATMLoopJump, PATMLoopSizeOverride, 3 1779 DD PATM_INTERRUPTFLAG, 0 1780 DD PATM_INTERRUPTFLAG, 0 1781 DD PATM_INTERRUPTFLAG, 0 1782 DD 0ffffffffh, 0ffffffffh 1783 1784 1785 ; 1786 ; jump if ZF=1 AND (E)CX != 0 2016 1787 ; 2017 1788 BEGIN_PATCH_CODE_SECTION 2018 1789 BEGINPROC PATMLoopZReplacement 2019 PATMLoopZStart: 2020 ; jump if ZF=1 AND (E)CX != 0 2021 2022 mov dword [ss:PATM_INTERRUPTFLAG], 0 2023 jnz PATMLoopZEnd 1790 mov dword [ss:PATM_INTERRUPTFLAG], 0 1791 jnz NAME(PATMLoopZReplacement_EndProc) 2024 1792 pushfd 2025 1793 PATMLoopZSizeOverride: … … 2037 1805 popfd 2038 1806 mov dword [ss:PATM_INTERRUPTFLAG], 1 2039 PATMLoopZEnd:2040 1807 ENDPROC PATMLoopZReplacement 2041 1808 … … 2043 1810 BEGIN_PATCH_RODATA_SECTION 2044 1811 GLOBALNAME g_patmLoopZRecord 2045 RTCCPTR_DEF PATMLoopZStart 2046 DD 0 2047 DD PATMLoopZJump - PATMLoopZStart 2048 DD PATMLoopZSizeOverride - PATMLoopZStart 2049 DD PATMLoopZEnd- PATMLoopZStart 2050 DD 3 2051 DD PATM_INTERRUPTFLAG 2052 DD 0 2053 DD PATM_INTERRUPTFLAG 2054 DD 0 2055 DD PATM_INTERRUPTFLAG 2056 DD 0 2057 DD 0ffffffffh, 0ffffffffh 2058 2059 2060 ; 2061 ; 1812 PATCHASMRECORD_INIT_EX PATMLoopZReplacement, , PATMLoopZJump, PATMLoopZSizeOverride, 3 1813 DD PATM_INTERRUPTFLAG, 0 1814 DD PATM_INTERRUPTFLAG, 0 1815 DD PATM_INTERRUPTFLAG, 0 1816 DD 0ffffffffh, 0ffffffffh 1817 1818 1819 ; 1820 ; jump if ZF=0 AND (E)CX != 0 2062 1821 ; 2063 1822 BEGIN_PATCH_CODE_SECTION 2064 1823 BEGINPROC PATMLoopNZReplacement 2065 PATMLoopNZStart: 2066 ; jump if ZF=0 AND (E)CX != 0 2067 2068 mov dword [ss:PATM_INTERRUPTFLAG], 0 2069 jz PATMLoopNZEnd 1824 mov dword [ss:PATM_INTERRUPTFLAG], 0 1825 jz NAME(PATMLoopNZReplacement_EndProc) 2070 1826 pushfd 2071 1827 PATMLoopNZSizeOverride: … … 2083 1839 popfd 2084 1840 mov dword [ss:PATM_INTERRUPTFLAG], 1 2085 PATMLoopNZEnd:2086 1841 ENDPROC PATMLoopNZReplacement 2087 1842 … … 2089 1844 BEGIN_PATCH_RODATA_SECTION 2090 1845 GLOBALNAME g_patmLoopNZRecord 2091 RTCCPTR_DEF PATMLoopNZStart 2092 DD 0 2093 DD PATMLoopNZJump - PATMLoopNZStart 2094 DD PATMLoopNZSizeOverride - PATMLoopNZStart 2095 DD PATMLoopNZEnd- PATMLoopNZStart 2096 DD 3 2097 DD PATM_INTERRUPTFLAG 2098 DD 0 2099 DD PATM_INTERRUPTFLAG 2100 DD 0 2101 DD PATM_INTERRUPTFLAG 2102 DD 0 1846 PATCHASMRECORD_INIT_EX PATMLoopNZReplacement, , PATMLoopNZJump, PATMLoopNZSizeOverride, 3 1847 DD PATM_INTERRUPTFLAG, 0 1848 DD PATM_INTERRUPTFLAG, 0 1849 DD PATM_INTERRUPTFLAG, 0 2103 1850 DD 0ffffffffh, 0ffffffffh 2104 1851 … … 2115 1862 ; 2116 1863 ; @note NEVER change this without bumping the SSM version 1864 ; 2117 1865 BEGIN_PATCH_CODE_SECTION 2118 1866 BEGINPROC PATMLookupAndCall 2119 PATMLookupAndCallStart:2120 1867 push eax 2121 1868 push edx … … 2217 1964 ; the called function will set PATM_INTERRUPTFLAG (!!) 2218 1965 jmp dword [ss:PATM_CALL_PATCH_TARGET_ADDR] 2219 2220 PATMLookupAndCallEnd: 2221 ; returning here -> do not add code here or after the jmp!!!!! 1966 ; returning here -> do not add code here or after the jmp!!!!! 2222 1967 ENDPROC PATMLookupAndCall 2223 1968 … … 2225 1970 BEGIN_PATCH_RODATA_SECTION 2226 1971 GLOBALNAME g_patmLookupAndCallRecord 2227 RTCCPTR_DEF PATMLookupAndCallStart2228 DD 02229 DD 02230 DD 02231 DD PATMLookupAndCallEnd - PATMLookupAndCallStart2232 1972 %ifdef PATM_LOG_PATCHINSTR 2233 DD101973 PATCHASMRECORD_INIT PATMLookupAndCall, 10 2234 1974 %else 2235 DD 9 2236 %endif 2237 DD PATM_CALL_RETURN_ADDR 2238 DD 0 2239 DD PATM_PENDINGACTION 2240 DD 0 2241 DD PATM_PATCHBASE 2242 DD 0 2243 DD PATM_STACKPTR 2244 DD 0 2245 DD PATM_STACKBASE 2246 DD 0 2247 DD PATM_STACKBASE_GUEST 2248 DD 0 2249 DD PATM_CALL_PATCH_TARGET_ADDR 2250 DD 0 2251 %ifdef PATM_LOG_PATCHINSTR 2252 DD PATM_PENDINGACTION 2253 DD 0 2254 %endif 2255 DD PATM_CALL_RETURN_ADDR 2256 DD 0 2257 DD PATM_CALL_PATCH_TARGET_ADDR 2258 DD 0 1975 PATCHASMRECORD_INIT PATMLookupAndCall, 9 1976 %endif 1977 DD PATM_CALL_RETURN_ADDR, 0 1978 DD PATM_PENDINGACTION, 0 1979 DD PATM_PATCHBASE, 0 1980 DD PATM_STACKPTR, 0 1981 DD PATM_STACKBASE, 0 1982 DD PATM_STACKBASE_GUEST, 0 1983 DD PATM_CALL_PATCH_TARGET_ADDR, 0 1984 %ifdef PATM_LOG_PATCHINSTR 1985 DD PATM_PENDINGACTION, 0 1986 %endif 1987 DD PATM_CALL_RETURN_ADDR, 0 1988 DD PATM_CALL_PATCH_TARGET_ADDR, 0 2259 1989 DD 0ffffffffh, 0ffffffffh 2260 1990 … … 2269 1999 ; 2270 2000 ; @note NEVER change this without bumping the SSM version 2001 ; 2271 2002 BEGIN_PATCH_CODE_SECTION 2272 2003 BEGINPROC PATMLookupAndJump 2273 PATMLookupAndJumpStart:2274 2004 push eax 2275 2005 push edx … … 2337 2067 ; the jump destination will set PATM_INTERRUPTFLAG (!!) 2338 2068 jmp dword [ss:PATM_TEMP_EAX] ; call duplicated patch destination address 2339 2340 PATMLookupAndJumpEnd:2341 2069 ENDPROC PATMLookupAndJump 2342 2070 … … 2344 2072 BEGIN_PATCH_RODATA_SECTION 2345 2073 GLOBALNAME g_patmLookupAndJumpRecord 2346 RTCCPTR_DEF PATMLookupAndJumpStart 2347 DD 0 2348 DD 0 2349 DD 0 2350 DD PATMLookupAndJumpEnd - PATMLookupAndJumpStart 2351 DD 5 2352 DD PATM_PENDINGACTION 2353 DD 0 2354 DD PATM_PATCHBASE 2355 DD 0 2356 DD PATM_TEMP_EAX 2357 DD 0 2358 DD PATM_TEMP_EFLAGS 2359 DD 0 2360 DD PATM_TEMP_EAX 2361 DD 0 2074 PATCHASMRECORD_INIT PATMLookupAndJump, 5 2075 DD PATM_PENDINGACTION, 0 2076 DD PATM_PATCHBASE, 0 2077 DD PATM_TEMP_EAX, 0 2078 DD PATM_TEMP_EFLAGS, 0 2079 DD PATM_TEMP_EAX, 0 2362 2080 DD 0ffffffffh, 0ffffffffh 2363 2081 … … 2370 2088 BEGIN_PATCH_CODE_SECTION 2371 2089 BEGINPROC PATMCall 2372 PATMCallStart:2373 2090 pushfd 2374 2091 push PATM_FIXUP ; fixup for jump table below … … 2385 2102 %ifdef DEBUG 2386 2103 ; for disassembly 2387 jmp PATMCallEnd2104 jmp NAME(PATMCall_EndProc) 2388 2105 %endif 2389 2106 … … 2395 2112 TIMES PATCHDIRECTJUMPTABLE_SIZE DB 0 ; only one lookup slot 2396 2113 2397 PATMCallEnd: 2398 ; returning here -> do not add code here or after the jmp!!!!! 2114 ; returning here -> do not add code here or after the jmp!!!!! 2399 2115 ENDPROC PATMCall 2400 2116 … … 2402 2118 BEGIN_PATCH_RODATA_SECTION 2403 2119 GLOBALNAME g_patmCallRecord 2404 RTCCPTR_DEF PATMCallStart 2405 DD 0 2406 DD 0 2407 DD 0 2408 DD PATMCallEnd - PATMCallStart 2409 DD 5 2410 DD PATM_FIXUP 2411 DD PATMCallTable - PATMCallStart 2412 DD PATM_PATCHNEXTBLOCK 2413 DD 0 2414 DD PATM_RETURNADDR 2415 DD 0 2416 DD PATM_LOOKUP_AND_CALL_FUNCTION 2417 DD 0 2418 DD PATM_INTERRUPTFLAG 2419 DD 0 2120 PATCHASMRECORD_INIT PATMCall, 5 2121 DD PATM_FIXUP, PATMCallTable - NAME(PATMCall) 2122 DD PATM_PATCHNEXTBLOCK, 0 2123 DD PATM_RETURNADDR, 0 2124 DD PATM_LOOKUP_AND_CALL_FUNCTION, 0 2125 DD PATM_INTERRUPTFLAG, 0 2420 2126 DD 0ffffffffh, 0ffffffffh 2421 2127 … … 2427 2133 BEGIN_PATCH_CODE_SECTION 2428 2134 BEGINPROC PATMCallIndirect 2429 PATMCallIndirectStart:2430 2135 pushfd 2431 2136 push PATM_FIXUP ; fixup for jump table below … … 2442 2147 %ifdef DEBUG 2443 2148 ; for disassembly 2444 jmp PATMCallIndirectEnd2149 jmp NAME(PATMCallIndirect_EndProc) 2445 2150 %endif 2446 2151 … … 2452 2157 TIMES PATCHJUMPTABLE_SIZE DB 0 ; lookup slots 2453 2158 2454 PATMCallIndirectEnd: 2455 ; returning here -> do not add code here or after the jmp!!!!! 2159 ; returning here -> do not add code here or after the jmp!!!!! 2456 2160 ENDPROC PATMCallIndirect 2457 2161 … … 2459 2163 BEGIN_PATCH_RODATA_SECTION 2460 2164 GLOBALNAME g_patmCallIndirectRecord 2461 RTCCPTR_DEF PATMCallIndirectStart 2462 DD 0 2463 DD 0 2464 DD 0 2465 DD PATMCallIndirectEnd - PATMCallIndirectStart 2466 DD 5 2467 DD PATM_FIXUP 2468 DD PATMCallIndirectTable - PATMCallIndirectStart 2469 DD PATM_PATCHNEXTBLOCK 2470 DD 0 2471 DD PATM_RETURNADDR 2472 DD 0 2473 DD PATM_LOOKUP_AND_CALL_FUNCTION 2474 DD 0 2475 DD PATM_INTERRUPTFLAG 2476 DD 0 2165 PATCHASMRECORD_INIT PATMCallIndirect, 5 2166 DD PATM_FIXUP, PATMCallIndirectTable - NAME(PATMCallIndirect) 2167 DD PATM_PATCHNEXTBLOCK, 0 2168 DD PATM_RETURNADDR, 0 2169 DD PATM_LOOKUP_AND_CALL_FUNCTION, 0 2170 DD PATM_INTERRUPTFLAG, 0 2477 2171 DD 0ffffffffh, 0ffffffffh 2478 2172 … … 2485 2179 BEGIN_PATCH_CODE_SECTION 2486 2180 BEGINPROC PATMJumpIndirect 2487 PATMJumpIndirectStart:2488 2181 ; save flags (just to be sure) 2489 2182 pushfd … … 2505 2198 %ifdef DEBUG 2506 2199 ; for disassembly 2507 jmp PATMJumpIndirectEnd2200 jmp NAME(PATMJumpIndirect_EndProc) 2508 2201 %endif 2509 2202 … … 2515 2208 TIMES PATCHJUMPTABLE_SIZE DB 0 ; lookup slots 2516 2209 2517 PATMJumpIndirectEnd: 2518 ; returning here -> do not add code here or after the jmp!!!!! 2210 ; returning here -> do not add code here or after the jmp!!!!! 2519 2211 ENDPROC PATMJumpIndirect 2520 2212 … … 2522 2214 BEGIN_PATCH_RODATA_SECTION 2523 2215 GLOBALNAME g_patmJumpIndirectRecord 2524 RTCCPTR_DEF PATMJumpIndirectStart 2525 DD 0 2526 DD 0 2527 DD 0 2528 DD PATMJumpIndirectEnd - PATMJumpIndirectStart 2529 DD 5 2530 DD PATM_TEMP_EFLAGS 2531 DD 0 2532 DD PATM_FIXUP 2533 DD PATMJumpIndirectTable - PATMJumpIndirectStart 2534 DD PATM_LOOKUP_AND_JUMP_FUNCTION 2535 DD 0 2536 DD PATM_TEMP_EFLAGS 2537 DD 0 2538 DD PATM_INTERRUPTFLAG 2539 DD 0 2216 PATCHASMRECORD_INIT PATMJumpIndirect, 5 2217 DD PATM_TEMP_EFLAGS, 0 2218 DD PATM_FIXUP, PATMJumpIndirectTable - NAME(PATMJumpIndirect) 2219 DD PATM_LOOKUP_AND_JUMP_FUNCTION, 0 2220 DD PATM_TEMP_EFLAGS, 0 2221 DD PATM_INTERRUPTFLAG, 0 2540 2222 DD 0ffffffffh, 0ffffffffh 2541 2223 … … 2546 2228 BEGIN_PATCH_CODE_SECTION 2547 2229 BEGINPROC PATMRet 2548 PATMRet_Start:2549 2230 ; probe stack here as we can't recover from page faults later on 2550 2231 not dword [esp-32] … … 2583 2264 ; caller will duplicate the ret or ret n instruction 2584 2265 ; the patched call will set PATM_INTERRUPTFLAG after the return! 2585 PATMRet_End:2586 2266 ENDPROC PATMRet 2587 2267 2588 2268 BEGIN_PATCH_RODATA_SECTION 2589 2269 GLOBALNAME g_patmRetRecord 2590 RTCCPTR_DEF PATMRet_Start 2591 DD 0 2592 DD 0 2593 DD 0 2594 DD PATMRet_End - PATMRet_Start 2595 DD 4 2596 DD PATM_INTERRUPTFLAG 2597 DD 0 2598 DD PATM_FIXUP 2599 DD PATMRetTable - PATMRet_Start 2600 DD PATM_RETURN_FUNCTION 2601 DD 0 2602 DD PATM_INTERRUPTFLAG 2603 DD 0 2270 PATCHASMRECORD_INIT PATMRet, 4 2271 DD PATM_INTERRUPTFLAG, 0 2272 DD PATM_FIXUP, PATMRetTable - NAME(PATMRet) 2273 DD PATM_RETURN_FUNCTION, 0 2274 DD PATM_INTERRUPTFLAG, 0 2604 2275 DD 0ffffffffh, 0ffffffffh 2605 2276 … … 2622 2293 ; 2623 2294 ; @note NEVER change this without bumping the SSM version 2295 ; 2624 2296 BEGIN_PATCH_CODE_SECTION 2625 2297 BEGINPROC PATMRetFunction 2626 PATMRetFunction_Start:2627 2298 push ecx 2628 2299 push edx … … 2749 2420 pop ecx 2750 2421 ret 2751 2752 PATMRetFunction_End:2753 2422 ENDPROC PATMRetFunction 2754 2423 2755 2424 BEGIN_PATCH_RODATA_SECTION 2756 2425 GLOBALNAME g_patmRetFunctionRecord 2757 RTCCPTR_DEF PATMRetFunction_Start2758 DD 02759 DD 02760 DD 02761 DD PATMRetFunction_End - PATMRetFunction_Start2762 2426 %ifdef PATM_LOG_PATCHINSTR 2763 DD92427 PATCHASMRECORD_INIT PATMRetFunction, 9 2764 2428 %else 2765 DD 7 2766 %endif 2767 DD PATM_STACKPTR 2768 DD 0 2769 DD PATM_STACKPTR 2770 DD 0 2771 DD PATM_STACKBASE_GUEST 2772 DD 0 2773 DD PATM_STACKBASE 2774 DD 0 2775 DD PATM_PATCHBASE 2776 DD 0 2777 %ifdef PATM_LOG_PATCHINSTR 2778 DD PATM_PENDINGACTION 2779 DD 0 2780 %endif 2781 DD PATM_PENDINGACTION 2782 DD 0 2783 DD PATM_PATCHBASE 2784 DD 0 2785 %ifdef PATM_LOG_PATCHINSTR 2786 DD PATM_PENDINGACTION 2787 DD 0 2429 PATCHASMRECORD_INIT PATMRetFunction, 7 2430 %endif 2431 DD PATM_STACKPTR, 0 2432 DD PATM_STACKPTR, 0 2433 DD PATM_STACKBASE_GUEST, 0 2434 DD PATM_STACKBASE, 0 2435 DD PATM_PATCHBASE, 0 2436 %ifdef PATM_LOG_PATCHINSTR 2437 DD PATM_PENDINGACTION, 0 2438 %endif 2439 DD PATM_PENDINGACTION, 0 2440 DD PATM_PATCHBASE, 0 2441 %ifdef PATM_LOG_PATCHINSTR 2442 DD PATM_PENDINGACTION, 0 2788 2443 %endif 2789 2444 DD 0ffffffffh, 0ffffffffh … … 2795 2450 BEGIN_PATCH_CODE_SECTION 2796 2451 BEGINPROC PATMCheckIF 2797 PATMCheckIF_Start:2798 2452 mov dword [ss:PATM_INTERRUPTFLAG], 0 2799 2453 pushf … … 2805 2459 popf 2806 2460 mov dword [ss:PATM_INTERRUPTFLAG], 1 2807 jmp PATMCheckIF_End2461 jmp NAME(PATMCheckIF_EndProc) 2808 2462 2809 2463 PATMCheckIF_Safe: … … 2827 2481 PATMCheckIF_Jump: 2828 2482 DD PATM_JUMPDELTA 2829 PATMCheckIF_End:2830 2483 ENDPROC PATMCheckIF 2831 2484 … … 2833 2486 BEGIN_PATCH_RODATA_SECTION 2834 2487 GLOBALNAME g_patmCheckIFRecord 2835 RTCCPTR_DEF PATMCheckIF_Start2836 DD PATMCheckIF_Jump - PATMCheckIF_Start2837 DD 02838 DD 02839 DD PATMCheckIF_End - PATMCheckIF_Start2840 2488 %ifdef PATM_LOG_PATCHINSTR 2841 DD62489 PATCHASMRECORD_INIT_JUMP PATMCheckIF, PATMCheckIF_Jump, 6 2842 2490 %else 2843 DD 5 2844 %endif 2845 DD PATM_INTERRUPTFLAG 2846 DD 0 2847 DD PATM_VMFLAGS 2848 DD 0 2849 DD PATM_INTERRUPTFLAG 2850 DD 0 2851 DD PATM_STACKPTR 2852 DD 0 2853 %ifdef PATM_LOG_PATCHINSTR 2854 DD PATM_PENDINGACTION 2855 DD 0 2856 %endif 2857 DD PATM_INTERRUPTFLAG 2858 DD 0 2491 PATCHASMRECORD_INIT_JUMP PATMCheckIF, PATMCheckIF_Jump, 5 2492 %endif 2493 DD PATM_INTERRUPTFLAG, 0 2494 DD PATM_VMFLAGS, 0 2495 DD PATM_INTERRUPTFLAG, 0 2496 DD PATM_STACKPTR, 0 2497 %ifdef PATM_LOG_PATCHINSTR 2498 DD PATM_PENDINGACTION, 0 2499 %endif 2500 DD PATM_INTERRUPTFLAG, 0 2859 2501 DD 0ffffffffh, 0ffffffffh 2860 2502 … … 2865 2507 BEGIN_PATCH_CODE_SECTION 2866 2508 BEGINPROC PATMJumpToGuest_IF1 2867 PATMJumpToGuest_IF1_Start:2868 2509 mov dword [ss:PATM_INTERRUPTFLAG], 0 2869 2510 pushf … … 2884 2525 PATMJumpToGuest_IF1_Jump: 2885 2526 DD PATM_JUMPDELTA 2886 PATMJumpToGuest_IF1_End:2887 2527 ENDPROC PATMJumpToGuest_IF1 2888 2528 … … 2890 2530 BEGIN_PATCH_RODATA_SECTION 2891 2531 GLOBALNAME PATMJumpToGuest_IF1Record 2892 RTCCPTR_DEF PATMJumpToGuest_IF1_Start 2893 DD PATMJumpToGuest_IF1_Jump - PATMJumpToGuest_IF1_Start 2894 DD 0 2895 DD 0 2896 DD PATMJumpToGuest_IF1_End - PATMJumpToGuest_IF1_Start 2897 DD 4 2898 DD PATM_INTERRUPTFLAG 2899 DD 0 2900 DD PATM_VMFLAGS 2901 DD 0 2902 DD PATM_INTERRUPTFLAG 2903 DD 0 2904 DD PATM_INTERRUPTFLAG 2905 DD 0 2532 PATCHASMRECORD_INIT_JUMP PATMJumpToGuest_IF1, PATMJumpToGuest_IF1_Jump, 4 2533 DD PATM_INTERRUPTFLAG, 0 2534 DD PATM_VMFLAGS, 0 2535 DD PATM_INTERRUPTFLAG, 0 2536 DD PATM_INTERRUPTFLAG, 0 2906 2537 DD 0ffffffffh, 0ffffffffh 2907 2538 … … 2912 2543 BEGIN_PATCH_CODE_SECTION 2913 2544 BEGINPROC PATMMovFromSS 2914 PATMMovFromSS_Start:2915 2545 push eax 2916 2546 pushfd … … 2924 2554 popfd 2925 2555 pop eax 2926 PATMMovFromSS_Start_End:2927 2556 ENDPROC PATMMovFromSS 2928 2557 2929 2558 BEGIN_PATCH_RODATA_SECTION 2930 2559 GLOBALNAME g_patmMovFromSSRecord 2931 RTCCPTR_DEF PATMMovFromSS_Start 2932 DD 0 2933 DD 0 2934 DD 0 2935 DD PATMMovFromSS_Start_End - PATMMovFromSS_Start 2936 DD 0 2937 DD 0ffffffffh, 0ffffffffh 2938 2939 2940 2941 2942 SECTION .rodata 2943 ; For assertion during init (to make absolutely sure the flags are in sync in vm.mac & vm.h) 2560 PATCHASMRECORD_INIT PATMMovFromSS, 0 2561 DD 0ffffffffh, 0ffffffffh 2562 2563 2564 2565 2566 ;; For assertion during init (to make absolutely sure the flags are in sync in vm.mac & vm.h) 2567 BEGINCONST 2944 2568 GLOBALNAME g_fPatmInterruptFlag 2945 2569 DD VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
Note:
See TracChangeset
for help on using the changeset viewer.

