Changeset 75 in vbox
- Timestamp:
- Jan 16, 2007 5:27:03 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/VMM/VMMR0/HWACCMR0A.asm (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HWACCMR0A.asm
r19 r75 30 30 31 31 %ifdef __OS2__ ;; @todo build cvs nasm like on OS X. 32 %macro vmwrite 2,32 %macro vmwrite 2, 33 33 int3 34 %endmacro 35 %define vmlaunch int3 36 %define vmresume int3 37 %endif 34 %endmacro 35 %define vmlaunch int3 36 %define vmresume int3 37 %endif 38 39 40 ;; @def MYPUSHAD 41 ; Macro generating an equivalent to pushad 42 43 ;; @def MYPOPAD 44 ; Macro generating an equivalent to popad 45 46 ;; @def MYPUSHSEGS 47 ; Macro saving all segment registers on the stack. 48 ; @param 1 full width register name 49 ; @param 2 16-bit regsiter name for \a 1. 50 51 ;; @def MYPOPSEGS 52 ; Macro restoring all segment registers on the stack 53 ; @param 1 full width register name 54 ; @param 2 16-bit regsiter name for \a 1. 55 56 %ifdef __AMD64__ 57 %ifdef ASM_CALL64_GCC 58 %macro MYPUSHAD 0 59 push r15 60 push r14 61 push r13 62 push r12 63 push rbx 64 %endmacro 65 %macro MYPOPAD 0 66 pop rbx 67 pop r12 68 pop r13 69 pop r14 70 pop r15 71 %endmacro 72 73 %else ; ASM_CALL64_MSC 74 %macro MYPUSHAD 0 75 push r15 76 push r14 77 push r13 78 push r12 79 push rbx 80 push rsi 81 push rdi 82 %endmacro 83 %macro MYPOPAD 0 84 pop rsi 85 pop rdi 86 pop rbx 87 pop r12 88 pop r13 89 pop r14 90 pop r15 91 %endmacro 92 %endif 93 ;; @todo check ds,es saving/restoring on AMD64 94 %macro MYPUSHSEGS 2 95 push gs 96 push fs 97 mov %2, es 98 push %1 99 mov %2, ds 100 push %1 101 %endmacro 102 %macro MYPOPSEGS 2 103 pop %1 104 mov ds, %2 105 pop %1 106 mov es, %2 107 pop fs 108 pop gs 109 %endmacro 110 111 %else ; __X86__ 112 %macro MYPUSHAD 0 113 pushad 114 %endmacro 115 %macro MYPOPAD 0 116 popad 117 %endmacro 118 119 %macro MYPUSHSEGS 2 120 push ds 121 push es 122 push fs 123 push gs 124 %endmacro 125 %macro MYPOPSEGS 2 126 pop gs 127 pop fs 128 pop es 129 pop ds 130 %endmacro 131 %endif 132 38 133 39 134 BEGINCODE … … 48 143 ; */ 49 144 BEGINPROC VMXStartVM 50 push ebp51 mov ebp, esp145 push xBP 146 mov xBP, xSP 52 147 53 148 ;/* First we have to save some final CPU context registers. */ 54 push vmlaunch_done149 push .vmlaunch_done 55 150 mov eax, VMX_VMCS_HOST_RIP ;/* return address (too difficult to continue after VMLAUNCH?) */ 56 vmwrite eax, [esp]151 vmwrite xAX, [xSP] 57 152 ;/* @todo assumes success... */ 58 add esp, 4153 add xSP, xS 59 154 60 155 ;/* Manual save and restore: … … 71 166 72 167 ;/* Save all general purpose host registers. */ 73 pushad168 MYPUSHAD 74 169 75 170 ;/* Save segment registers */ 76 push ds 77 push es 78 push fs 79 push gs 171 MYPUSHSEGS xAX, ax 80 172 81 173 ;/* Save the Guest CPU context pointer. */ 174 %ifdef __AMD64__ 175 %ifdef ASM_CALL64_GCC 176 mov rsi, rdi ; pCtx 177 %else 178 mov rsi, rcx ; pCtx 179 %endif 180 %else 82 181 mov esi, [ebp + 8] ; pCtx 83 push esi 182 %endif 183 push xSI 84 184 85 185 ; Save LDTR 86 186 xor eax, eax 87 187 sldt ax 88 push eax188 push xAX 89 189 90 190 ; Restore CR2 91 mov ebx, [ esi+ CPUMCTX.cr2]92 mov cr2, ebx191 mov ebx, [xSI + CPUMCTX.cr2] 192 mov cr2, xBX 93 193 94 194 mov eax, VMX_VMCS_HOST_RSP 95 vmwrite eax, esp195 vmwrite xAX, xSP 96 196 ;/* @todo assumes success... */ 97 197 ;/* Don't mess with ESP anymore!! */ 98 198 99 199 ;/* Restore Guest's general purpose registers. */ 100 mov eax, [ esi+ CPUMCTX.eax]101 mov ebx, [ esi+ CPUMCTX.ebx]102 mov ecx, [ esi+ CPUMCTX.ecx]103 mov edx, [ esi+ CPUMCTX.edx]104 mov edi, [ esi+ CPUMCTX.edi]105 mov ebp, [ esi+ CPUMCTX.ebp]106 mov esi, [ esi+ CPUMCTX.esi]200 mov eax, [xSI + CPUMCTX.eax] 201 mov ebx, [xSI + CPUMCTX.ebx] 202 mov ecx, [xSI + CPUMCTX.ecx] 203 mov edx, [xSI + CPUMCTX.edx] 204 mov edi, [xSI + CPUMCTX.edi] 205 mov ebp, [xSI + CPUMCTX.ebp] 206 mov esi, [xSI + CPUMCTX.esi] 107 207 108 208 vmlaunch 109 jmp vmlaunch_done; ;/* here if vmlaunch detected a failure. */209 jmp .vmlaunch_done; ;/* here if vmlaunch detected a failure. */ 110 210 111 211 ALIGNCODE(16) 112 vmlaunch_done:113 jnc vmxstart_good114 115 pop eax; saved LDTR212 .vmlaunch_done: 213 jnc .vmxstart_good 214 215 pop xAX ; saved LDTR 116 216 lldt ax 117 217 118 add esp, 4; pCtx218 add xSP, xS ; pCtx 119 219 120 220 ; Restore segment registers 121 pop gs 122 pop fs 123 pop es 124 pop ds 221 MYPOPSEGS xAX, ax 125 222 126 223 ;/* Restore all general purpose host registers. */ 127 popad224 MYPOPAD 128 225 mov eax, VERR_VMX_INVALID_VMXON_PTR 129 jmp vmstart_end130 131 vmxstart_good:132 jnz vmxstart_success133 134 pop eax; saved LDTR226 jmp .vmstart_end 227 228 .vmxstart_good: 229 jnz .vmxstart_success 230 231 pop xAX ; saved LDTR 135 232 lldt ax 136 233 137 add esp, 4; pCtx234 add xSP, xS ; pCtx 138 235 139 236 ; Restore segment registers 140 pop gs 141 pop fs 142 pop es 143 pop ds 144 ;/* Restore all general purpose host registers. */ 145 popad 237 MYPOPSEGS xAX, ax 238 239 ; Restore all general purpose host registers. 240 MYPOPAD 146 241 mov eax, VERR_VMX_UNABLE_TO_START_VM 147 jmp vmstart_end 148 149 vmxstart_success: 150 push edi 151 mov edi, dword [esp+8] ;/* pCtx */ 152 153 mov [ss:edi + CPUMCTX.eax], eax 154 mov [ss:edi + CPUMCTX.ebx], ebx 155 mov [ss:edi + CPUMCTX.ecx], ecx 156 mov [ss:edi + CPUMCTX.edx], edx 157 mov [ss:edi + CPUMCTX.esi], esi 158 mov [ss:edi + CPUMCTX.ebp], ebp 159 pop dword [ss:edi + CPUMCTX.edi] ; guest edi we pushed above 160 161 pop eax ; saved LDTR 242 jmp .vmstart_end 243 244 .vmxstart_success: 245 push xDI 246 mov xDI, [xSP + xS * 2] ;/* pCtx */ 247 248 mov [ss:xDI + CPUMCTX.eax], eax 249 mov [ss:xDI + CPUMCTX.ebx], ebx 250 mov [ss:xDI + CPUMCTX.ecx], ecx 251 mov [ss:xDI + CPUMCTX.edx], edx 252 mov [ss:xDI + CPUMCTX.esi], esi 253 mov [ss:xDI + CPUMCTX.ebp], ebp 254 %ifdef __AMD64__ 255 pop xAX ; the guest edi we pushed above 256 mov dword [ss:xDI + CPUMCTX.edi], eax 257 %else 258 pop dword [ss:xDI + CPUMCTX.edi] ; the guest edi we pushed above 259 %endif 260 261 pop xAX ; saved LDTR 162 262 lldt ax 163 263 164 add esp, 4 ; pCtx264 add xSP, 4 ; pCtx 165 265 166 266 ; Restore segment registers 167 pop gs 168 pop fs 169 pop es 170 pop ds 267 MYPOPSEGS xAX, ax 171 268 172 269 ; Restore general purpose registers 173 popad270 MYPOPAD 174 271 175 272 mov eax, VINF_SUCCESS 176 273 177 vmstart_end:178 pop ebp179 ret 180 ENDPROC VM StartVM274 .vmstart_end: 275 pop xBP 276 ret 277 ENDPROC VMXStartVM 181 278 182 279 … … 190 287 ; */ 191 288 BEGINPROC VMXResumeVM 192 push ebp193 mov ebp, esp289 push xBP 290 mov xBP, xSP 194 291 195 292 ;/* First we have to save some final CPU context registers. */ 196 293 push vmresume_done 197 294 mov eax, VMX_VMCS_HOST_RIP ;/* return address (too difficult to continue after VMLAUNCH?) */ 198 vmwrite eax, [esp]295 vmwrite xAX, [xSP] 199 296 ;/* @todo assumes success... */ 200 add esp, 4297 add xSP, xS 201 298 202 299 ;/* Manual save and restore: … … 213 310 214 311 ;/* Save all general purpose host registers. */ 215 pushad312 MYPUSHAD 216 313 217 314 ;/* Save segment registers */ 218 push ds 219 push es 220 push fs 221 push gs 315 MYPUSHSEGS xAX, ax 222 316 223 317 ;/* Save the Guest CPU context pointer. */ 224 mov esi, [ebp + 8] ; pCtx 225 push esi 318 %ifdef __AMD64__ 319 %ifdef ASM_CALL64_GCC 320 mov rsi, rdi ; pCtx 321 %else 322 mov rsi, ecx ; pCtx 323 %endif 324 %else 325 mov esi, [ebp + 8] ; pCtx 326 %endif 327 push xSI 226 328 227 329 ; Save LDTR 228 330 xor eax, eax 229 331 sldt ax 230 push eax332 push xAX 231 333 232 334 ; Restore CR2 233 mov ebx, [esi+ CPUMCTX.cr2]234 mov cr2, ebx335 mov xBX, [xSI + CPUMCTX.cr2] 336 mov cr2, xBX 235 337 236 338 mov eax, VMX_VMCS_HOST_RSP 237 vmwrite eax, esp339 vmwrite xAX, xSP 238 340 ;/* @todo assumes success... */ 239 341 ;/* Don't mess with ESP anymore!! */ 240 342 241 343 ;/* Restore Guest's general purpose registers. */ 242 mov eax, [ esi+ CPUMCTX.eax]243 mov ebx, [ esi+ CPUMCTX.ebx]244 mov ecx, [ esi+ CPUMCTX.ecx]245 mov edx, [ esi+ CPUMCTX.edx]246 mov edi, [ esi+ CPUMCTX.edi]247 mov ebp, [ esi+ CPUMCTX.ebp]248 mov esi, [ esi+ CPUMCTX.esi]344 mov eax, [xSI + CPUMCTX.eax] 345 mov ebx, [xSI + CPUMCTX.ebx] 346 mov ecx, [xSI + CPUMCTX.ecx] 347 mov edx, [xSI + CPUMCTX.edx] 348 mov edi, [xSI + CPUMCTX.edi] 349 mov ebp, [xSI + CPUMCTX.ebp] 350 mov esi, [xSI + CPUMCTX.esi] 249 351 250 352 vmresume … … 255 357 jnc vmresume_good 256 358 257 pop eax; saved LDTR359 pop xAX ; saved LDTR 258 360 lldt ax 259 361 260 add esp, 4; pCtx362 add xSP, xS ; pCtx 261 363 262 364 ; Restore segment registers 263 pop gs 264 pop fs 265 pop es 266 pop ds 267 268 ;/* Restore all general purpose host registers. */ 269 popad 365 MYPOPSEGS xAX, ax 366 367 ; Restore all general purpose host registers. 368 MYPOPAD 270 369 mov eax, VERR_VMX_INVALID_VMXON_PTR 271 370 jmp vmresume_end … … 274 373 jnz vmresume_success 275 374 276 pop eax; saved LDTR375 pop xAX ; saved LDTR 277 376 lldt ax 278 377 279 add esp, 4; pCtx378 add xSP, xS ; pCtx 280 379 281 380 ; Restore segment registers 282 pop gs 283 pop fs 284 pop es 285 pop ds 286 ;/* Restore all general purpose host registers. */ 287 popad 381 MYPOPSEGS xAX, ax 382 383 ; Restore all general purpose host registers. 384 MYPOPAD 288 385 mov eax, VERR_VMX_UNABLE_TO_RESUME_VM 289 386 jmp vmresume_end 290 387 291 388 vmresume_success: 292 push edi 293 mov edi, dword [esp+8] ;/* pCtx */ 294 295 mov [ss:edi + CPUMCTX.eax], eax 296 mov [ss:edi + CPUMCTX.ebx], ebx 297 mov [ss:edi + CPUMCTX.ecx], ecx 298 mov [ss:edi + CPUMCTX.edx], edx 299 mov [ss:edi + CPUMCTX.esi], esi 300 mov [ss:edi + CPUMCTX.ebp], ebp 301 pop dword [ss:edi + CPUMCTX.edi] ; guest edi we pushed above 302 303 pop eax ; saved LDTR 389 push xDI 390 mov xDI, [xSP + xS * 2] ; pCtx 391 392 mov [ss:xDI + CPUMCTX.eax], eax 393 mov [ss:xDI + CPUMCTX.ebx], ebx 394 mov [ss:xDI + CPUMCTX.ecx], ecx 395 mov [ss:xDI + CPUMCTX.edx], edx 396 mov [ss:xDI + CPUMCTX.esi], esi 397 mov [ss:xDI + CPUMCTX.ebp], ebp 398 %ifdef __AMD64__ 399 pop xAX ; the guest edi we pushed above 400 mov dword [ss:xDI + CPUMCTX.edi], eax 401 %else 402 pop dword [ss:xDI + CPUMCTX.edi] ; the guest edi we pushed above 403 %endif 404 405 pop xAX ; saved LDTR 304 406 lldt ax 305 407 306 add esp, 4; pCtx408 add xSP, xS ; pCtx 307 409 308 410 ; Restore segment registers 309 pop gs 310 pop fs 311 pop es 312 pop ds 411 MYPOPSEGS xAX, ax 313 412 314 413 ; Restore general purpose registers 315 popad414 MYPOPAD 316 415 317 416 mov eax, VINF_SUCCESS 318 417 319 418 vmresume_end: 320 pop ebp419 pop xBP 321 420 ret 322 421 ENDPROC VMXResumeVM 323 422 324 423 424 %ifdef __AMD64__ 425 ;/** 426 ; * Executes VMWRITE 427 ; * 428 ; * @returns VBox status code 429 ; * @param idxField x86: [ebp + 08h] msc: rcx gcc: edi VMCS index 430 ; * @param pData x86: [ebp + 0ch] msc: rdx gcc: rsi Ptr to store VM field value 431 ; */ 432 BEGINPROC VMXWriteVMCS64 433 %ifdef ASM_CALL64_GCC 434 and edi, 0ffffffffh; serious paranoia 435 vmwrite rdi, [rsi] 436 %else 437 and ecx, 0ffffffffh; serious paranoia 438 vmwrite rcx, [rdx] 439 %endif 440 jnc .valid_vmcs 441 mov eax, VERR_VMX_INVALID_VMCS_PTR 442 ret 443 .valid_vmcs: 444 jnz .the_end 445 mov eax, VERR_VMX_INVALID_VMCS_FIELD 446 .the_end: 447 ret 448 ENDPROC VMXWriteVMCS64 449 450 ;/** 451 ; * Executes VMREAD 452 ; * 453 ; * @returns VBox status code 454 ; * @param idxField VMCS index 455 ; * @param pData Ptr to store VM field value 456 ; */ 457 ;DECLASM(int) VMXReadVMCS64(uint32_t idxField, uint64_t *pData); 458 BEGINPROC VMXReadVMCS64 459 %ifdef ASM_CALL64_GCC 460 and edi, 0ffffffffh; serious paranoia 461 vmread [rsi], rdi 462 %else 463 and ecx, 0ffffffffh; serious paranoia 464 vmread [rdx], rcx 465 %endif 466 jnc .valid_vmcs 467 mov eax, VERR_VMX_INVALID_VMCS_PTR 468 ret 469 .valid_vmcs: 470 jnz .the_end 471 mov eax, VERR_VMX_INVALID_VMCS_FIELD 472 .the_end: 473 ret 474 ENDPROC VMXReadVMCS64 475 476 477 ;/** 478 ; * Executes VMXON 479 ; * 480 ; * @returns VBox status code 481 ; * @param HCPhysVMXOn Physical address of VMXON structure 482 ; */ 483 ;DECLASM(int) VMXEnable(RTHCPHYS HCPhysVMXOn); 484 BEGINPROC VMXEnable 485 %ifdef __AMD64__ 486 %ifdef ASM_CALL64_GCC 487 push rdi 488 %else 489 push ecx 490 %endif 491 vmxon [rsp] 492 %else 493 vmxon [esp + 4] 494 %endif 495 jnc .good 496 mov eax, VERR_VMX_INVALID_VMXON_PTR 497 jmp .the_end 498 499 .good: 500 jnz .the_end 501 mov eax, VERR_VMX_GENERIC 502 503 .the_end: 504 %ifdef __AMD64__ 505 add rsp, 8 506 %endif 507 ret 508 ENDPROC VMXEnable 509 510 511 ;/** 512 ; * Executes VMXOFF 513 ; */ 514 ;DECLASM(void) VMXDisable(void); 515 BEGINPROC VMXDisable 516 vmxoff 517 ret 518 ENDPROC VMXDisable 519 520 521 ;/** 522 ; * Executes VMCLEAR 523 ; * 524 ; * @returns VBox status code 525 ; * @param HCPhysVMCS Physical address of VM control structure 526 ; */ 527 ;DECLASM(int) VMXClearVMCS(RTHCPHYS HCPhysVMCS); 528 BEGINPROC VMXClearVMCS 529 %ifdef __AMD64__ 530 %ifdef ASM_CALL64_GCC 531 push rdi 532 %else 533 push ecx 534 %endif 535 vmclear [rsp] 536 %else 537 vmclear [esp + 4] 538 %endif 539 jnc .the_end 540 mov eax, VERR_VMX_INVALID_VMCS_PTR 541 .the_end: 542 %ifdef __AMD64__ 543 add rsp, 8 544 %endif 545 ret 546 ENDPROC VMXClearVMCS 547 548 549 ;/** 550 ; * Executes VMPTRLD 551 ; * 552 ; * @returns VBox status code 553 ; * @param HCPhysVMCS Physical address of VMCS structure 554 ; */ 555 ;DECLASM(int) VMXActivateVMCS(RTHCPHYS HCPhysVMCS); 556 BEGINPROC VMXActivateVMCS 557 %ifdef __AMD64__ 558 %ifdef ASM_CALL64_GCC 559 push rdi 560 %else 561 push ecx 562 %endif 563 vmclear [rsp] 564 %else 565 vmclear [esp + 4] 566 %endif 567 jnc .the_end 568 mov eax, VERR_VMX_INVALID_VMCS_PTR 569 .the_end: 570 %ifdef __AMD64__ 571 add rsp, 8 572 %endif 573 ret 574 ENDPROC VMXActivateVMCS 575 576 %endif ; __AMD64__ 325 577 326 578 … … 329 581 ; * 330 582 ; * @returns VBox status code 331 ; * @param pVMCBHostPhysPhysical address of host VMCB332 ; * @param pVMCBPhysPhysical address of guest VMCB583 ; * @param HCPhysVMCB Physical address of host VMCB 584 ; * @param HCPhysVMCB Physical address of guest VMCB 333 585 ; * @param pCtx Guest context 334 586 ; */ 335 587 BEGINPROC SVMVMRun 336 push ebp 337 mov ebp, esp 588 %ifdef __AMD64__ ; fake a cdecl stack frame - I'm lazy, sosume. 589 %ifdef ASM_CALL64_GCC 590 push rdx 591 push rsi 592 push rdi 593 %else 594 push r8 595 push rdx 596 push rcx 597 %endif 598 push 0 599 %endif 600 push xBP 601 mov xBP, xSP 338 602 339 603 ;/* Manual save and restore: … … 348 612 349 613 ;/* Save all general purpose host registers. */ 350 pushad614 MYPUSHAD 351 615 352 616 ; /* Clear fs and gs as a safety precaution. Maybe not necessary. */ … … 358 622 359 623 ;/* Save the Guest CPU context pointer. */ 360 mov esi, [ebp + 24]; pCtx361 push esi624 mov xSI, [xBP + xS*2 + RTHCPHYS_CB*2] ; pCtx 625 push xSI ; push for saving the state at the end 362 626 363 627 ; Restore CR2 364 mov ebx, [ esi+ CPUMCTX.cr2]365 mov cr2, ebx628 mov ebx, [xSI + CPUMCTX.cr2] 629 mov cr2, xBX 366 630 367 631 ; save host fs, gs, sysenter msr etc 368 mov eax, [ebp + 8] ; pVMCBHostPhys (64 bits physical address;take low dword only)369 push eax; save for the vmload after vmrun632 mov xAX, [xBP + xS*2] ; pVMCBHostPhys (64 bits physical address; x86: take low dword only) 633 push xAX ; save for the vmload after vmrun 370 634 DB 0x0F, 0x01, 0xDB ; VMSAVE 371 635 372 636 ; setup eax for VMLOAD 373 mov eax, [ebp + 16]; pVMCBPhys (64 bits physical address; take low dword only)637 mov xAX, [xBP + xS*2 + RTHCPHYS_CB] ; pVMCBPhys (64 bits physical address; take low dword only) 374 638 375 639 ;/* Restore Guest's general purpose registers. */ 376 640 ;/* EAX is loaded from the VMCB by VMRUN */ 377 mov ebx, [ esi+ CPUMCTX.ebx]378 mov ecx, [ esi+ CPUMCTX.ecx]379 mov edx, [ esi+ CPUMCTX.edx]380 mov edi, [ esi+ CPUMCTX.edi]381 mov ebp, [ esi+ CPUMCTX.ebp]382 mov esi, [ esi+ CPUMCTX.esi]641 mov ebx, [xSI + CPUMCTX.ebx] 642 mov ecx, [xSI + CPUMCTX.ecx] 643 mov edx, [xSI + CPUMCTX.edx] 644 mov edi, [xSI + CPUMCTX.edi] 645 mov ebp, [xSI + CPUMCTX.ebp] 646 mov esi, [xSI + CPUMCTX.esi] 383 647 384 648 ; Clear the global interrupt flag & execute sti to make sure external interrupts cause a world switch … … 397 661 398 662 ; load host fs, gs, sysenter msr etc 399 pop eax; pushed above663 pop xAX ; pushed above 400 664 DB 0x0F, 0x01, 0xDA ; VMLOAD 401 665 … … 404 668 DB 0x0f, 0x01, 0xDC ; STGI 405 669 406 pop eax; pCtx407 408 mov [ss: eax+ CPUMCTX.ebx], ebx409 mov [ss: eax+ CPUMCTX.ecx], ecx410 mov [ss: eax+ CPUMCTX.edx], edx411 mov [ss: eax+ CPUMCTX.esi], esi412 mov [ss: eax+ CPUMCTX.edi], edi413 mov [ss: eax+ CPUMCTX.ebp], ebp670 pop xAX ; pCtx 671 672 mov [ss:xAX + CPUMCTX.ebx], ebx 673 mov [ss:xAX + CPUMCTX.ecx], ecx 674 mov [ss:xAX + CPUMCTX.edx], edx 675 mov [ss:xAX + CPUMCTX.esi], esi 676 mov [ss:xAX + CPUMCTX.edi], edi 677 mov [ss:xAX + CPUMCTX.ebp], ebp 414 678 415 679 ; Restore fs & gs … … 418 682 419 683 ; Restore general purpose registers 420 popad684 MYPOPAD 421 685 422 686 mov eax, VINF_SUCCESS 423 687 424 pop ebp 688 pop xBP 689 %ifdef __AMD64__ 690 add xSP, 4*xS 691 %endif 425 692 ret 426 693 ENDPROC SVMVMRun 694
Note:
See TracChangeset
for help on using the changeset viewer.

