VMMR0JmpA-x86.asm revision 3d6b7fc1e9af3022c7cbb14c1640780808ee56b4
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; $Id$
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync;; @file
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; VMM - R0 SetJmp / LongJmp routines for X86.
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync;
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync; Copyright (C) 2006-2009 Sun Microsystems, Inc.
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; available from http://www.virtualbox.org. This file is free software;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; you can redistribute it and/or modify it under the terms of the GNU
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; General Public License (GPL) as published by the Free Software
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; Clara, CA 95054 USA or visit http://www.sun.com if you need
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync; additional information or have any questions.
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync;*******************************************************************************
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync;* Header Files *
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync;*******************************************************************************
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync%include "VBox/asmdefs.mac"
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync%include "../VMMInternal.mac"
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync%include "iprt/err.mac"
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync%include "VBox/param.mac"
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync; For vmmR0LoggerWrapper. (The other architecture(s) use(s) C99 variadict macros.)
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncextern NAME(RTLogLogger)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsyncBEGINCODE
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
7af218a7441de38fc9e814919db04bae3e917664vboxsync;;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync; The setjmp variant used for calling Ring-3.
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync; This differs from the normal setjmp in that it will resume VMMR0CallHost if we're
de6e321f351aa489a6a62bed474390a0056e8093vboxsync; in the middle of a ring-3 call. Another differences is the function pointer and
de6e321f351aa489a6a62bed474390a0056e8093vboxsync; argument. This has to do with resuming code and the stack frame of the caller.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync; @returns VINF_SUCCESS on success or whatever is passed to vmmR0CallHostLongJmp.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync; @param pJmpBuf msc:rcx gcc:rdi x86:[esp+0x04] Our jmp_buf.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync; @param pfn msc:rdx gcc:rsi x86:[esp+0x08] The function to be called when not resuming.
044af0d1e6474076366759db86f101778c5f20ccvboxsync; @param pvUser1 msc:r8 gcc:rdx x86:[esp+0x0c] The argument of that function.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync; @param pvUser2 msc:r9 gcc:rcx x86:[esp+0x10] The argument of that function.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync;
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncBEGINPROC vmmR0CallHostSetJmp
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncGLOBALNAME vmmR0CallHostSetJmpEx
de6e321f351aa489a6a62bed474390a0056e8093vboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync ; Save the registers.
044af0d1e6474076366759db86f101778c5f20ccvboxsync ;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov edx, [esp + 4h] ; pJmpBuf
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov [xDX + VMMR0JMPBUF.ebx], ebx
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov [xDX + VMMR0JMPBUF.esi], esi
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov [xDX + VMMR0JMPBUF.edi], edi
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov [xDX + VMMR0JMPBUF.ebp], ebp
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov xAX, [esp]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov [xDX + VMMR0JMPBUF.eip], xAX
044af0d1e6474076366759db86f101778c5f20ccvboxsync lea ecx, [esp + 4] ; (used in resume)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov [xDX + VMMR0JMPBUF.esp], ecx
044af0d1e6474076366759db86f101778c5f20ccvboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync ; If we're not in a ring-3 call, call pfn and return.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync test byte [xDX + VMMR0JMPBUF.fInRing3Call], 1
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jnz .resume
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov ebx, edx ; pJmpBuf -> ebx (persistent reg)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync%ifdef VMM_R0_SWITCH_STACK
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov esi, [ebx + VMMR0JMPBUF.pvSavedStack]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync test esi, esi
044af0d1e6474076366759db86f101778c5f20ccvboxsync jz .entry_error
044af0d1e6474076366759db86f101778c5f20ccvboxsync %ifdef VBOX_STRICT
044af0d1e6474076366759db86f101778c5f20ccvboxsync cmp dword [esi], 0h
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jne .entry_error
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov edx, esi
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov edi, esi
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov ecx, VMM_STACK_SIZE / 4
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov eax, 0eeeeeeeeh
044af0d1e6474076366759db86f101778c5f20ccvboxsync repne stosd
044af0d1e6474076366759db86f101778c5f20ccvboxsync %endif
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync lea esi, [esi + VMM_STACK_SIZE - 32]
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov [esi + 1ch], dword 0deadbeefh ; Marker 1.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov [esi + 18h], ebx ; Save pJmpBuf pointer.
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov [esi + 14h], dword 00c00ffeeh ; Marker 2.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov [esi + 10h], dword 0f00dbeefh ; Marker 3.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov edx, [esp + 10h] ; pvArg2
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov [esi + 04h], edx
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov ecx, [esp + 0ch] ; pvArg1
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov [esi ], ecx
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov eax, [esp + 08h] ; pfn
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov esp, esi ; Switch stack!
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync call eax
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync and dword [esi + 1ch], byte 0 ; clear marker.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync %ifdef VBOX_STRICT
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov esi, [ebx + VMMR0JMPBUF.pvSavedStack]
de6e321f351aa489a6a62bed474390a0056e8093vboxsync cmp [esi], 0eeeeeeeeh ; Check for stack overflow
de6e321f351aa489a6a62bed474390a0056e8093vboxsync jne .stack_overflow
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync cmp [esi + 04h], 0eeeeeeeeh
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync jne .stack_overflow
de6e321f351aa489a6a62bed474390a0056e8093vboxsync cmp [esi + 08h], 0eeeeeeeeh
de6e321f351aa489a6a62bed474390a0056e8093vboxsync jne .stack_overflow
044af0d1e6474076366759db86f101778c5f20ccvboxsync cmp [esi + 0ch], 0eeeeeeeeh
de6e321f351aa489a6a62bed474390a0056e8093vboxsync jne .stack_overflow
044af0d1e6474076366759db86f101778c5f20ccvboxsync cmp [esi + 10h], 0eeeeeeeeh
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jne .stack_overflow
044af0d1e6474076366759db86f101778c5f20ccvboxsync cmp [esi + 20h], 0eeeeeeeeh
de6e321f351aa489a6a62bed474390a0056e8093vboxsync jne .stack_overflow
de6e321f351aa489a6a62bed474390a0056e8093vboxsync cmp [esi + 30h], 0eeeeeeeeh
de6e321f351aa489a6a62bed474390a0056e8093vboxsync jne .stack_overflow
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov dword [esi], 0h ; Reset the marker
044af0d1e6474076366759db86f101778c5f20ccvboxsync %endif
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync%else ; !VMM_R0_SWITCH_STACK
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov ecx, [esp + 0ch] ; pvArg1
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov edx, [esp + 10h] ; pvArg2
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov eax, [esp + 08h] ; pfn
044af0d1e6474076366759db86f101778c5f20ccvboxsync sub esp, 12 ; align the stack on a 16-byte boundrary.
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov [esp ], ecx
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov [esp + 04h], edx
044af0d1e6474076366759db86f101778c5f20ccvboxsync call eax
de6e321f351aa489a6a62bed474390a0056e8093vboxsync%endif ; !VMM_R0_SWITCH_STACK
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov edx, ebx ; pJmpBuf -> edx (volatile reg)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync ;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync ; Return like in the long jump but clear eip, no short cuts here.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync.proper_return:
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov ebx, [xDX + VMMR0JMPBUF.ebx]
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov esi, [xDX + VMMR0JMPBUF.esi]
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov edi, [xDX + VMMR0JMPBUF.edi]
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov ebp, [xDX + VMMR0JMPBUF.ebp]
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov xCX, [xDX + VMMR0JMPBUF.eip]
044af0d1e6474076366759db86f101778c5f20ccvboxsync and dword [xDX + VMMR0JMPBUF.eip], byte 0 ; used for valid check.
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync mov esp, [xDX + VMMR0JMPBUF.esp]
de6e321f351aa489a6a62bed474390a0056e8093vboxsync jmp xCX
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync.entry_error:
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov eax, VERR_INTERNAL_ERROR_2
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jmp .proper_return
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync.stack_overflow:
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov eax, VERR_INTERNAL_ERROR_5
044af0d1e6474076366759db86f101778c5f20ccvboxsync jmp .proper_return
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync ; Aborting resume.
044af0d1e6474076366759db86f101778c5f20ccvboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync.bad:
044af0d1e6474076366759db86f101778c5f20ccvboxsync and dword [xDX + VMMR0JMPBUF.eip], byte 0 ; used for valid check.
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov edi, [xDX + VMMR0JMPBUF.edi]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov esi, [xDX + VMMR0JMPBUF.esi]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov ebx, [xDX + VMMR0JMPBUF.ebx]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov eax, VERR_INTERNAL_ERROR_3 ; todo better return code!
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ret
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync ; Resume VMMR0CallHost the call.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync.resume:
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync ; Sanity checks.
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync%ifdef VMM_R0_SWITCH_STACK
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov eax, [xDX + VMMR0JMPBUF.pvSavedStack]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync %ifdef RT_STRICT
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cmp dword [eax], 0eeeeeeeeh
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync %endif
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync lea eax, [eax + VMM_STACK_SIZE - 32]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cmp dword [eax + 1ch], 0deadbeefh ; Marker 1.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jne .bad
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync %ifdef RT_STRICT
9d020a0622f95aec3aabaff436a495e88dbbd71avboxsync cmp [esi + 18h], edx ; The saved pJmpBuf pointer.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jne .bad
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cmp dword [esi + 14h], 00c00ffeeh ; Marker 2.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jne .bad
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cmp dword [esi + 10h], 0f00dbeefh ; Marker 3.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jne .bad
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync %endif
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync%else ; !VMM_R0_SWITCH_STACK
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cmp ecx, [xDX + VMMR0JMPBUF.SpCheck]
044af0d1e6474076366759db86f101778c5f20ccvboxsync jne .bad
044af0d1e6474076366759db86f101778c5f20ccvboxsync.espCheck_ok:
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov ecx, [xDX + VMMR0JMPBUF.cbSavedStack]
044af0d1e6474076366759db86f101778c5f20ccvboxsync cmp ecx, VMM_STACK_SIZE
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync ja .bad
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync test ecx, 3
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync jnz .bad
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync mov edi, [xDX + VMMR0JMPBUF.esp]
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync sub edi, [xDX + VMMR0JMPBUF.SpResume]
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync cmp ecx, edi
044af0d1e6474076366759db86f101778c5f20ccvboxsync jne .bad
044af0d1e6474076366759db86f101778c5f20ccvboxsync%endif
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync%ifdef VMM_R0_SWITCH_STACK
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ; Switch stack.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov esp, [xDX + VMMR0JMPBUF.SpResume]
044af0d1e6474076366759db86f101778c5f20ccvboxsync%else
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync ; Restore the stack.
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov ecx, [xDX + VMMR0JMPBUF.cbSavedStack]
044af0d1e6474076366759db86f101778c5f20ccvboxsync shr ecx, 2
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov esi, [xDX + VMMR0JMPBUF.pvSavedStack]
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov edi, [xDX + VMMR0JMPBUF.SpResume]
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov esp, edi
044af0d1e6474076366759db86f101778c5f20ccvboxsync rep movsd
044af0d1e6474076366759db86f101778c5f20ccvboxsync%endif ; !VMM_R0_SWITCH_STACK
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov byte [xDX + VMMR0JMPBUF.fInRing3Call], 0
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync ; Continue where we left off.
044af0d1e6474076366759db86f101778c5f20ccvboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync%ifdef VBOX_STRICT
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync pop eax ; magic
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync cmp eax, 0f00dbed0h
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync je .magic_ok
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync mov ecx, 0123h
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync mov [ecx], edx
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync.magic_ok:
044af0d1e6474076366759db86f101778c5f20ccvboxsync%endif
044af0d1e6474076366759db86f101778c5f20ccvboxsync popf
044af0d1e6474076366759db86f101778c5f20ccvboxsync pop ebx
044af0d1e6474076366759db86f101778c5f20ccvboxsync pop esi
044af0d1e6474076366759db86f101778c5f20ccvboxsync pop edi
044af0d1e6474076366759db86f101778c5f20ccvboxsync pop ebp
044af0d1e6474076366759db86f101778c5f20ccvboxsync xor eax, eax ; VINF_SUCCESS
044af0d1e6474076366759db86f101778c5f20ccvboxsync ret
044af0d1e6474076366759db86f101778c5f20ccvboxsyncENDPROC vmmR0CallHostSetJmp
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync;;
044af0d1e6474076366759db86f101778c5f20ccvboxsync; Worker for VMMR0CallHost.
044af0d1e6474076366759db86f101778c5f20ccvboxsync; This will save the stack and registers.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync; @param pJmpBuf msc:rcx gcc:rdi x86:[ebp+8] Pointer to the jump buffer.
044af0d1e6474076366759db86f101778c5f20ccvboxsync; @param rc msc:rdx gcc:rsi x86:[ebp+c] The return code.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync;
044af0d1e6474076366759db86f101778c5f20ccvboxsyncBEGINPROC vmmR0CallHostLongJmp
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ; Save the registers on the stack.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync push ebp
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov ebp, esp
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync push edi
72a6fe3989272cb2d409b50caca25e1edbca9398vboxsync push esi
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync push ebx
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pushf
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync%ifdef VBOX_STRICT
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync push dword 0f00dbed0h
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync%endif
044af0d1e6474076366759db86f101778c5f20ccvboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ; Load parameters.
044af0d1e6474076366759db86f101778c5f20ccvboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov edx, [ebp + 08h] ; pJmpBuf
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov eax, [ebp + 0ch] ; rc
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ; Is the jump buffer armed?
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cmp dword [xDX + VMMR0JMPBUF.eip], byte 0
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync je .nok
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync ; Sanity checks.
044af0d1e6474076366759db86f101778c5f20ccvboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov edi, [xDX + VMMR0JMPBUF.pvSavedStack]
044af0d1e6474076366759db86f101778c5f20ccvboxsync test edi, edi ; darwin may set this to 0.
044af0d1e6474076366759db86f101778c5f20ccvboxsync jz .nok
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov [xDX + VMMR0JMPBUF.SpResume], esp
044af0d1e6474076366759db86f101778c5f20ccvboxsync%ifndef VMM_R0_SWITCH_STACK
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov esi, esp
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov ecx, [xDX + VMMR0JMPBUF.esp]
044af0d1e6474076366759db86f101778c5f20ccvboxsync sub ecx, esi
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ; two sanity checks on the size.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cmp ecx, VMM_STACK_SIZE ; check max size.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jnbe .nok
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ; Copy the stack.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync test ecx, 3 ; check alignment
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync jnz .nok
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync mov [xDX + VMMR0JMPBUF.cbSavedStack], ecx
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync shr ecx, 2
de6e321f351aa489a6a62bed474390a0056e8093vboxsync rep movsd
2d8870843ff566fee9bd3a6a5942414254106479vboxsync%endif ; !VMM_R0_SWITCH_STACK
a1df400bbe9d64aad400442e56eb637019300a5evboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync ; Save ESP & EBP to enable stack dumps
044af0d1e6474076366759db86f101778c5f20ccvboxsync mov ecx, ebp
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov [xDX + VMMR0JMPBUF.SavedEbp], ecx
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync sub ecx, 4
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov [xDX + VMMR0JMPBUF.SavedEsp], ecx
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ; store the last pieces of info.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov ecx, [xDX + VMMR0JMPBUF.esp]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov [xDX + VMMR0JMPBUF.SpCheck], ecx
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov byte [xDX + VMMR0JMPBUF.fInRing3Call], 1
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
9d020a0622f95aec3aabaff436a495e88dbbd71avboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ; Do the long jump.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov ebx, [xDX + VMMR0JMPBUF.ebx]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov esi, [xDX + VMMR0JMPBUF.esi]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov edi, [xDX + VMMR0JMPBUF.edi]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov ebp, [xDX + VMMR0JMPBUF.ebp]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov ecx, [xDX + VMMR0JMPBUF.eip]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov esp, [xDX + VMMR0JMPBUF.esp]
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync jmp ecx
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
2d8870843ff566fee9bd3a6a5942414254106479vboxsync ;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ; Failure
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ;
044af0d1e6474076366759db86f101778c5f20ccvboxsync.nok:
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync%ifdef VBOX_STRICT
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pop eax ; magic
a1df400bbe9d64aad400442e56eb637019300a5evboxsync cmp eax, 0f00dbed0h
de6e321f351aa489a6a62bed474390a0056e8093vboxsync je .magic_ok
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov ecx, 0123h
de6e321f351aa489a6a62bed474390a0056e8093vboxsync mov [ecx], edx
de6e321f351aa489a6a62bed474390a0056e8093vboxsync.magic_ok:
a1df400bbe9d64aad400442e56eb637019300a5evboxsync%endif
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync popf
044af0d1e6474076366759db86f101778c5f20ccvboxsync pop ebx
a1df400bbe9d64aad400442e56eb637019300a5evboxsync pop esi
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pop edi
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mov eax, VERR_INTERNAL_ERROR_4
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync leave
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ret
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncENDPROC vmmR0CallHostLongJmp
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync;;
a1df400bbe9d64aad400442e56eb637019300a5evboxsync; Internal R0 logger worker: Logger wrapper.
044af0d1e6474076366759db86f101778c5f20ccvboxsync;
044af0d1e6474076366759db86f101778c5f20ccvboxsync; @cproto VMMR0DECL(void) vmmR0LoggerWrapper(const char *pszFormat, ...)
044af0d1e6474076366759db86f101778c5f20ccvboxsync;
044af0d1e6474076366759db86f101778c5f20ccvboxsyncEXPORTEDNAME vmmR0LoggerWrapper
a1df400bbe9d64aad400442e56eb637019300a5evboxsync push 0 ; assumes we're the wrapper for a default instance.
044af0d1e6474076366759db86f101778c5f20ccvboxsync call NAME(RTLogLogger)
044af0d1e6474076366759db86f101778c5f20ccvboxsync add esp, byte 4
044af0d1e6474076366759db86f101778c5f20ccvboxsync ret
044af0d1e6474076366759db86f101778c5f20ccvboxsyncENDPROC vmmR0LoggerWrapper
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync