bootsector2-cpu-a20-1-template.mac revision cf22150eaeeb72431bf1cf65c309a431454fb22b
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; $Id$
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; @file
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; bootsector2 A20 - multi mode template.
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%include "bootsector2-template-header.mac"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Inner loop dealing with one 64KB segment.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM(TestA20_EnabledInner)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.inner_loop:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ah, [es:xDI]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [ds:xSI]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .inner_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync not al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [es:xDI], al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, [ds:xSI]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [es:xDI], ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .failed
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.inner_next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc xDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc xSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .inner_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync clc
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.failed:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szModifiyError
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(TestFailedF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xSP, sCB * 5
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stc
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szModifiyError:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db TMPL_MODE_STR, '- Same memory; EDI=%RX32 ESI=%RX32 EAX=%RX32 EBX=%RX32', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM(TestA20_EnabledInner)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Inner loop dealing with one 64KB segment.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM(TestA20_DisabledInner)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.inner_loop:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ah, [es:xDI]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov al, [ds:xSI]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .failed1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync not al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [es:xDI], al
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp al, [ds:xSI]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [es:xDI], ah
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .failed2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc xDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync inc xSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dec ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jnz .inner_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync clc
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.failed1:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szNotEqual
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(TestFailedF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xSP, sCB * 6
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stc
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szNotEqual:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db TMPL_MODE_STR, ' - Not equal; EDI=%RX32 ESI=%RX32 EAX=%RX32 EBX=%RX32 ECX=%RX32', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.failed2:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push cs
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push .s_szModifiyError
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(TestFailedF)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add xSP, sCB * 6
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync stc
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szModifiyError:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db TMPL_MODE_STR, ' - Modify error; EDI=%RX32 ESI=%RX32 EAX=%RX32 EBX=%RX32 ECX=%RX32', 13, 10, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM(TestA20_DisabledInner)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Scans memory calling sDX for each segment.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM(TestA20_ScanMemory)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pushf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cli
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; The outer loop walks a segment (64 KB) at a time.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ebx, _1M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.outer_loop:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Set up the registers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_CMN_R86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, 0ffffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edi, 00010h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov es, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, 00000h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov esi, 00000h
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ds, ax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, 01000h ; at 101000 there is a VMMDevTesting MMIO page.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%elifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;; @todo need a selector we can modify.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edi, ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov esi, ebx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and esi, ~_1M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, _64K
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_CMN_R86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Should we skip this segment or only check parts of it?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp esi, edi ; affected by A20?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .outer_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%if BS2_PXX_LAST != 09ffffh
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync %error BS2_PXX_LAST does not have the expected value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, BS2_PXX_BASE + _1M ; don't mess with page tables, stacks, MMIO or ROMs.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .not_low_rom_mmio_region
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, _1M + _1M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jb .outer_next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.not_low_rom_mmio_region:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, BS2_ADDR + _1M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ja .not_bs2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, BS2_ADDR ; don't overwrite our own code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.not_bs2:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, _1M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .not_VMMDevTestingMMIO
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, 1000h ; don't bother with the MMIO
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.not_VMMDevTestingMMIO:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; TMPL_CMN_R86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Invoke the callback.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jc .failure
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_CMN_R86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.outer_next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add ebx, _64K
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, 32*_1M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jbe .outer_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef TMPL_16BIT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop ds
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop es
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync popf
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sSI
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sCX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sBX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.failure:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%if 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, _1M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .contine_at_next_MB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, _2M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .contine_at_next_MB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, _1M + _2M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .contine_at_next_MB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ebx, _4M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je .contine_at_next_MB
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.contine_at_next_MB:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync add ebx, _1M
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .outer_loop
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM(TestA20_ScanMemory)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM(TestA20_Enabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, TMPL_NM(TestA20_EnabledInner)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_ScanMemory)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM(TestA20_Enabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Checks that the first 64KB at 1MB wraps is the same physical memory as at
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; address 0.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM(TestA20_Disabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, TMPL_NM(TestA20_DisabledInner)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_ScanMemory)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM(TestA20_Disabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM(TestA20_FlushAll)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync wbinvd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov sAX, cr3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov cr3, sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync wbinvd
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop sAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM(TestA20_FlushAll)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Do the A20 tests for this mode.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @uses nothing
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODELOW
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC TMPL_NM(TestA20_rm)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ax, .s_szTestName
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TestSub_r86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(Bs2IsModeSupported_rm)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz .skip_not_supported
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Do tests with A20 enabled.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call Bs2EnableA20_r86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(Bs2EnterMode_rm)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS TMPL_BITS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_FlushAll)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_Enabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(Bs2ExitMode)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TestSubErrorCount_r86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ax, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Do tests with A20 disabled.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call Bs2DisableA20_r86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(Bs2EnterMode_rm)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS TMPL_BITS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_FlushAll)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_Disabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(Bs2ExitMode)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TestSubErrorCount_r86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp ax, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne .done
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifndef TMPL_CMN_V86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Change A20 state without leaving and entering the CPU mode.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call Bs2EnableA20_r86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(Bs2EnterMode_rm)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS TMPL_BITS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_Enabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2DisableA20)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_FlushAll)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_Disabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2EnableA20)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_FlushAll)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_Enabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2DisableA20)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_FlushAll)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_Disabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM_CMN(Bs2EnableA20)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_FlushAll)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(TestA20_Enabled)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TMPL_NM(Bs2ExitMode)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS 16
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif ; !TMPL_CMN_V86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call Bs2DisableA20_r86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.done1:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TestSubDone_r86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pop eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.skip_not_supported:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, .s_szSkipNotSupported
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync call TestSkipped_r86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .done1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szTestName:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db TMPL_MODE_STR, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.s_szSkipNotSupported:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync db TMPL_MODE_STR, ' is not supported by the CPU', 10, 13, 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC TMPL_NM(TestA20_rm)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncTMPL_BEGINCODE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBITS TMPL_BITS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%include "bootsector2-template-footer.mac"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync