4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TITLE CpuAsm.asm:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;* Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;* This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;* are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;* which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;* http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;* CpuAsm.asm
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;* Abstract:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync .code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEXTRN mErrorCodeFlag:DWORD ; Error code flags for exceptions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; point to the external interrupt vector table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExternalVectorTablePtr QWORD 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInitializeExternalVectorTablePtr PROC PUBLIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ExternalVectorTablePtr, rcx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ret
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInitializeExternalVectorTablePtr ENDP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; SetCodeSelector (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; UINT16 Selector
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetCodeSelector PROC PUBLIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sub rsp, 0x10
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lea rax, setCodeSelectorLongJump
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov [rsp], rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov [rsp+4], cx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jmp fword ptr [rsp]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsetCodeSelectorLongJump:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add rsp, 0x10
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ret
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetCodeSelector ENDP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; SetDataSelectors (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; UINT16 Selector
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetDataSelectors PROC PUBLIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ss, cx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ds, cx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov es, cx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov fs, cx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov gs, cx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ret
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetDataSelectors ENDP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;---------------------------------------;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; CommonInterruptEntry ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;---------------------------------------;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; The follow algorithm is used for the common interrupt routine.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCommonInterruptEntry PROC PUBLIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cli
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; All interrupt handlers are invoked through interrupt gates, so
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; IF flag automatically cleared at the entry point
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Calculate vector number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xchg rcx, [rsp] ; get the return address of call, actually, it is the address of vector number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync movzx ecx, word ptr [rcx]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cmp ecx, 32 ; Intel reserved vector for exceptions?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jae NoErrorCode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bt mErrorCodeFlag, ecx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jc @F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNoErrorCode:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Push a dummy error code on the stack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; to maintain coherent stack map
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push [rsp]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov qword ptr [rsp + 8], 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync@@:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rbp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rbp, rsp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Stack:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; +---------------------+ <-- 16-byte aligned ensured by processor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; + Old SS +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; +---------------------+
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; + Old RSP +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; +---------------------+
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; + RFlags +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; +---------------------+
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; + CS +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; +---------------------+
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; + RIP +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; +---------------------+
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; + Error Code +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; +---------------------+
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; + RCX / Vector Number +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; +---------------------+
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; + RBP +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; +---------------------+ <-- RBP, 16-byte aligned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Since here the stack pointer is 16-byte aligned, so
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; EFI_FX_SAVE_STATE_X64 of EFI_SYSTEM_CONTEXT_x64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; is 16-byte aligned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 R8, R9, R10, R11, R12, R13, R14, R15;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push r15
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push r14
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push r13
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push r12
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push r11
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push r10
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push r9
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push r8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push qword ptr [rbp + 8] ; RCX
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rdx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rbx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push qword ptr [rbp + 48] ; RSP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push qword ptr [rbp] ; RBP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rsi
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rdi
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Gs, Fs, Es, Ds, Cs, Ss; insure high 16 bits of each is zero
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync movzx rax, word ptr [rbp + 56]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax ; for ss
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync movzx rax, word ptr [rbp + 32]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax ; for cs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, ds
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, es
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, fs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, gs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov [rbp + 8], rcx ; save vector number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Rip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push qword ptr [rbp + 24]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Gdtr[2], Idtr[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xor rax, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sidt [rsp]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xchg rax, [rsp + 2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xchg rax, [rsp]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xchg rax, [rsp + 8]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xor rax, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sgdt [rsp]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xchg rax, [rsp + 2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xchg rax, [rsp]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xchg rax, [rsp + 8]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Ldtr, Tr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xor rax, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync str ax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sldt ax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 RFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push qword ptr [rbp + 40]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, cr8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, cr4
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or rax, 208h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov cr4, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, cr3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, cr2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xor rax, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, cr0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, dr7
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, dr6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, dr3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, dr2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, dr1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, dr0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; FX_SAVE_STATE_X64 FxSaveState;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sub rsp, 512
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rdi, rsp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync db 0fh, 0aeh, 07h ;fxsave [rdi]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UEFI calling convention for x64 requires that Direction flag in EFLAGs is clear
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cld
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT32 ExceptionData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync push qword ptr [rbp + 16]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; call into exception handler
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rcx, [rbp + 8]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, ExternalVectorTablePtr ; get the interrupt vectors base
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rax, [rax + rcx * 8]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or rax, rax ; NULL?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync je nonNullValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; Prepare parameter and call
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; mov rcx, [rbp + 8]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rdx, rsp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Per X64 calling convention, allocate maximum parameter stack space
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; and make sure RSP is 16-byte aligned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sub rsp, 4 * 8 + 8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync call rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add rsp, 4 * 8 + 8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncnonNullValue:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cli
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 ExceptionData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add rsp, 8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; FX_SAVE_STATE_X64 FxSaveState;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rsi, rsp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync db 0fh, 0aeh, 0Eh ; fxrstor [rsi]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add rsp, 512
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; Skip restoration of DRx registers to support in-circuit emualators
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; or debuggers set breakpoint in interrupt/exception context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add rsp, 8 * 6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov cr0, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add rsp, 8 ; not for Cr1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov cr2, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov cr3, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov cr4, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov cr8, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 RFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop qword ptr [rbp + 40]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Ldtr, Tr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Gdtr[2], Idtr[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; Best not let anyone mess with these particular registers...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add rsp, 48
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Rip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop qword ptr [rbp + 24]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Gs, Fs, Es, Ds, Cs, Ss;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; mov gs, rax ; not for gs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; mov fs, rax ; not for fs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; (X64 will not use fs and gs, so we do not restore it)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov es, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ds, rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop qword ptr [rbp + 32] ; for cs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop qword ptr [rbp + 56] ; for ss
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;; UINT64 R8, R9, R10, R11, R12, R13, R14, R15;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rdi
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rsi
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add rsp, 8 ; not for rbp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop qword ptr [rbp + 48] ; for rsp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rbx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rdx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rcx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop r8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop r9
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop r10
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop r11
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop r12
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop r13
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop r14
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop r15
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov rsp, rbp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pop rbp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add rsp, 16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync iretq
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCommonInterruptEntry ENDP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync