cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; $Id$
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; @file
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Common bootsector code init, traps.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This is included from bootsector2-common-init-code.mac and was split out of
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; that file to keep the size manageable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Copyright (C) 2007-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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;
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;
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;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef BS2_WITH_TRAPS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %error "huh? BS2_WITH_TRAPS is not defined!"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;* Header Files *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%include "bootsector2-structures.mac"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%include "bootsector2-api.mac"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;* Global Variables *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncALIGNDATA(8)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; Where to resume execution after a trap (if g_fTrapPrepared is set).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @internal
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncg_TrapResumeRIP:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; Set if we've prepared for a trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @internal
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncg_fTrapPrepared:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; Benchmark indicator.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This is set to the expected trap number when we're benchmarking and 0ffh when
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; we aren't benchmarking.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @internal
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncg_u8TrapBenchmarkNo:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 0 ; alignment padding.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The last trap number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u8LastTrapNo
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The number of traps since last call to Bs2TrapReset.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u32cTraps
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The last trap error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u64LastTrapErr
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The register frame of the last trap (BS2REGS).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_LastTrapRegs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync times (BS2REGS_size) db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The RFLAGS/EFLAGS inside last invoked trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u64LastTrapHandlerRFlags
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The CS inside last invoked trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u16LastTrapHandlerCS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The SS inside last invoked trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_u16LastTrapHandlerSS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0
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 dq 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Pointer to an array of BS2TRAPREC1 records.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_paTrapRecs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; Number of entries in the array g_paTrapRecs points to.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_cTrapRecs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The index of the last BS2TRAPREC1 we hit.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_iTrapRecLast
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; The base address the BS2TRAPREC.offWhere values are relative to.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME g_pTrapRecBase
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dq 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Reset all the trap globals to default.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This undos the effect of any previous Bs2TrapPrepare call.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapReset_rm16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push word 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapReset_rm16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Reset all the trap globals to default.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This undos the effect of any previous Bs2TrapPrepare call.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapReset_p16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push BS2_SEL_DS16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapReset_p16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Reset all the trap globals to default.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This undos the effect of any previous Bs2TrapPrepare call.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapReset_p32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push BS2_SEL_DS32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapReset_p32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Reset all the trap globals to default.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This undos the effect of any previous Bs2TrapPrepare call.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 64
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapReset_p64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prepare for a test that will trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapPrepare_rm16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push word 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapPrepare_rm16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prepare for a test that will trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapPrepare_p16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push BS2_SEL_DS16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapPrepare_p16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prepare for a test that will trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC Bs2TrapPrepare_p32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push BS2_SEL_DS32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapPrepare_p32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prepare for a test that will trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 64
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC Bs2TrapPrepare_p64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW ; The TSSes, IDTs and handlers must be 16-bit addressable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef BS2_INC_CMN_PM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 32-bit TSS (X86TSS32).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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 ; ss1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; padding
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd BS2_R2_STACK_ADDR ; esp2 - Ring-1 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; ss2
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 32-bit TSS for #DF (X86TSS32).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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 ; ss1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; padding
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dd 0 ; esp2 - Ring-1 stack pointer. (static)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dw 0 ; ss2
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 32-bit IDT (X86DESCGATE).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; @todo
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Idt32bitEnd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 32-bit trap handlers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%macro bs2Trap_XX_32bit_macro 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Trap_ %+ %1 %+ _32bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push %1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp bs2Trap_XX_32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endmacro
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%macro bs2Trap_XX_32bit_macro_no_err 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Trap_ %+ %1 %+ _32bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push %1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp bs2Trap_XX_32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endmacro
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Common 32-bit trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 32
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ss ; load flat DS. Using SS here because of conforming IDTE.CS tests.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ds, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Benchmark mode? Then resume the action right away!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;pop eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;popfd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add esp, 08h ; Skip the vector # and error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Update the globals.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.test_mode:
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 ax, cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u16LastTrapHandlerCS], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u16LastTrapHandlerSS], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea eax, [ebp + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapHandlerRSP], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapHandlerRSP + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Save the registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Part of the stack varies depending on the trap context.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test dword [ebx + BS2REGS.rflags], X86_EFL_VM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .v86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test ax, 7h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .ring0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ring0:
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
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.v86:
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.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.skip_crX:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Advance to a prepared resume position or panic.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.resume:
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%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;popfd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add esp, 8h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.no_resume_pos:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Look for a trap record.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [g_cTrapRecs] ; the number of records.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test ecx, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub eax, [g_pTrapRecBase] ; the offWhere we're looking for.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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 dec ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .traprec_loop1_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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 dec ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .traprec_loop2_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .panic ; not found
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Fail the test if we got the wrong trap or error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [g_u8LastTrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, [ebx + BS2TRAPREC.u8TrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_ok_trap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, byte [ebx + BS2TRAPREC.u8TrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szWrongTrap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add esp, 12
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_ok_trap:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, [g_u64LastTrapErr]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ax, [ebx + BS2TRAPREC.u16ErrCd]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_ok_err_cd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [ebx + BS2TRAPREC.u16ErrCd]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szWrongErrCd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add esp, 12
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_ok_err_cd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Advance the EIP and resume execution.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, byte [ebx + BS2TRAPREC.offResumeAddend]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add eax, [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 0ch], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .resume
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Write panic message and then halt.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.panic:
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 push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [ebp + 0ch]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [ebp + 10h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, byte [ebp + 04h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szPanicMsg
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call Bs2Panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .panic ; paranoia
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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 db 0
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Service IRQ handler, 32-bit version.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Takes requests in eax and later maybe parameters in other registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ds, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Classify the caller context in cl.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;; @todo What if CS on the stack is conforming?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cx, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ch, [ebp + 08h] ; cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and cx, 00303h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ch, cl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .same_ctx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cl, BS2_TRP_SRV_CALLER_OTHER_RING
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done_ctx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.vm_ctx:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cl, BS2_TRP_SRV_CALLER_VM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done_ctx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.same_ctx:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cl, BS2_TRP_SRV_CALLER_SAME_RING
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done_ctx:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Switch (eax).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, BS2_SYSCALL_TO_RING3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jbe .to_ringX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Unknown request.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.failure:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, -1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return: ; careful with ebp here!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;pop eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iretd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Switching to the ring specified by eax.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Annoying that ss:esp isn't always restored.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.to_ringX:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp cl, BS2_TRP_SRV_CALLER_VM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .failure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub al, BS2_SYSCALL_TO_RING0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Fake missing stack registers if necessary.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp cl, BS2_TRP_SRV_CALLER_SAME_RING
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .have_stack_regs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub esp, 8h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub ebp, 8h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor ebx, ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.move_more:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [esp + 8 + ebx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [esp + ebx], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add ebx, 4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, 9*4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .move_more
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 14h], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea edx, [ebp + 18h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 10h], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.have_stack_regs:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Translate the selector registers
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [ebp - 14h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp - 14h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov es, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov fs, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov gs, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [ebp + 08h] ; cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 08h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [ebp + 14h] ; ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [ebp + 14h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or dword [ebp + 0ch], X86_EFL_IOPL ; set IOPL=3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; If the desired target is ring-0 we cannot use iret.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .iret_to_ring_with_stack
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done_success:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.iret_to_ring_with_stack:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
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 ; adjusting/switching for us.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC bs2TrapService32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; BS2_INC_CMN_PM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef BS2_INC_CMN_LM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 64-bit TSS (X86TSS64).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 64-bit IDT (X86DESC64GATE).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; 64-bit trap handlers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%macro bs2Trap_XX_64bit_macro 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Trap_ %+ %1 %+ _64bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push %1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp bs2Trap_XX_64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endmacro
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%macro bs2Trap_XX_64bit_macro_no_err 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncbs2Trap_ %+ %1 %+ _64bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push %1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp bs2Trap_XX_64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endmacro
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Common 64-bit trap handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Benchmark mode? Then resume the action right away!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop rbx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;pop rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;popfq
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rsp, 10h ; Skip the vector # and error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor rax, rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iretq
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Save the trap information
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.test_mode:
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 ax, cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u16LastTrapHandlerCS], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u16LastTrapHandlerSS], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea rax, [rbp + 8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_u64LastTrapHandlerRSP], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
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.skip_crX:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Advance to a prepared resume position or panic.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.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%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop rbx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;popfq
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rsp, 10h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iretq
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.no_resume_pos:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Look for a trap record.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rcx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [g_cTrapRecs] ; the number of records.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test ecx, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub rax, [g_pTrapRecBase] ; the offWhere we're looking for.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rbx, _4G
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp rax, rbx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jae .panic ; out of range.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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 dec ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .traprec_loop1_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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 dec ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .traprec_loop2_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .panic ; not found
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Fail the test if we got the wrong trap or error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [g_u8LastTrapNo wrt rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, [rbx + BS2TRAPREC.u8TrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_ok_trap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx rax, byte [rbx + BS2TRAPREC.u8TrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szWrongTrap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p64)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rsp, 24
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_ok_trap:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, [g_u64LastTrapErr wrt rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ax, [rbx + BS2TRAPREC.u16ErrCd]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .traprec_ok_err_cd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx rax, word [rbx + BS2TRAPREC.u16ErrCd]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szWrongErrCd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p64)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rsp, 24
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.traprec_ok_err_cd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Advance the EIP and resume execution.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx rax, byte [rbx + BS2TRAPREC.offResumeAddend]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add rax, [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbp + 18h], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop rcx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .resume
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Format a panic message and halt.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.panic:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea rbx, [g_LastTrapRegs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.ss]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.gs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.fs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.es]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.ds]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [rbx + BS2REGS.cs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
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 push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [rbx + BS2REGS.cr4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [rbx + BS2REGS.cr3]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [rbx + BS2REGS.cr0]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
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 push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, byte [rbp + 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szPanicMsg
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call NAME(TestFailedF_p64)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call Bs2Panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .panic ; paranoia
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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 db 0
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Service IRQ handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Takes requests in eax and later maybe parameters in other registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
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 push rbp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rbp, rsp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rdx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push rcx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Switch (eax).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, BS2_SYSCALL_TO_RING3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jbe .to_ringX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Unknown request.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, -1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop rcx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop rdx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;pop rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iretq
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Switching to the ring specified by eax.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.to_ringX:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub eax, BS2_SYSCALL_TO_RING0 ; al = new ring number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ds, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov es, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov fs, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov gs, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [rbp + 10h] ; cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbp + 10h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [rbp + 28h] ; ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [rbp + 28h], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or dword [ebp + 18h], X86_EFL_IOPL ; set IOPL=3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done_success
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done_success:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC bs2TrapService64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; BS2_INC_CMN_LM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Converts a segment value (dx) to the ring specified by al.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; If the selector isn't a known CS, DS or SS selector it will be set to null.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param al The desired ring.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param dx The segment to convert.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @remarks WARNING! This has to work exactly the same both in 32-bit and 64-bit mode.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODEHIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Classify the incoming selector.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .null
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R0_BASE + BS2_SEL_GRP_SIZE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .ring0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R1_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .miss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R1_BASE + BS2_SEL_GRP_SIZE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .ring1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R2_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .miss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R2_BASE + BS2_SEL_GRP_SIZE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .ring2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R3_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .miss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dx, BS2_SEL_R3_BASE + BS2_SEL_GRP_SIZE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .ring3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .miss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Convert the incoming selector to ring-0 and then from ring-0 to the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; desired one.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ring0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add dx, BS2_SEL_R1_BASE - BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add dx, BS2_SEL_R2_BASE - BS2_SEL_R1_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add dx, BS2_SEL_R3_BASE - BS2_SEL_R2_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.panic:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync hlt
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ring1:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub dx, BS2_SEL_R1_BASE - BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .ring0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ring2:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub dx, BS2_SEL_R2_BASE - BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .ring0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ring3:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub dx, BS2_SEL_R3_BASE - BS2_SEL_R0_BASE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .ring0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and dl, ~3h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or dl, al ; set the RPL
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.miss:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.null:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor dx, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC bs2SRegToRing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync