cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Common bootsector code init, traps.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This is included from bootsector2-common-init-code.mac and was split out of
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; that file to keep the size manageable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Copyright (C) 2007-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; available from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; you can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; General Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; The contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; of the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; VirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; CDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; You may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; terms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef BS2_WITH_TRAPS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %error "huh? BS2_WITH_TRAPS is not defined!"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;* Header Files *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;* Global Variables *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncALIGNDATA(8)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; Where to resume execution after a trap (if g_fTrapPrepared is set).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncg_TrapResumeRIP:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; Set if we've prepared for a trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncg_fTrapPrepared:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; Benchmark indicator.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This is set to the expected trap number when we're benchmarking and 0ffh when
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; we aren't benchmarking.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncg_u8TrapBenchmarkNo:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 0 ; alignment padding.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The last trap number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u8LastTrapNo
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The number of traps since last call to Bs2TrapReset.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u32cTraps
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The last trap error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u64LastTrapErr
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The register frame of the last trap (BS2REGS).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_LastTrapRegs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync times (BS2REGS_size) db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The RFLAGS/EFLAGS inside last invoked trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u64LastTrapHandlerRFlags
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The CS inside last invoked trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u16LastTrapHandlerCS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The SS inside last invoked trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u16LastTrapHandlerSS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0,0 ; alignment
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The RSP inside the last invoked trap handler, i.e. when bs2Trap_XX_32bit is
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; entered, so including fake error code and vector number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u64LastTrapHandlerRSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Pointer to an array of BS2TRAPREC1 records.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_paTrapRecs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; Number of entries in the array g_paTrapRecs points to.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_cTrapRecs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The index of the last BS2TRAPREC1 we hit.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_iTrapRecLast
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The base address the BS2TRAPREC.offWhere values are relative to.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_pTrapRecBase
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Reset all the trap globals to default.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This undos the effect of any previous Bs2TrapPrepare call.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapReset_rm16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push word 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u32cTraps], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8LastTrapNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8TrapBenchmarkNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapReset_rm16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Reset all the trap globals to default.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This undos the effect of any previous Bs2TrapPrepare call.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapReset_p16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push BS2_SEL_DS16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u32cTraps], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8LastTrapNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8TrapBenchmarkNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapReset_p16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Reset all the trap globals to default.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This undos the effect of any previous Bs2TrapPrepare call.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapReset_p32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push BS2_SEL_DS32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u32cTraps], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8LastTrapNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8TrapBenchmarkNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapReset_p32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Reset all the trap globals to default.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This undos the effect of any previous Bs2TrapPrepare call.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapReset_p64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u32cTraps], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8LastTrapNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov qword [g_u64LastTrapErr], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov qword [g_TrapResumeRIP], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8TrapBenchmarkNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapReset_p64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prepare for a test that will trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param xAX Where to resume after the trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param dl Set to 0ffh for tests and the expected trap number when
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; preparing a benchmark.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapPrepare_rm16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push word 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u32cTraps], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8LastTrapNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov word [g_TrapResumeRIP], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov word [g_TrapResumeRIP + 2], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8TrapBenchmarkNo], dl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapPrepare_rm16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prepare for a test that will trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ax Where to resume after the trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param dl Set to 0ffh for tests and the expected trap number when
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; preparing a benchmark.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapPrepare_p16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push BS2_SEL_DS16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u32cTraps], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8LastTrapNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov word [g_TrapResumeRIP], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov word [g_TrapResumeRIP + 2], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8TrapBenchmarkNo], dl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapPrepare_p16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prepare for a test that will trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param eax Where to resume after the trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param dl Set to 0ffh for tests and the expected trap number when
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; preparing a benchmark.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapPrepare_p32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push BS2_SEL_DS32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u32cTraps], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8LastTrapNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapErr + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_TrapResumeRIP + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8TrapBenchmarkNo], dl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapPrepare_p32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prepare for a test that will trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param rax Where to resume after the trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param dl Set to 0ffh for tests and the expected trap number when
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; preparing a benchmark.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapPrepare_p64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u32cTraps], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8LastTrapNo], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov qword [g_u64LastTrapErr], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov qword [g_TrapResumeRIP], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_u8TrapBenchmarkNo], dl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapPrepare_p64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW ; The TSSes, IDTs and handlers must be 16-bit addressable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef BS2_INC_CMN_PM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 32-bit TSS (X86TSS32).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncALIGNDATA(16)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Tss32Bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 07fffh ; selPrev - Back link to previous task. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0h ; padding1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd BS2_R0_STACK_ADDR ; esp0 - Ring-0 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw BS2_SEL_SS32 ; ss0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; padding
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd BS2_R1_STACK_ADDR ; esp1 - Ring-1 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; padding
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd BS2_R2_STACK_ADDR ; esp2 - Ring-1 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; padding
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0ffffffffh ; cr3 - Page directory for the task. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; eip - EIP before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; eflags - EFLAGS before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; eax - EAX before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; ecx - ECX before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; edx - EDX before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; ebx - EBX before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; esp - ESP before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; ebp - EBP before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; esi - ESI before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; edi - EDI before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0, 0 ; es,pad - ES before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0, 0 ; cs,pad - CS before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0, 0 ; ss,pad - SS before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0, 0 ; ds,pad - DS before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0, 0 ; fs,pad - FS before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0, 0 ; gs,pad - GS before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0, 0 ; ldt,pad - LDTR before task switch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; fDebugTrap - Debug trap flag.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 7fffh ; offIoBitmap - Offset relative to the TSS of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; start of the I/O Bitmap and the end of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; interrupt redirection bitmap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; IntRedirBitmap - 32 bytes for the virtual interrupt redirection bitmap. (VME)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Tss32BitEnd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynctimes (68h - (bs2Tss32BitEnd - bs2Tss32Bit)) db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynctimes ((bs2Tss32BitEnd - bs2Tss32Bit) - 68h) db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 32-bit TSS for #DF (X86TSS32).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncALIGNDATA(16)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Tss32BitDf:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 07fffh ; selPrev - Back link to previous task. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0h ; padding1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd BS2_DF_R0_STACK_ADDR ; esp0 - Ring-0 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw BS2_SEL_SS32 ; ss0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; padding
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; esp1 - Ring-1 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; padding
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; esp2 - Ring-1 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; padding
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0ffffffffh ; cr3 - Page directory for the task. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd bs2Trap_08h_32bit ; eip - EIP before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; eflags - EFLAGS before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; eax - EAX before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; ecx - ECX before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; edx - EDX before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; ebx - EBX before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd BS2_DF_R0_STACK_ADDR ; esp - ESP before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; ebp - EBP before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; esi - ESI before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; edi - EDI before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw BS2_SEL_DS32, 0 ; es,pad - ES before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw BS2_SEL_CS32, 0 ; cs,pad - CS before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw BS2_SEL_SS32, 0 ; ss,pad - SS before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw BS2_SEL_DS32, 0 ; ds,pad - DS before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw BS2_SEL_DS32, 0 ; fs,pad - FS before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw BS2_SEL_DS32, 0 ; gs,pad - GS before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0, 0 ; ldt,pad- LDTR before task switch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; fDebugTrap - Debug trap flag.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 7fffh ; offIoBitmap - Offset relative to the TSS of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; start of the I/O Bitmap and the end of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; interrupt redirection bitmap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; IntRedirBitmap - 32 bytes for the virtual interrupt redirection bitmap. (VME)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Tss32BitDfEnd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynctimes (68h - (bs2Tss32BitDfEnd - bs2Tss32BitDf)) db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynctimes ((bs2Tss32BitDfEnd - bs2Tss32BitDf) - 68h) db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 32-bit IDT (X86DESCGATE).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncALIGNDATA(16)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Idt32bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_00h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_01h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_02h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Idt32bit_BP:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_03h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_04h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_05h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_06h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_07h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0, BS2_SEL_TSS32_DF, 08500h, 00000h ; p=1 dpl=0 type=taskgate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_09h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0ah_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0bh_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0ch_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0dh_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0eh_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0fh_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_10h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_11h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_12h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_13h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_14h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_15h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_16h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_17h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_18h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_19h_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1ah_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1bh_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1ch_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1dh_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1eh_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1fh_32bit, BS2_SEL_CS32, 08e00h, 00000h ; p=1 dpl=0 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2TrapService32bit,BS2_SEL_CS32,0ee00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=3 type=int32gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define BS2_TRAP_SERVICE_NO 30h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Idt32bitEnd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 32-bit trap handlers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%macro bs2Trap_XX_32bit_macro 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Trap_ %+ %1 %+ _32bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp bs2Trap_XX_32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%macro bs2Trap_XX_32bit_macro_no_err 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Trap_ %+ %1 %+ _32bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp bs2Trap_XX_32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 00h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 01h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 02h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 03h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 04h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 05h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 06h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 07h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro 08h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 09h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro 0ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro 0bh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro 0ch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro 0dh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro 0eh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 0fh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro 11h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 12h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 13h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 14h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 15h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 16h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 17h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 18h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 19h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 1ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 1bh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 1ch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 1dh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 1eh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_32bit_macro_no_err 1fh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Common 32-bit trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return GS ebp + 2ch - v86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return FS ebp + 28h - v86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return DS ebp + 24h - v86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return ES ebp + 20h - v86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return SS ebp + 1ch - higher privilege
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return ESP ebp + 18h - higher privilege
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return EFLAGS ebp + 14h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return CS ebp + 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return EIP ebp + 0ch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; error code ebp + 08h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; vector # ebp + 04h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC bs2Trap_XX_32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ebp ; ebp + 00h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ebp, esp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushfd ; ebp - 04h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax ; ebp - 08h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ebx ; ebp - 0ch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ecx ; ebp - 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds ; ebp - 14h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ss ; load flat DS. Using SS here because of conforming IDTE.CS tests.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Benchmark mode? Then resume the action right away!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 04h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [g_u8TrapBenchmarkNo], al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .test_mode
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .test_mode
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [g_TrapResumeRIP]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 0ch], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add esp, 08h ; Skip the vector # and error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Update the globals.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor ecx, ecx ; zero register
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc dword [g_u32cTraps]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 04h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u8LastTrapNo], al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapErr], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapErr + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp - 04h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapHandlerRFlags], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_u64LastTrapHandlerRFlags + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u16LastTrapHandlerCS], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u16LastTrapHandlerSS], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea eax, [ebp + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapHandlerRSP], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapHandlerRSP + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Save the registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea ebx, [g_LastTrapRegs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp - 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rax], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rax + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp - 0ch]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rbx], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rbx + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp - 10h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rcx], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rcx + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rdx], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rdx + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rdi], edi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rdi + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rsi], esi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rsi + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rbp], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rbp + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 0ch]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rip], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rip + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r8], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r8 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r9], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r9 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r10], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r10 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r11], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r11 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r12], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r12 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r13], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r13 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r14], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r14 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r15], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.r15 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 14h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rflags], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rflags+4],ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 10h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cBits], byte 32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Part of the stack varies depending on the trap context.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test dword [ebx + BS2REGS.rflags], X86_EFL_VM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test ax, 7h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea eax, [ebp + 18h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rsp], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rsp + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.ss], ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp - 14h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.ds], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.es], es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.fs], fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.gs], gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .do_crX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.higher_privilege:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 18h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rsp], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rsp + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 20h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.ss], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp - 14h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.ds], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.es], es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.fs], fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.gs], gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .do_crX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 18h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rsp], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.rsp + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 1ch]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.ss], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 24h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.ds], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 20h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.es], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 28h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.fs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 2ch]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.gs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;jmp .do_crX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; The CRx registers are only accessible from ring-0 (CS=conforming, CPL < 0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test byte [ebx + BS2REGS.ss], 3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .skip_crX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr0], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr0 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr2], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr2 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr3], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr3 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr4], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr4 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr8], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebx + BS2REGS.cr8 + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Advance to a prepared resume position or panic.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .no_resume_pos
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [g_TrapResumeRIP]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 0ch], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef BS2_WITH_XCPT_DB_CLEARING_TF
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [ebp + 04h], X86_XCPT_DB ; make sure we won't trap again due to a TF.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .resume_no_clear_trap_flags
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and word [ebp + 14h], ~X86_EFL_TF
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.resume_no_clear_trap_flags:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add esp, 8h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.no_resume_pos:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Look for a trap record.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [g_cTrapRecs] ; the number of records.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test ecx, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub eax, [g_pTrapRecBase] ; the offWhere we're looking for.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Look starting at the previous record first.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ebx, [g_iTrapRecLast]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub ecx, ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jbe .traprec_loop2 ; g_iTrapRecLast is out of range.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync shl ebx, BS2TRAPREC_SIZE_SHIFT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add ebx, [g_paTrapRecs] ; ebx points to the record we hit last time.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_loop1_next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [ebx + BS2TRAPREC.offWhere], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_found
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add ebx, BS2TRAPREC_size
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .traprec_loop1_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Start searching from the start, stopping at the previous record.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_loop2:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [g_iTrapRecLast]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or ecx, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .panic ; not found.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ebx, [g_paTrapRecs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_loop2_next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [ebx + BS2TRAPREC.offWhere], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_found
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add ebx, BS2TRAPREC_size
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .traprec_loop2_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .panic ; not found
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_found:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Remember the hit for the next trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub eax, [g_paTrapRecs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync shr eax, BS2TRAPREC_SIZE_SHIFT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_iTrapRecLast], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Fail the test if we got the wrong trap or error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [g_u8LastTrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, [ebx + BS2TRAPREC.u8TrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_ok_trap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, byte [ebx + BS2TRAPREC.u8TrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szWrongTrap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add esp, 12
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_ok_trap:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, [g_u64LastTrapErr]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ax, [ebx + BS2TRAPREC.u16ErrCd]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_ok_err_cd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [ebx + BS2TRAPREC.u16ErrCd]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szWrongErrCd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add esp, 12
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_ok_err_cd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Advance the EIP and resume execution.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, byte [ebx + BS2TRAPREC.offResumeAddend]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add eax, [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 0ch], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .resume
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Write panic message and then halt.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rflags]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.ss]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.gs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.fs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.es]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.ds]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.cs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.cr4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.cr3]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.cr0]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rbp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rsp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rdi]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rsi]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rdx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rcx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rbx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rax]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 0ch]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [ebp + 10h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, byte [ebp + 04h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szPanicMsg
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call Bs2Panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .panic ; paranoia
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szPanicMsg:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'trap #%RX8 at %RX16:%RX32 cr2=%RX32 err=%RX32', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'eax=%RX32 ebx=%RX32 ecx=%RX32 edx=%RX32 esi=%RX32 edi=%RX32', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'eip=%RX32 esp=%RX32 ebp=%RX32 cr0=%RX32 cr3=%RX32 cr4=%RX32', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'cs=%RX16 ds=%RX16 es=%RX16 fs=%RX16 gs=%RX16 ss=%RX16 eflags=%RX32', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szWrongTrap:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'Expected trap %RX8 got %RX8', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szWrongErrCd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'Expected errcd %RX16 got %RX16', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC bs2Trap_XX_32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Service IRQ handler, 32-bit version.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Takes requests in eax and later maybe parameters in other registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return GS ebp + 24h - v86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return FS ebp + 20h - v86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return DS ebp + 1ch - v86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return ES ebp + 18h - v86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return SS ebp + 14h - higher privilege
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return ESP ebp + 10h - higher privilege
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return EFLAGS ebp + 0ch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return CS ebp + 08h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return EIP ebp + 04h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC bs2TrapService32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .highsegment
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.highsegment:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ebp ; ebp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ebp, esp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax ; ebp - 04h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push edx ; ebp - 08h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ecx ; ebp - 0ch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ebx ; ebp - 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds ; ebp - 14h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Classify the caller context in cl.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;; @todo What if CS on the stack is conforming?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define BS2_TRP_SRV_CALLER_SAME_RING 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define BS2_TRP_SRV_CALLER_OTHER_RING 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define BS2_TRP_SRV_CALLER_VM 2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test dword [ebp + 0ch], X86_EFL_VM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .vm_ctx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ch, [ebp + 08h] ; cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and cx, 00303h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .same_ctx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cl, BS2_TRP_SRV_CALLER_OTHER_RING
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done_ctx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cl, BS2_TRP_SRV_CALLER_VM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done_ctx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cl, BS2_TRP_SRV_CALLER_SAME_RING
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Switch (eax).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, BS2_SYSCALL_TO_RING3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jbe .to_ringX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Unknown request.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, -1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return: ; careful with ebp here!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Switching to the ring specified by eax.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Annoying that ss:esp isn't always restored.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp cl, BS2_TRP_SRV_CALLER_VM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .failure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub al, BS2_SYSCALL_TO_RING0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Fake missing stack registers if necessary.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp cl, BS2_TRP_SRV_CALLER_SAME_RING
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .have_stack_regs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub esp, 8h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub ebp, 8h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor ebx, ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [esp + 8 + ebx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [esp + ebx], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, 9*4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .move_more
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 14h], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea edx, [ebp + 18h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 10h], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.have_stack_regs:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Translate the selector registers
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [ebp - 14h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp - 14h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [ebp + 08h] ; cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 08h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [ebp + 14h] ; ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 14h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or dword [ebp + 0ch], X86_EFL_IOPL ; set IOPL=3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; If the desired target is ring-0 we cannot use iret.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .iret_to_ring_with_stack
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done_success:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.iret_to_ring_with_stack:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Move the iret-to-same-ring to the desired return position. By also
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; moving the saved ebp we make the leave instruction do stack
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cli ; paranoia, it's disable already.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 10h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea edx, [ebp + 18h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea ecx, [ebp + 08h] ; same stack, just shifted 8 bytes
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .move_iret_and_ebp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [ebp + 10h] ; different stack.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub ecx, 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.move_iret_and_ebp:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [ebp + 0ch]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ecx + 0ch], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ecx + 08h], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [ebp + 04h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 00h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ecx + 04h], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ecx + 00h], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ebp, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC bs2TrapService32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; BS2_INC_CMN_PM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef BS2_INC_CMN_LM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 64-bit TSS (X86TSS64).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncALIGNDATA(16)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Tss64Bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; 00h - u32Reserved - Reserved.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_R0_STACK_ADDR ; 04h - rsp0 - Ring-0 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_R1_STACK_ADDR ; 1ch - rsp1 - Ring-1 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_R2_STACK_ADDR ; 14h - rsp2 - Ring-2 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq 0 ; 2ch - reserved
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_DF_R0_STACK_ADDR ; 24h - ist1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_R0_STACK_ADDR ; 3ch - ist2;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_R0_STACK_ADDR ; 34h - ist3;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_R0_STACK_ADDR ; 4ch - ist4;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_R0_STACK_ADDR ; 44h - ist5;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_R0_STACK_ADDR ; 5ch - ist6;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq BS2_R0_STACK_ADDR ; 54h - ist7;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0,0,0,0,0 ; 6ch - reserved
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; 76h - offIoBitmap - Offset relative to the TSS of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; 00h - start of the I/O Bitmap and the end of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; 00h - interrupt redirection bitmap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Tss64BitEnd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynctimes (68h - (bs2Tss64BitEnd - bs2Tss64Bit)) db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynctimes ((bs2Tss64BitEnd - bs2Tss64Bit) - 68h) db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 64-bit IDT (X86DESC64GATE).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncALIGNDATA(16)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Idt64bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_00h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_01h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_02h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Idt64bit_BP:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_03h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_04h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_05h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_06h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_07h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_08h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_09h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0ah_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0bh_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0ch_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0dh_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0eh_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_0fh_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_10h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_11h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_12h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_13h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_14h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_15h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_16h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_17h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_18h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_19h_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1ah_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1bh_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1ch_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1dh_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1eh_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2Trap_1fh_64bit, BS2_SEL_CS64, 08e00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=0 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw bs2TrapService64bit,BS2_SEL_CS64,0ee00h, 00000h, 0, 0, 0, 0 ; p=1 dpl=3 type=int64gate
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Idt64bitEnd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 64-bit trap handlers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%macro bs2Trap_XX_64bit_macro 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Trap_ %+ %1 %+ _64bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp bs2Trap_XX_64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%macro bs2Trap_XX_64bit_macro_no_err 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Trap_ %+ %1 %+ _64bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp bs2Trap_XX_64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 00h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 01h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 02h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 03h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 04h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 05h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 06h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 07h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro 08h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 09h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro 0ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro 0bh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro 0ch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro 0dh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro 0eh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 0fh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro 11h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 12h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 13h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 14h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 15h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 16h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 17h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 18h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 19h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 1ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 1bh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 1ch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 1dh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 1eh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bs2Trap_XX_64bit_macro_no_err 1fh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Common 64-bit trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return SS rbp + 38h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return RSP rbp + 30h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return RFLAGS rbp + 28h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return CS rbp + 20h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return RIP rbp + 18h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; error code rbp + 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; vector # rbp + 08h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC bs2Trap_XX_64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rbp ; rbp + 00h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rbp, rsp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushfq ; rbp - 08h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax ; rbp - 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rbx ; rbp - 18h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Benchmark mode? Then resume the action right away!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp + 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [g_u8TrapBenchmarkNo], al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .test_mode
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .test_mode
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [g_TrapResumeRIP]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbp + 18h], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rsp, 10h ; Skip the vector # and error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor rax, rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Save the trap information
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc dword [g_u32cTraps]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp + 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u8LastTrapNo], al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp + 10h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapErr], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp - 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapHandlerRFlags], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u16LastTrapHandlerCS], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u16LastTrapHandlerSS], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea rax, [rbp + 8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapHandlerRSP], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Save the registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea rbx, [g_LastTrapRegs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp - 10h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rax], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp - 18h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rbx], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rcx], rcx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rdx], rdx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rdi], rdi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rsi], rsi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rbp], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp + 30h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rsp], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp + 18h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rip], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.r8], r8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.r9], r9
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.r10], r10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.r11], r11
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.r12], r12
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.r13], r13
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.r14], r14
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.r15], r15
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp + 28h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.rflags], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp + 20h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.cs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.ds], ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.es], es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.fs], fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.gs], gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [rbp + 38h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.ss], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.cBits], byte 64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; The CRx registers are only accessible from ring-0 (CS=conforming, CPL < 0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test byte [rbx + BS2REGS.ss], 3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .skip_crX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.cr0], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.cr2], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.cr3], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.cr4], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbx + BS2REGS.cr8], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Advance to a prepared resume position or panic.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .no_resume_pos
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fTrapPrepared], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [g_TrapResumeRIP]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbp + 18h], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .resume
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef BS2_WITH_XCPT_DB_CLEARING_TF
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [rbp + 08h], X86_XCPT_DB ; make sure we won't trap again due to a TF.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .resume_no_clear_trap_flags
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and word [rbp + 28h], ~X86_EFL_TF
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.resume_no_clear_trap_flags:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rsp, 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.no_resume_pos:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Look for a trap record.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [g_cTrapRecs] ; the number of records.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test ecx, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub rax, [g_pTrapRecBase] ; the offWhere we're looking for.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rbx, _4G
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp rax, rbx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jae .panic ; out of range.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Look starting at the previous record first.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ebx, [g_iTrapRecLast]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub ecx, ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jbe .traprec_loop2 ; g_iTrapRecLast is out of range.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync shl rbx, BS2TRAPREC_SIZE_SHIFT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rbx, [g_paTrapRecs] ; ebx points to the record we hit last time.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_loop1_next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [rbx + BS2TRAPREC.offWhere], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_found
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rbx, BS2TRAPREC_size
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .traprec_loop1_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Start searching from the start, stopping at the previous record.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_loop2:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [g_iTrapRecLast]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or ecx, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .panic ; not found.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rbx, [g_paTrapRecs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_loop2_next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [rbx + BS2TRAPREC.offWhere], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_found
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rbx, BS2TRAPREC_size
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .traprec_loop2_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .panic ; not found
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_found:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Remember the hit for the next trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, rbx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub rax, [g_paTrapRecs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync shr rax, BS2TRAPREC_SIZE_SHIFT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_iTrapRecLast], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Fail the test if we got the wrong trap or error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [g_u8LastTrapNo wrt rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, [rbx + BS2TRAPREC.u8TrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_ok_trap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx rax, byte [rbx + BS2TRAPREC.u8TrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szWrongTrap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p64)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rsp, 24
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_ok_trap:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, [g_u64LastTrapErr wrt rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ax, [rbx + BS2TRAPREC.u16ErrCd]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_ok_err_cd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx rax, word [rbx + BS2TRAPREC.u16ErrCd]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szWrongErrCd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p64)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rsp, 24
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_ok_err_cd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Advance the EIP and resume execution.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx rax, byte [rbx + BS2TRAPREC.offResumeAddend]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rax, [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbp + 18h], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .resume
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Format a panic message and halt.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea rbx, [g_LastTrapRegs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.ss]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.gs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.fs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.es]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.ds]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.cs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rbp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rsp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rflags]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.r15]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.r14]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.r13]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.r12]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.r11]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.r10]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.r9]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.r8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rdi]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rsi]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rdx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rcx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rbx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rax]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [rbx + BS2REGS.cr8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [rbx + BS2REGS.cr4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [rbx + BS2REGS.cr3]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [rbx + BS2REGS.cr0]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbp + 10h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.cr2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push qword [rbx + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbp + BS2REGS.ss]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, byte [rbp + 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szPanicMsg
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p64)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call Bs2Panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .panic ; paranoia
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szPanicMsg:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'trap #%RX8 at %RX16:%RX64 cr2=%RX64 err=%RX64', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'cr0=%RX64 cr3=%RX64 cr4=%RX64 cr8=%RX16', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'rax=%RX64 rbx=%RX64 rcx=%RX64', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'rdx=%RX64 rsi=%RX64 rdi=%RX64', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'r8 =%RX64 r9 =%RX64 r10=%RX64', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'r11=%RX64 r12=%RX64 r13=%RX64', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'r14=%RX64 r15=%RX64 rfl=%RX64', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'rip=%RX64 rsp=%RX64 rbp=%RX64 ', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'cs=%RX16 ds=%RX16 es=%RX16 fs=%RX16 gs=%RX16 ss=%RX16', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szWrongTrap:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'Expected trap %RX8 got %RX8', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szWrongErrCd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'Expected errcd %RX16 got %RX16', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC bs2Trap_XX_64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Service IRQ handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Takes requests in eax and later maybe parameters in other registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return SS rbp + 28h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return RSP rbp + 20h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return RFLAGS rbp + 18h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return CS rbp + 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; return RIP rbp + 08h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC bs2TrapService64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .highsegment
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.highsegment:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rbp, rsp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Switch (eax).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, BS2_SYSCALL_TO_RING3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jbe .to_ringX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Unknown request.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, -1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Switching to the ring specified by eax.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub eax, BS2_SYSCALL_TO_RING0 ; al = new ring number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [rbp + 10h] ; cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbp + 10h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [rbp + 28h] ; ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbp + 28h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or dword [ebp + 18h], X86_EFL_IOPL ; set IOPL=3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done_success
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done_success:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC bs2TrapService64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; BS2_INC_CMN_LM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Converts a segment value (dx) to the ring specified by al.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; If the selector isn't a known CS, DS or SS selector it will be set to null.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param al The desired ring.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param dx The segment to convert.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @remarks WARNING! This has to work exactly the same both in 32-bit and 64-bit mode.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Classify the incoming selector.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R0_BASE + BS2_SEL_GRP_SIZE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R1_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R1_BASE + BS2_SEL_GRP_SIZE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R2_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R2_BASE + BS2_SEL_GRP_SIZE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R3_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R3_BASE + BS2_SEL_GRP_SIZE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Convert the incoming selector to ring-0 and then from ring-0 to the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; desired one.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add dx, BS2_SEL_R1_BASE - BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add dx, BS2_SEL_R2_BASE - BS2_SEL_R1_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add dx, BS2_SEL_R3_BASE - BS2_SEL_R2_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub dx, BS2_SEL_R1_BASE - BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub dx, BS2_SEL_R2_BASE - BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub dx, BS2_SEL_R3_BASE - BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and dl, ~3h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or dl, al ; set the RPL
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW