cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; $Id$
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; @file
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; bootsector2 common routines - template containing code common to related modes.
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%include "bootsector2-template-header.mac"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncALIGNCODE(32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGLOBALNAME TMPL_NM_CMN(g_szMode)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db TMPL_MODE_STR, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Shutdown routine.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Does not return.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses N/A
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Shutdown)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp Bs2Shutdown
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cli
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov bl, 64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, 08900h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ds, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.retry:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov esi, .s_szShutdown
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync rep outsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec bl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .retry
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Shutdown failed!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp Bs2Panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szShutdown:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'Shutdown', 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Shutdown)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prints a 32-bit unsigned integer on the screen.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param eax The value to print.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(PrintU32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cx, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ds, cx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Allocate a stack buffer and terminate it. ds:bx points ot the end.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub xSP, 30h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBX, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xBX, 2fh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [xBX], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, 10 ; what to divide by
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor edx, edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync div ecx ; edx:eax / ecx -> eax and rest in edx.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add dl, '0'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX], dl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Print the string.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xSP, 30h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(PrintU32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Equivalent to RTPrintf, but a max output length of 1KB.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @remarks This uses an entirely STACK BASED CALLING CONVENTION where the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; caller does the cleanup (cdecl sans volatile regs).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param fpszFormat The format string (far pointer on 16-bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; systems). See StrFormatV for format details.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ... Zero or more format string arguments.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(PrintF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub xSP, 0400h ; string buffer (1024 bytes)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Format the failure string and call TestFailed.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, ss ; buffer address.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ds, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, sp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, 0400h ; buffer size.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync les cx, [bp + 4] ; format string
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov bx, ss ; argument list
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov fs, bx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov bx, bp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add bx, 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, xSP ; buffer address
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, 0400h ; buffer size
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xCX, [xBP + xCB * 2] ; format string
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea xBX, [xBP + xCB * 3] ; argument list.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(StrFormatV)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xSP, 0400h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(PrintF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Print a string followed by a semicolon and at least one space.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:ax The string to print.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param dx The desired minimum length of the output. That is
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; string + colon + spaces.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(PrintStrColonSpaces)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(StrLen)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cx, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, ':'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc cx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, ' '
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.next_space:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc cx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp cx, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .next_space
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(PrintStrColonSpaces)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Print a string followed by a 0+ spaces, a semicolon and a space.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:ax The string to print.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param dx The desired minimum length of the output. That is
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; string + spaces + colon + space.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(PrintStrSpacesColonSpace)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(StrLen)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cx, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc cx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, ' '
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.next_space:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc cx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp cx, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jae .done_spaces
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .next_space
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done_spaces:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, ':'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, ' '
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(PrintStrSpacesColonSpace)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Store the current nanosecond timestamp in [ax] (qword).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:ax Where to store the 64-bit timestamp.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(GetNanoTS)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx ecx, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xCX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_TS_LOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in eax, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [sCX], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_TS_HIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in eax, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [sCX + 4], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(GetNanoTS)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Calculates the time elapsed since [ax] (qword), storing it at [ax] (qword).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:ax Where to get the start timestamp (input) and where
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; to store the time elapsed (output). qword
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(GetElapsedNanoTS)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx ecx, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xCX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_TS_LOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in eax, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub eax, [sCX]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [sCX], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_TS_HIGH
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in eax, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sbb eax, [sCX + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [sCX + 4], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(GetElapsedNanoTS)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Sends a command to VMMDev followed by a single string.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; If the VMMDev is not present or is not being used, this function will
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; do nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param eax The command.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:dx The string (zero terminated).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @internal
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(testSendStrCmd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fbBs2VMMDevTesting], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .no_vmmdev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_CMD
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_DATA
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.next_char:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [xBX]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .next_char
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.no_vmmdev:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(testSendStrCmd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Equivalent to RTTestCreate + RTTestBanner
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param DS16:xAX Pointer to a zero terminated string naming the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; test. Must be a global constant.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestInit)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Initialize the globals.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_npszBs2Test], xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_uscBs2TestErrors], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_npszBs2SubTest], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_uscBs2SubTestAtErrors], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fbBs2SubTestReported], 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_uscBs2SubTests], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_uscBs2SubTestsFailed], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Print the name. RTTestBanner
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [g_npszBs2Test]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szTesting
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Report it to the VMMDev.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, VMMDEV_TESTING_CMD_INIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, [g_npszBs2Test]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(testSendStrCmd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szTesting:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db ': TESTING...', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestInit)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; rtTestSubTestReport
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @internal
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(testSubTestReport)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Check if there is anything to do.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fbBs2SubTestReported], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor xAX, xAX ; load the sub test name pointer for later
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [g_npszBs2SubTest]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test xAX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Start the printing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, 48
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStrSpacesColonSpace)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fbBs2SubTestReported], 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cx, [g_uscBs2TestErrors]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub cx, [g_uscBs2SubTestAtErrors]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and ecx, 0ffffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .failed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; passed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szPassed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .vmmdev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; failed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.failed:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szFailure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintU32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szFailureEnd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; report to VMMDev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.vmmdev:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fbBs2VMMDevTesting], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .no_vmmdev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_CMD
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, VMMDEV_TESTING_CMD_SUB_DONE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_DATA
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.no_vmmdev:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szPassed:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'PASSED', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szFailure:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'FAILED (', 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szFailureEnd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db ' errors)', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(testSubTestReport)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; rtTestSubCleanup
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @internal
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(testSubCleanup)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [g_npszBs2SubTest], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .cleaned_up
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(testSubTestReport)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [g_npszBs2SubTest], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fbBs2SubTestReported], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.cleaned_up:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(testSubCleanup)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Equivalent to RTTestSub.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:xAX Pointer to a zero terminated string naming the sub test.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestSub)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Complete and cleanup any current sub test.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(testSubCleanup)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Start a new sub test.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc word [g_uscBs2SubTests]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [g_uscBs2TestErrors]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_uscBs2SubTestAtErrors], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_npszBs2SubTest], xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [g_fbBs2SubTestReported], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Report it to the VMMDev.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, VMMDEV_TESTING_CMD_SUB_NEW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(testSendStrCmd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestSub)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Calculates the error count for the current sub test.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns ax Error count for the current sub test.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestSubErrorCount)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, [g_uscBs2TestErrors]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub ax, [g_uscBs2SubTestAtErrors]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestSubErrorCount)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Equivalent to RTTestValue.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:ax The value name.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param edx The 32-bit value to report.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param cl The unit (VMMDEV_TESTING_UNIT_XXX).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestValueU32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cld
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xSI, xAX ; xSI = name
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Print it.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, 48
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStrSpacesColonSpace)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [xBP - sCB]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintU32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, ' '
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx sAX, cl ; ASSUMES correct input.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, eax ; edx = unit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync shl xAX, 4 ; * 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xAX, g_aszBs2TestUnitNames
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 13
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Report it to the host.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fbBs2VMMDevTesting], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .no_vmmdev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, edx ; ecx = unit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_CMD
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, VMMDEV_TESTING_CMD_VALUE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_DATA
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [xBP - sCB]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax ; value - low dword
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax ; value - high dword
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax ; unit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.next_char:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lodsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .next_char
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.no_vmmdev:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestValueU32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; RTTestValue + DBGFR3RegNmQueryU64.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:ax The value name and register name separated by a colon.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestValueReg)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cld
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xSI, xAX ; xSI = name
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Report it to the host.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fbBs2VMMDevTesting], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .no_vmmdev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_CMD
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, VMMDEV_TESTING_CMD_VALUE_REG
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_DATA
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.next_char:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lodsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .next_char
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.no_vmmdev:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestValueReg)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Equivalent to RTTestFailed("%s", ds:xAX).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:xAX Failure explanation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestFailed)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Increment the error count.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc word [g_uscBs2TestErrors]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Print failure message.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Report it to the VMMDev.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, VMMDEV_TESTING_CMD_FAILED
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(testSendStrCmd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestFailed)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Equivalent to RTTestFailed.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @remarks This uses an entirely STACK BASED CALLING CONVENTION where the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; caller does the cleanup (cdecl sans volatile regs).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param fpszFormat The format string (far pointer on 16-bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; systems). See StrFormatV for format details.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ... Zero or more format string arguments.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestFailedF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub xSP, 0400h ; string buffer (1024 bytes)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Format the failure string and call TestFailed.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, ss ; buffer address.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ds, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, sp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, 0400h ; buffer size.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync les cx, [bp + 4] ; format string
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov bx, ss ; argument list
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov fs, bx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov bx, bp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add bx, 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, xSP ; buffer address
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, 0400h ; buffer size
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xCX, [xBP + xCB * 2] ; format string
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea xBX, [xBP + xCB * 3] ; argument list.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(StrFormatV)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(TestFailed)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xSP, 0400h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestFailedF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Equivalent to RTTestSkipped("%s", ds:xAX).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:xAX Explanation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestSkipped)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Print reason.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Report it to the VMMDev.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, VMMDEV_TESTING_CMD_SKIPPED
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(testSendStrCmd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestSkipped)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Equivalent to RTTestSubDone.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestSubDone)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp TMPL_NM_CMN(testSubCleanup)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestSubDone)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Equivalent to RTTestSummaryAndDestroy, does not return.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestTerm)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Complete and cleanup any current sub test.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(testSubCleanup)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Print test summary.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [g_npszBs2Test]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cx, [g_uscBs2TestErrors]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and ecx, 0ffffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .failure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; success
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szSuccess
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .vmmdev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; failure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.failure:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szFailure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintU32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szFailureEnd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; report to VMMDev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.vmmdev:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_fbBs2VMMDevTesting], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .no_vmmdev
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_CMD
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, VMMDEV_TESTING_CMD_TERM
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_DATA
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out dx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.no_vmmdev:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Shut down the VM by default.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Shutdown)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szSuccess:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db ': SUCCESS', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szFailure:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db ': FAILURE - ', 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szFailureEnd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db ' errors', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestTerm)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Report a result (elapsed time).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:ax Pointer to the elapsed time.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param edx The number of tests executed.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:cx The test description.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @users nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(ReportResult)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%if 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [sAX]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [sAX + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .szDbg
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xSP, 4 * sCB + xCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .end_debug
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.szDbg:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'ReportResult(%RX32.%RX32, %RX32, %s)', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.end_debug:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(CalcTestPerSecond)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cl, VMMDEV_TESTING_UNIT_INSTRS_PER_SEC
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(TestValueU32)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(ReportResult)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef BS2_WITH_TRAPS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Checks a trap, complains if not the expected one.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param al The expected trap number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param sDX The expected trap error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param sCX The expected fault eip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param sBX The expected fault address.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns al=1 and ZF=0 on success.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns al=0 and ZF=1 on failure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestCheckTrap)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define a_u8ExpectedTrapNo byte [xBP - xCB]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define a_uExpectedErr sPRE [xBP - xCB - sCB*1]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define a_uExpectedFaultPC sPRE [xBP - xCB - sCB*2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define a_uExpectedFaultAddr sPRE [xBP - xCB - sCB*3]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Any traps at all?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [g_u32cTraps], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .trapped
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szNoTrap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .failed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.trapped:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Exactly one trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [g_u32cTraps], 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .one_trap
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szToManyTraps
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .failed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.one_trap:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; The right trap.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [g_u8LastTrapNo], al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .right_trap_no
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szWrongTrapNo
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .failed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.right_trap_no:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; The right error code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [g_u64LastTrapErr], sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .bad_err_cd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [g_u64LastTrapErr + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .right_err_cd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.bad_err_cd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szWrongErrCd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .failed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.right_err_cd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; The fault PC.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [g_LastTrapRegs + BS2REGS.rip], sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .bad_pc
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [g_LastTrapRegs + BS2REGS.rip + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .right_pc
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.bad_pc:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szWrongPc
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .failed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.right_pc:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; The fault address (PF only).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 0eh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .right_fault_address
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [g_LastTrapRegs + BS2REGS.cr2], sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .bad_fault_address
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [g_LastTrapRegs + BS2REGS.cr2 + 4], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .right_fault_address
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.bad_fault_address:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szWrongFaultAddress
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .failed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.right_fault_address:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Reportfailure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.failed:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, xSP ; save xSP - lazy bird.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp a_u8ExpectedTrapNo, 0eh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .not_pf2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push a_uExpectedFaultAddr
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.not_pf1:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push a_uExpectedErr
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push a_uExpectedFaultPC
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx xBX, a_u8ExpectedTrapNo
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; line break
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp a_u8ExpectedTrapNo, 0eh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .not_pf2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.cr2 + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sPRE [g_LastTrapRegs + BS2REGS.cr2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.not_pf2:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_u64LastTrapErr + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sPRE [g_u64LastTrapErr]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [g_LastTrapRegs + BS2REGS.rip + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sPRE [g_LastTrapRegs + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx xBX, byte [g_u8LastTrapNo]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX ; msg
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szFailureMsg
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp a_u8ExpectedTrapNo, 0eh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .not_pf3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szFailurePfMsg
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.not_pf3:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX ; format string
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(TestFailedF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xSP, xDX ; clean up call frame
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szFailureMsg:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db '%s', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db ' got trap %RX8 pc=%RX64 err=%RX64', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db ' expected %RX8 pc=%RX64 err=%RX64', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szFailurePfMsg:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db '%s', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db ' got trap %RX8 pc=%RX64 err=%RX64 cr2=%RX64', 13, 10,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db ' expected %RX8 pc=%RX64 err=%RX64 cr2=%RX64', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szNoTrap:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'no traps', 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szToManyTraps:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'too many traps', 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szWrongTrapNo:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'wrong trap number', 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szWrongErrCd:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'wrong error code', 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szWrongPc:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'wrong xIP', 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szWrongFaultAddress:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'wrong fault address', 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%undef a_u8ExpectedTrapNo
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%undef a_u32ExpectedErr
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%undef a_u32ExpectedFaultPC
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%undef a_u32ExpectedFaultAddr
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestCheckTrap)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; BS2_WITH_TRAPS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef BS2_WITH_TRAPS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Installs the active list of trap records (BS2TRAPREC).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param sAX Flat address of the trap records (BS2TRAPREC).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Assumes that DS is FLAT.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param edx The number of trap records.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param sCX Flat image base address, i.e. what BS2TRAPREC.offWhere
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; is relative to.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns al=1 and ZF=0 on success.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns al=0 and ZF=1 on failure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses sAX (return value)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestInstallTrapRecs)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Make sure the record array is within limits.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp edx, _4M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jae .nok
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Scan the trap records.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sDI, sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov esi, edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or esi, esi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .ok
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [sDI + BS2TRAPREC.offWhere], _2G
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jae .nok
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [sDI + BS2TRAPREC.offResumeAddend], 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .nok
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [sDI + BS2TRAPREC.offResumeAddend], 0xff
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .nok
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp dword [sDI + BS2TRAPREC.u8TrapNo], X86_XCPT_MAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ja .nok
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; next.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add sDI, BS2TRAPREC_size
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec esi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Set the global variables.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ok:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor esi, esi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_paTrapRecs + 4], esi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_paTrapRecs], sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_cTrapRecs], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_iTrapRecLast], esi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_pTrapRecBase + 4], esi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [g_pTrapRecBase], sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.nok:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestInstallTrapRecs)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; BS2_WITH_TRAPS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Calculate the number of tests executed per second.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:ax Pointer to the elapsed time.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param edx The number of tests executed.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns The tests per second in eax.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses eax (return value)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(CalcTestPerSecond)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Calc NS per test.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ecx, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .div_zero
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [sAX + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp edx, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jae .div_overflow
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [sAX]
2b41f73e305b2cd1a4dadff538705a7a8fb63f02vboxsync shld edx, eax, 10
2b41f73e305b2cd1a4dadff538705a7a8fb63f02vboxsync shl eax,10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync div ecx ; eax = NS per test
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Calc tests per second.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ecx, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .div_zero
2b41f73e305b2cd1a4dadff538705a7a8fb63f02vboxsync mov edx, 0xee
2b41f73e305b2cd1a4dadff538705a7a8fb63f02vboxsync mov eax, 0x6b280000 ; 1024G
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync div ecx ; eax = tests per second
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.div_zero:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.div_overflow:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, 4242424242
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(CalcTestPerSecond)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Calculate the number of iterations for a benchmark based on the time a short
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; calibration run too.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:xAX Pointer to the elapsed time.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param edx The number of tests iterations executed.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ecx The desired test length, in seconds.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns The tests iterations in eax.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses eax (return value)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(CalcBenchmarkIterations)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Calc NS per test.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ecx, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .div_zero
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [sAX + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp edx, ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jae .div_overflow
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [sAX]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync div ecx ; eax = NS per test
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Calc tests per second.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ecx, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .div_zero
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor edx, edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, 1000000000 ; 1G
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync div ecx ; eax = tests per second
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Multiply this up to the desired number of seconds.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBP - xCB*2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mul edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test edx, edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .mult_32bit_overflow
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, _64K
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jle .too_small
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.too_small:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, _64K
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.mult_32bit_overflow:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, 0ffff0000h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.div_zero:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [xBP - xCB]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync shl eax, 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .fudge
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.div_overflow:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [xBP - xCB]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync shr eax, 4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.fudge:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add eax, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(CalcBenchmarkIterations)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Prints a string on the screen.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:ax The string to find the length of.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns The string length in ax.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses ax (return value)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(StrLen)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [xBX], byte 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xchg xAX, xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub xAX, xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(StrLen)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Simple string format, taking an argument list.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Implemented:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RX8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RX16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RX32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RX64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %s
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Planned:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RU8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RU16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RU32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RU64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RI8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RI16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RI32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; - %RI64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:xAX The buffer address.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param xDX The buffer size.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param es:xCX The format string.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param fs:xBX The argument list.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(StrFormatV)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cld
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov si, ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov di, es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ds, di
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov es, si
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov di, ax ; es:di -> output buffer.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov si, cx ; ds:si -> format string.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define a_pArgs [fs:bx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define a_pu32ArgsHighDW dword [fs:bx + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDI, xAX ; (es:)xDI -> output buffer.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xSI, xCX ; (ds:)xSI -> format string.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define a_pArgs [xBX]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%define a_pu32ArgsHighDW dword [xBX + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xchg xCX, xDX ; xCX=buffer size.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Make sure we've got space for a terminator char in the output buffer.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test xCX, xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; In this loop we're free to use sDX and (with some caution) sAX.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.format_loop:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lodsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, '%'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Emit the character in al if there is room for it.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.emit_al:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test xCX, xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stosb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .format_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Try recognize the format specifier.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lodsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 's'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch_case_string
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 'c'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch_case_char
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 'R'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_default
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lodsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 'X'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_case_number
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 'U'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_case_number
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 'I'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_case_number
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_default:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, '!'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .emit_al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; parse the number part.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ah, al ; ah = {X,U,I}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lodsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, '8'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch_case_number_8bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, '1'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch_case_number_16bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, '3'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch_case_number_32bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, '6'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch_case_number_64bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .switch_default
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Common code for 8-bit, 16-bit and 32-bit.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; The first part load the value into edx, ah={X,U,I},
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; al=(max-hex, max-unsigned-dec).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_8bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, (2 << 4) | 2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx edx, byte a_pArgs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xBX, xCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ah, 'I'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_case_number_common_32bit_hex_or_unsigned
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movsx edx, dl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .switch_case_number_common_32bit_signed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_16bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lodsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, '6'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_default
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, (4 << 4) | 5
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx edx, word a_pArgs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xBX, xCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ah, 'I'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_case_number_common_32bit_hex_or_unsigned
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movsx edx, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .switch_case_number_common_32bit_signed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_32bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lodsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, '2'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_default
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, (8 << 4) | 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, dword a_pArgs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xBX, sCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ah, 'I'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch_case_number_common_32bit_signed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_common_32bit_hex_or_unsigned:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ah, 'X'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_case_number_common_32bit_unsigned
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync shr al, 4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and xAX, 0fh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp xCX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .switch_case_number_bad_buf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call .format_32bit_hex_subroutine
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .format_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_common_32bit_unsigned:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and xAX, 0fh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp xCX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .switch_case_number_bad_buf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call .format_32bit_dec_subroutine
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .format_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_common_32bit_signed:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp edx, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jge .switch_case_number_common_32bit_unsigned
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and xAX, 0fh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc xAX ; sign char
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp xCX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .switch_case_number_bad_buf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Emit the minus sign, invert the value and join the unsigned formatting.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, '-'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stosb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync neg edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call .format_32bit_dec_subroutine
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .format_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; 64-bit is special, to simplify we treat all formats as hex...
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_64bit:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lodsb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, '4'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .switch_default
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ah, 'X'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch_case_number_64bit_hex
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ah, 'I'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .switch_case_number_64bit_signed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .switch_case_number_64bit_unsigned
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_64bit_hex:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, dword a_pArgs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, a_pu32ArgsHighDW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xBX, 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp xCX, 8+1+8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .switch_case_number_bad_buf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Simple, format it as two 32-bit hex values.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call .format_32bit_hex_subroutine
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 27h ; '\'' - how do we escape this with yasm?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stosb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call .format_32bit_hex_subroutine
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .format_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_64bit_unsigned:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp xCX, 19
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .switch_case_number_bad_buf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_64bit_unsigned_format_it:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;; @todo implement me
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .switch_case_number_64bit_hex
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_64bit_signed:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, dword a_pArgs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, a_pu32ArgsHighDW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xBX, 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp xCX, 20
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .switch_case_number_bad_buf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test edx, 080000000h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .switch_case_number_64bit_unsigned_format_it
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Emit the minus sign, invert the value and join the unsigned formatting.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, '-'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stosb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync neg eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync neg edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .switch_case_number_64bit_unsigned_format_it
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; The remaining buffer is too small to hold the number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_number_bad_buf:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, '^'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .emit_al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Emit a string.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_string:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lgs dx, a_pArgs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xBX, 4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, a_pArgs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xBX, xCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test xCX, xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_string_loop:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [gs:edx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [xDX]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .format_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stosb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .switch_case_string_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Emit a char.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.switch_case_char:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, byte a_pArgs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xBX, xCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .emit_al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Done, just emit the terminator char.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stosb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%undef a_pArgs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%undef a_pu32ArgsHighDW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Internal subroutine for formatting a hex number into the buffer.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param al The precision (2, 4, 8).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param edx The value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses ecx, edi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.format_32bit_hex_subroutine:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Rotate edx into position.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ebx, 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub bl, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync shl bl, 2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xchg cl, bl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync rol edx, cl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xchg bl, cl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov bl, al ; Width counter
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.format_32bit_hex_subroutine_next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync rol edx, 4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and eax, 0fh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add sAX, g_achHex
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [cs:sAX]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stosb
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec bl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .format_32bit_hex_subroutine_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Internal subroutine for formatting a hex number into the buffer.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param al The max precision (2, 5, 10).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param edx The value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param xCX Counter register to decrement as characters are emited.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param es:xDI Where to write the output, xDI is updated.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses xCX, xDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.format_32bit_dec_subroutine:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%if 0 ;; @todo implement this
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub xSP, 20h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Format in reverse order into a stack buffer.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Append the stack buffer to the string, reversing it in the process.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xSP, 20h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call .format_32bit_hex_subroutine
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(StrFormatV)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Very limited RTStrPrintf version.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @remarks This uses an entirely STACK BASED CALLING CONVENTION where the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; caller does the cleanup (cdecl sans volatile regs).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param fpszBuf The output buffer.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param cbBuf The output buffer size (natural size).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param fpszFormat The format string (far pointer in 16-bit).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; See StrFormatV for format.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ... Zero or more format string arguments.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(StrFormatF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lds xAX, [bp + 04h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [bp + 08h]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync les xCX, [bp + 0ah]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov bx, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov fs, bx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov bx, bp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add bx, 0eh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [xBP + xCB * 2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, [xBP + xCB * 3]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xCX, [xBP + xCB * 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea xBX, [xBP + xCB * 5]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(StrFormatV)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(StrFormatF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Dumps the CPU registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestDumpCurrentRegisters)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushfd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [xBP - sCB - 4] ; eflags
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ebp ; return EBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [xBP]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ebp ; return ESP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xAX, xCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [xBP + xCB] ; return EIP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push edi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push esi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push dword [xBP - sCB] ; eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szRegFmt
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popfd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szRegFmt:
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 cr2=%RX32 eflags=%RX32', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else ; 64-bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szRegFmt
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szRegFmt:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'TestDumpCurrentRegisters not implemented', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; 64-bit
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestDumpCurrentRegisters)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Dumps the CPU registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:xAX Pointer to the register frame to dump.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestDumpRegisters)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBX, xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp byte [xBX + BS2REGS.cBits], 64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .dump_64bit_regs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push -1 ; sanity
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rflags]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.cr2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor edx, edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [xBX + BS2REGS.ss]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [xBX + BS2REGS.gs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [xBX + BS2REGS.fs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [xBX + BS2REGS.es]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [xBX + BS2REGS.ds]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, [xBX + BS2REGS.cs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.cr4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.cr3]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.cr0]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rbp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rsp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rip]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rdi]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rsi]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rdx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rcx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rbx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [xBX + BS2REGS.rax]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szReg32Fmt
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.dump_64bit_regs:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szReg64Fmt
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea xSP, [xBP - sCB*2 - xCB]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szReg32Fmt:
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 cr2=%RX32 eflags=%RX32', 13, 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szReg64Fmt:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'TestDumpCurrentRegisters not implemented', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestDumpRegisters)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Saves the CPU registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:xAX Pointer to the register frame to dump.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestSaveRegisters)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushfd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf ; - 1*sCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX ; - 2*sCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX ; - 3*sCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX ; - 4*sCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor edx, edx ; zero register.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBX, xAX ; xBX for addressing, xAX for scratch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [xSP + sCB*1]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rax], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [xSP + sCB*2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rbx], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rcx], rcx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [xSP]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rdx], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rdi], rdi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rsi], rsi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [xBP]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rbp], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea rax, [xBP + 16]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rsp], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [xBP + 8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rip], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.r8], r8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.r9], r9
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.r10], r10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.r11], r11
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.r12], r12
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.r13], r13
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.r14], r14
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.r15], r15
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, [xBP - sCB]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.rflags], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.cs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.ds], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.es], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.fs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.gs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.ss], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [xBX + BS2REGS.cBits], 64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.pad ], dl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.pad + 1], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.cr0], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.cr2], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.cr3], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.cr4], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rax, cr8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.cr8], rax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else ; !TMPL_64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [xBP - sCB*3]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rax], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rax + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [xBP - sCB*2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rbx], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rbx + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rcx], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rcx + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [xBP - sCB*4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rdx], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rdx + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rdi], edi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rdi + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rsi], esi
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rsi + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, ebp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, [xBP]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rbp], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rbp + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, esp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, bp
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub ax, 4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync lea eax, [ebp + 8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rsp], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rsp + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movzx eax, word [xBP + 2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [xBP + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rip], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rip + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r8 ], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r8 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r9 ], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r9 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r10 ], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r10 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r11 ], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r11 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r12 ], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r12 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r13 ], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r13 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r14 ], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r14 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r15 ], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.r15 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, [xBP - sCB]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rflags], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.rflags + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.cs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.ds], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.es], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, fs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.fs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.gs], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.ss], ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [xBX + BS2REGS.cBits], 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov byte [xBX + BS2REGS.cBits], 32
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.pad ], dl
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBX + BS2REGS.pad + 1], dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr0], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr0 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr2], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr2 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr3], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr3 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, cr4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr4], eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr4 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr8], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dword [xBX + BS2REGS.cr8 + 4], edx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; !TMPL_64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popfd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestSaveRegisters)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Restores the CPU registers, except for rsp, rip, cs, ss and ds.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ds:xAX Pointer to the register frame to dump.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses All, but RSP, RIP, CS, SS and DS.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(TestRestoreRegisters)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushfd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf ; - 1*sCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX ; - 2*sCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX ; - 3*sCB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBX, xAX ; xBX for addressing, xAX for scratch.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, [xBX + BS2REGS.rax]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBP - 3*sCB], sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, [xBX + BS2REGS.rbx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBP - 2*sCB], sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sCX, [xBX + BS2REGS.rcx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sDX, [xBX + BS2REGS.rdx]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sDI, [xBX + BS2REGS.rdi]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sSI, [xBX + BS2REGS.rsi]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; skip rsp, rbp or rip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_64BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov r8, [xBX + BS2REGS.r8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov r9, [xBX + BS2REGS.r9]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov r10, [xBX + BS2REGS.r10]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov r11, [xBX + BS2REGS.r11]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov r12, [xBX + BS2REGS.r12]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov r13, [xBX + BS2REGS.r13]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov r14, [xBX + BS2REGS.r14]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov r15, [xBX + BS2REGS.r15]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, [xBX + BS2REGS.rflags]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [xBP - sCB], sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; skip cs & ds.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, [xBX + BS2REGS.es]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov es, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, [xBX + BS2REGS.fs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov fs, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, [xBX + BS2REGS.gs]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov gs, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; skip ss
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, [xBX + BS2REGS.cr0]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cr0, sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, [xBX + BS2REGS.cr2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cr2, sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, [xBX + BS2REGS.cr3]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cr3, sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, [xBX + BS2REGS.cr4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cr4, sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popfd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(TestRestoreRegisters)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Enables the A20 gate.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2EnableA20)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2EnableA20ViaPortA)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; call TMPL_NM_CMN(Bs2EnableA20ViaKbd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2EnableA20)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Disables the A20 gate.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2DisableA20)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Must call both because they may be ORed together on real HW.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2DisableA20ViaKbd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2DisableA20ViaPortA)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2DisableA20)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Waits for the keyboard controller to become ready.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2KbdWait)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.check_status:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in al, 64h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, 1 ; KBD_STAT_OBF
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .read_data_and_status
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, 2 ; KBD_STAT_IBF
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .check_status
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.read_data_and_status:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in al, 60h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .check_status
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2KbdWait)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Sends a read command to the keyboard controller and gets the result.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; The caller is responsible for making sure the keyboard controller is ready
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; for a command (call Bs2KbdWait if unsure).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param al The read command.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns The value read is returned.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses al (obviously)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2KbdRead)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out 64h, al ; Write the command.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.check_status:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in al, 64h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, 1 ; KBD_STAT_OBF
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .check_status
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in al, 60h ; Read the data.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2KbdRead)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Sends a write command to the keyboard controller and then sends the data.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; The caller is responsible for making sure the keyboard controller is ready
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; for a command (call Bs2KbdWait if unsure).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param al The write command.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param ah The data to write.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @todo Return status?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2KbdWrite)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out 64h, al ; Write the command.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdWait)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xchg al, ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out 60h, al ; Write the data.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdWait)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xchg al, ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2KbdWrite)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Enables the A20 gate via the keyboard controller.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2EnableA20ViaKbd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cli
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdWait)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 0d0h ; KBD_CCMD_READ_OUTPORT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdRead)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ah, 002h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or ah, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 0d1h ; KBD_CCMD_WRITE_OUTPORT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdWrite)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 0ffh ; KBD_CMD_RESET
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out 64h, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdWait)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2EnableA20ViaKbd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Disables the A20 gate via the keyboard controller.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2DisableA20ViaKbd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cli
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdWait)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 0d0h ; KBD_CCMD_READ_OUTPORT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdRead)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ah, 0fdh ; ~2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and ah, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 0d1h ; KBD_CCMD_WRITE_OUTPORT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdWrite)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 0ffh ; KBD_CMD_RESET
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out 64h, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2KbdWait)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2DisableA20ViaKbd)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Enables the A20 gate via control port A (PS/2 style).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2EnableA20ViaPortA)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Use Control port A, assuming a PS/2 style system.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in al, 092h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, 02h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .done ; avoid trouble writing back the same value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or al, 2 ; enable the A20 gate.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out 092h, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2EnableA20ViaPortA)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Disables the A20 gate via control port A (PS/2 style).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2DisableA20ViaPortA)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Use Control port A, assuming a PS/2 style system.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in al, 092h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test al, 02h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .done ; avoid trouble writing back the same value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and al, 0fdh ; disable the A20 gate.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync out 092h, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2DisableA20ViaPortA)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Checks if the no-execution bit is supported.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns AL=1 and ZF=0 if supported.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns AL=0 and ZF=1 if not.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2IsNXSupported)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, 080000000h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cpuid
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, 080000001h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .not_supported
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, 080001000h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jae .not_supported
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, 080000001h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cpuid
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test edx, X86_CPUID_EXT_FEATURE_EDX_NX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .not_supported
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; supported
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.not_supported:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2IsNXSupported)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Sets EFER.NXE=al if NXE is supported.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param al 0 if NXE should be disabled, non-zero if it should
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; be enabled.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2SetupNX)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2IsNXSupported)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, MSR_K6_EFER
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync rdmsr
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test byte [xBP - sCB], 0ffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .disable_it
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or eax, MSR_K6_EFER_NXE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .set_it
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.disable_it:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and eax, ~MSR_K6_EFER_NXE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.set_it:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync wrmsr
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2SetupNX)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Disables NX if supported.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2DisableNX)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor al, al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2SetupNX)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2DisableNX)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Enables NX if supported.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2EnableNX)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2SetupNX)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2EnableNX)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Panics if the testing feature of the VMMDev is missing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; A message will be printed.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses Nothing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2PanicIfVMMDevTestingIsMissing)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov dx, VMMDEV_TESTING_IOPORT_NOP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync in eax, dx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp eax, VMMDEV_TESTING_NOP_RET
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .ok
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, .s_szMissingVMMDevTesting
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call Bs2Panic
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ok:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szMissingVMMDevTesting:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db 'fatal error: The testing feature of the VMMDevVMMDev is not present!', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2PanicIfVMMDevTestingIsMissing)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef BS2_WITH_TRAPS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Switches to ring-0 from whatever the current mode is.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses cs, ss, ds, es, fs, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2ToRing0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, BS2_SYSCALL_TO_RING0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync int BS2_TRAP_SYSCALL
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2ToRing0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Switches to ring-1 from whatever the current mode is.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses cs, ss, ds, es, fs, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2ToRing1)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, BS2_SYSCALL_TO_RING1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync int BS2_TRAP_SYSCALL
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2ToRing1)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Switches to ring-0 from whatever the current mode is.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses cs, ss, ds, es, fs, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2ToRing2)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, BS2_SYSCALL_TO_RING2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync int BS2_TRAP_SYSCALL
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2ToRing2)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Switches to ring-3 from whatever the current mode is.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses cs, ss, ds, es, fs, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2ToRing3)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, BS2_SYSCALL_TO_RING3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync int BS2_TRAP_SYSCALL
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2ToRing3)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Switches the given ring from whatever the current mode is.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param AL The desired ring.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses cs, ss, ds, es, fs, gs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(Bs2ToRingN)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .ring3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .ring2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .ring1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ring0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2ToRing0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ring1:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2ToRing1)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ring2:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2ToRing2)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.ring3:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2ToRing3)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(Bs2ToRingN)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; BS2_WITH_TRAPS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Wrapper for dynamically calling the right specific method.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This avoid putting large portions of the code in the 2nd template.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncTMPL_NM_CMN(g_pfnPrintStrInternal): TMPL_PTR_DEF 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncTMPL_NM_CMN(g_pfnPrintChrInternal): TMPL_PTR_DEF 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp [TMPL_NM_CMN(g_pfnPrintStrInternal)]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(PrintStr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp [TMPL_NM_CMN(g_pfnPrintChrInternal)]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM_CMN(PrintChr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%include "bootsector2-template-footer.mac"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync