- Timestamp:
- Jul 2, 2013 1:11:06 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 86900
- Location:
- trunk/src/VBox/VMM/VMMR0
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMR0A.asm
r46548 r46905 70 70 ; Use define because I'm too lazy to convert the struct. 71 71 %define XMM_OFF_IN_X86FXSTATE 160 72 73 74 ;; This is too risky wrt. stability, performance and correctness.75 ;%define VBOX_WITH_DR6_EXPERIMENT 176 72 77 73 ;; @def MYPUSHAD -
trunk/src/VBox/VMM/VMMR0/HMR0Mixed.mac
r46548 r46905 56 56 ; Manual save and restore: 57 57 ; - General purpose registers except RIP, RSP. 58 ; 58 ; 59 59 ; Trashed: 60 60 ; - CR2 (we don't care). … … 122 122 ; VT-x only saves the base of the GDTR & IDTR and resets the limit to 0xffff; we must restore the limit correctly! 123 123 %ifdef VMX_SKIP_GDTR_IDTR 124 sub xSP, xCB *2124 sub xSP, xCB * 2 125 125 sgdt [xSP] 126 126 127 sub xSP, xCB *2127 sub xSP, xCB * 2 128 128 sidt [xSP] 129 %endif130 131 %ifdef VBOX_WITH_DR6_EXPERIMENT132 ; Load DR6 - experiment, not safe!133 mov xBX, [xSI + CPUMCTX.dr6]134 mov dr6, xBX135 129 %endif 136 130 … … 182 176 %ifdef VMX_SKIP_GDTR_IDTR 183 177 lidt [xSP] 184 add xSP, xCB *2178 add xSP, xCB * 2 185 179 lgdt [xSP] 186 add xSP, xCB *2180 add xSP, xCB * 2 187 181 %endif 188 182 … … 208 202 %endif 209 203 210 %ifdef VBOX_WITH_DR6_EXPERIMENT211 ; Restore DR6 - experiment, not safe!212 mov xAX, dr6213 mov [ss:xDI + CPUMCTX.dr6], xAX214 %endif215 216 204 ; Restore TSS selector; must mark it as not busy before using ltr (!) 217 205 ; ASSUME that this is supposed to be 'BUSY'. (saves 20-30 ticks on the T42p) 218 206 ; @todo get rid of sgdt 219 207 pop xBX ; Saved TR 220 sub xSP, xCB *2208 sub xSP, xCB * 2 221 209 sgdt [xSP] 222 210 mov xAX, xBX … … 225 213 and dword [ss:xAX + 4], ~0200h ; Clear busy flag (2nd type2 bit). 226 214 ltr bx 227 add xSP, xCB *2215 add xSP, xCB * 2 228 216 229 217 pop xAX ; Saved LDTR … … 236 224 237 225 mov ecx, [ss:xDX + VMCSCACHE.Read.cValidEntries] 238 cmp ecx, 0 226 cmp ecx, 0 ; Can't happen 239 227 je .no_cached_reads 240 228 jmp .cached_read … … 274 262 %ifdef VMX_SKIP_GDTR_IDTR 275 263 lidt [xSP] 276 add xSP, xCB *2264 add xSP, xCB * 2 277 265 lgdt [xSP] 278 add xSP, xCB *2266 add xSP, xCB * 2 279 267 %endif 280 268 … … 283 271 ; @todo get rid of sgdt 284 272 pop xBX ; Saved TR 285 sub xSP, xCB *2273 sub xSP, xCB * 2 286 274 sgdt [xSP] 287 275 mov xAX, xBX … … 290 278 and dword [ss:xAX + 4], ~0200h ; Clear busy flag (2nd type2 bit). 291 279 ltr bx 292 add xSP, xCB *2280 add xSP, xCB * 2 293 281 294 282 pop xAX ; Saved LDTR … … 296 284 297 285 %ifdef VMX_USE_CACHED_VMCS_ACCESSES 298 add xSP, xCB *2 ; pCtx + pCache286 add xSP, xCB * 2 ; pCtx + pCache 299 287 %else 300 288 add xSP, xCB ; pCtx … … 313 301 %ifdef VMX_SKIP_GDTR_IDTR 314 302 lidt [xSP] 315 add xSP, xCB *2303 add xSP, xCB * 2 316 304 lgdt [xSP] 317 add xSP, xCB *2305 add xSP, xCB * 2 318 306 %endif 319 307 … … 322 310 ; @todo get rid of sgdt 323 311 pop xBX ; Saved TR 324 sub xSP, xCB *2312 sub xSP, xCB * 2 325 313 sgdt [xSP] 326 314 mov xAX, xBX … … 329 317 and dword [ss:xAX + 4], ~0200h ; Clear busy flag (2nd type2 bit). 330 318 ltr bx 331 add xSP, xCB *2319 add xSP, xCB * 2 332 320 333 321 pop xAX ; Saved LDTR … … 335 323 336 324 %ifdef VMX_USE_CACHED_VMCS_ACCESSES 337 add xSP, xCB *2 ; pCtx + pCache325 add xSP, xCB * 2 ; pCtx + pCache 338 326 %else 339 327 add xSP, xCB ; pCtx … … 372 360 ; First we have to save some final CPU context registers. 373 361 lea r10, [.vmlaunch64_done wrt rip] 374 mov rax, VMX_VMCS_HOST_RIP 362 mov rax, VMX_VMCS_HOST_RIP ; Return address (too difficult to continue after VMLAUNCH?). 375 363 vmwrite rax, r10 376 364 ; Note: assumes success! … … 378 366 ; Manual save and restore: 379 367 ; - General purpose registers except RIP, RSP. 380 ; 368 ; 381 369 ; Trashed: 382 370 ; - CR2 (we don't care). … … 451 439 ; VT-x only saves the base of the GDTR & IDTR and resets the limit to 0xffff; we must restore the limit correctly! 452 440 %ifdef VMX_SKIP_GDTR_IDTR 453 sub xSP, xCB *2441 sub xSP, xCB * 2 454 442 sgdt [xSP] 455 443 456 sub xSP, xCB *2444 sub xSP, xCB * 2 457 445 sidt [xSP] 458 %endif459 460 %ifdef VBOX_WITH_DR6_EXPERIMENT461 ; Load DR6 - experiment, not safe!462 mov xBX, [xSI + CPUMCTX.dr6]463 mov dr6, xBX464 446 %endif 465 447 … … 519 501 %ifdef VMX_SKIP_GDTR_IDTR 520 502 lidt [xSP] 521 add xSP, xCB *2503 add xSP, xCB * 2 522 504 lgdt [xSP] 523 add xSP, xCB *2505 add xSP, xCB * 2 524 506 %endif 525 507 … … 549 531 mov qword [xDI + CPUMCTX.edi], rax 550 532 551 %ifdef VBOX_WITH_DR6_EXPERIMENT552 ; Restore DR6 - experiment, not safe!553 mov xAX, dr6554 mov [xDI + CPUMCTX.dr6], xAX555 %endif556 557 533 ; Restore TSS selector; must mark it as not busy before using ltr (!) 558 534 ; ASSUME that this is supposed to be 'BUSY'. (saves 20-30 ticks on the T42p). 559 535 ; @todo get rid of sgdt 560 536 pop xBX ; Saved TR 561 sub xSP, xCB *2537 sub xSP, xCB * 2 562 538 sgdt [xSP] 563 539 mov xAX, xBX … … 566 542 and dword [xAX + 4], ~0200h ; Clear busy flag (2nd type2 bit). 567 543 ltr bx 568 add xSP, xCB *2544 add xSP, xCB * 2 569 545 570 546 pop xAX ; Saved LDTR … … 590 566 591 567 mov ecx, [xDX + VMCSCACHE.Read.cValidEntries] 592 cmp ecx, 0 568 cmp ecx, 0 ; Can't happen 593 569 je .no_cached_reads 594 570 jmp .cached_read … … 628 604 %ifdef VMX_SKIP_GDTR_IDTR 629 605 lidt [xSP] 630 add xSP, xCB *2606 add xSP, xCB * 2 631 607 lgdt [xSP] 632 add xSP, xCB *2608 add xSP, xCB * 2 633 609 %endif 634 610 … … 637 613 ; @todo get rid of sgdt 638 614 pop xBX ; Saved TR 639 sub xSP, xCB *2615 sub xSP, xCB * 2 640 616 sgdt [xSP] 641 617 mov xAX, xBX … … 644 620 and dword [xAX + 4], ~0200h ; Clear busy flag (2nd type2 bit). 645 621 ltr bx 646 add xSP, xCB *2622 add xSP, xCB * 2 647 623 648 624 pop xAX ; Saved LDTR … … 680 656 %ifdef VMX_SKIP_GDTR_IDTR 681 657 lidt [xSP] 682 add xSP, xCB *2658 add xSP, xCB * 2 683 659 lgdt [xSP] 684 add xSP, xCB *2660 add xSP, xCB * 2 685 661 %endif 686 662 … … 689 665 ; @todo get rid of sgdt 690 666 pop xBX ; Saved TR 691 sub xSP, xCB *2667 sub xSP, xCB * 2 692 668 sgdt [xSP] 693 669 mov xAX, xBX … … 696 672 and dword [xAX + 4], ~0200h ; Clear busy flag (2nd type2 bit). 697 673 ltr bx 698 add xSP, xCB *2674 add xSP, xCB * 2 699 675 700 676 pop xAX ; Saved LDTR … … 759 735 ; Manual save and restore: 760 736 ; - General purpose registers except RIP, RSP, RAX 761 ; 737 ; 762 738 ; Trashed: 763 739 ; - CR2 (we don't care) … … 770 746 771 747 ; Save the Guest CPU context pointer. 772 mov xSI, [xBP + xCB *2 + RTHCPHYS_CB*2]; pCtx773 push xSI 748 mov xSI, [xBP + xCB * 2] ; pCtx 749 push xSI ; push for saving the state at the end 774 750 775 751 ; Save host fs, gs, sysenter msr etc. 776 mov xAX, [xBP + xCB *2]; pVMCBHostPhys (64 bits physical address; x86: take low dword only)777 push xAX ; save for the vmload after vmrun752 mov xAX, [xBP + xCB * 2] ; pVMCBHostPhys (64 bits physical address; x86: take low dword only) 753 push xAX ; save for the vmload after vmrun 778 754 vmsave 779 755 780 756 ; Setup eax for VMLOAD. 781 mov xAX, [xBP + xCB *2 + RTHCPHYS_CB]; pVMCBPhys (64 bits physical address; take low dword only)757 mov xAX, [xBP + xCB * 2 + RTHCPHYS_CB] ; pVMCBPhys (64 bits physical address; take low dword only) 782 758 783 759 ; Restore Guest's general purpose registers. … … 862 838 ; Manual save and restore: 863 839 ; - General purpose registers except RIP, RSP, RAX 864 ; 840 ; 865 841 ; Trashed: 866 842 ; - CR2 (we don't care) … … 868 844 ; - DRx (presumably not changed at all) 869 845 ; - DR7 (reset to 0x400) 870 ; 846 ; 871 847 872 848 ; Save all general purpose host registers. … … 874 850 875 851 ; Save the Guest CPU context pointer. 876 mov rsi, [rbp + xCB *2 + RTHCPHYS_CB*2]; pCtx877 push rsi ; push for saving the state at the end852 mov rsi, [rbp + xCB * 2] ; pCtx 853 push rsi ; push for saving the state at the end 878 854 879 855 ; Save host fs, gs, sysenter msr etc. 880 mov rax, [rbp + xCB *2]; pVMCBHostPhys (64 bits physical address; x86: take low dword only)881 push rax ; Save for the vmload after vmrun856 mov rax, [rbp + xCB * 2] ; pVMCBHostPhys (64 bits physical address; x86: take low dword only) 857 push rax ; Save for the vmload after vmrun 882 858 vmsave 883 859 884 860 ; Setup eax for VMLOAD. 885 mov rax, [rbp + xCB *2 + RTHCPHYS_CB] ; pVMCBPhys (64 bits physical address; take low dword only)861 mov rax, [rbp + xCB * 2 + RTHCPHYS_CB] ; pVMCBPhys (64 bits physical address; take low dword only) 886 862 887 863 ; Restore Guest's general purpose registers.
Note:
See TracChangeset
for help on using the changeset viewer.