diff options
Diffstat (limited to 'src/VBox/ValidationKit/bootsectors/bootsector2-template-header.mac')
-rw-r--r-- | src/VBox/ValidationKit/bootsectors/bootsector2-template-header.mac | 793 |
1 files changed, 793 insertions, 0 deletions
diff --git a/src/VBox/ValidationKit/bootsectors/bootsector2-template-header.mac b/src/VBox/ValidationKit/bootsectors/bootsector2-template-header.mac new file mode 100644 index 00000000..3ddab0f7 --- /dev/null +++ b/src/VBox/ValidationKit/bootsectors/bootsector2-template-header.mac @@ -0,0 +1,793 @@ +; $Id: bootsector2-template-header.mac $ +;; @file +; bootsector2 header for multi-mode code templates. +; + +; +; Copyright (C) 2007-2019 Oracle Corporation +; +; This file is part of VirtualBox Open Source Edition (OSE), as +; available from http://www.virtualbox.org. This file is free software; +; you can redistribute it and/or modify it under the terms of the GNU +; General Public License (GPL) as published by the Free Software +; Foundation, in version 2 as it comes in the "COPYING" file of the +; VirtualBox OSE distribution. VirtualBox OSE is distributed in the +; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. +; +; The contents of this file may alternatively be used under the terms +; of the Common Development and Distribution License Version 1.0 +; (CDDL) only, as it comes in the "COPYING.CDDL" file of the +; VirtualBox OSE distribution, in which case the provisions of the +; CDDL are applicable instead of those of the GPL. +; +; You may elect to license modified versions of this file under the +; terms and conditions of either the GPL or the CDDL or both. +; + +; +; Check and expand the mode defines. +; One of the following must be defined: +; - TMPL_RM - real mode. +; - TMPL_PE16 - 16-bit protected mode, unpaged. +; - TMPL_PE32 - 32-bit protected mode, unpaged. +; - TMPL_PEV86 - virtual 8086 mode under protected mode, unpaged. +; - TMPL_PP16 - 16-bit protected mode, paged. +; - TMPL_PP32 - 32-bit protected mode, paged. +; - TMPL_PPV86 - virtual 8086 mode under protected mode, paged. +; - TMPL_PAE16 - 16-bit protected mode with PAE (paged). +; - TMPL_PAE32 - 16-bit protected mode with PAE (paged). +; - TMPL_PAEV86- virtual 8086 mode under protected mode with PAE (paged). +; - TMPL_LM16 - 16-bit long mode (paged). +; - TMPL_LM32 - 32-bit long mode (paged). +; - TMPL_LM64 - 64-bit long mode (paged). +; +; Derived indicators: +; - TMPL_CMN_PE = TMPL_PE16 | TMPL_PE32 | TMPL_PEV86 +; - TMPL_CMN_PP = TMPL_PP16 | TMPL_PP32 | TMPL_PPV86 +; - TMPL_CMN_PAE = TMPL_PAE16 | TMPL_PAE32 | TMPL_PAEV86 +; - TMPL_CMN_LM = TMPL_LM16 | TMPL_LM32 | TMPL_LM64 +; - TMPL_CMN_V86 = TMPL_PEV86 | TMPL_PPV86 | TMPL_PAEV86 +; - TMPL_CMN_R86 = TMPL_CMN_V86 | TMPL_RM +; +%ifdef TMPL_RM + %ifdef TMPL_PE16 + %error "Both 'TMPL_RM' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_RM' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_RM' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_RM' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_RM' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_RM' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_RM' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_RM' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_RM' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_RM' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_RM' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_RM' and 'TMPL_LM64' are defined." + %endif + %define TMPL_16BIT + %define TMPL_BITS 16 + %define TMPL_PTR_DEF dw + %define TMPL_NM(Name) Name %+ _rm + %define TMPL_NM_CMN(Name) Name %+ _r86 + %define TMPL_MODE_STR 'real mode' + %define TMPL_HAVE_BIOS + %define TMPL_CMN_R86 +%endif + +%ifdef TMPL_PE16 + %ifdef TMPL_RM + %error "Both 'TMPL_PE16' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_PE16' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_RM' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_PE16' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_PE16' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_PE16' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_PE16' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_PE16' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_PE32' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_PE16' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_PE16' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_PE16' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_PE + %define TMPL_CMN_P16 + %define TMPL_16BIT + %define TMPL_BITS 16 + %define TMPL_PTR_DEF dw + %define TMPL_NM(Name) Name %+ _pe16 + %define TMPL_NM_CMN(Name) Name %+ _p16 + %define TMPL_MODE_STR '16-bit unpaged protected mode' +%endif + +%ifdef TMPL_PE32 + %ifdef TMPL_RM + %error "Both 'TMPL_PE32' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_PE32' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_PE32' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_PE32' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_PE32' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_PE32' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_PE32' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_PE32' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAE86 + %error "Both 'TMPL_PE32' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_PE32' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_PE32' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_PE32' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_PE + %define TMPL_CMN_P32 + %define TMPL_32BIT + %define TMPL_BITS 32 + %define TMPL_PTR_DEF dd + %define TMPL_NM(Name) Name %+ _pe32 + %define TMPL_NM_CMN(Name) Name %+ _p32 + %define TMPL_MODE_STR '32-bit unpaged protected mode' +%endif + +%ifdef TMPL_PEV86 + %ifdef TMPL_RM + %error "Both 'TMPL_PEV86' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_PEV86' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_PEV86' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_PEV86' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_PEV86' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_PEV86' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_PEV86' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_PEV86' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAE86 + %error "Both 'TMPL_PEV86' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_PEV86' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_PEV86' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_PEV86' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_PE + %define TMPL_CMN_V86 + %define TMPL_CMN_R86 + %define TMPL_16BIT + %define TMPL_BITS 16 + %define TMPL_PTR_DEF dw + %define TMPL_NM(Name) Name %+ _pev86 + %define TMPL_NM_CMN(Name) Name %+ _r86 + %define TMPL_MODE_STR 'v8086 unpaged protected mode' +%endif + +%ifdef TMPL_PP16 + %ifdef TMPL_RM + %error "Both 'TMPL_PP16' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_PP16' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_PP16' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_PP16' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_PP16' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_PP32' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_PP16' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_PP16' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_PP16' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_PP16' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_PP16' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_PP16' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_PP + %define TMPL_CMN_P16 + %define TMPL_16BIT + %define TMPL_BITS 16 + %define TMPL_PTR_DEF dw + %define TMPL_NM(Name) Name %+ _pp16 + %define TMPL_NM_CMN(Name) Name %+ _p16 + %define TMPL_MODE_STR '16-bit paged protected mode' +%endif + +%ifdef TMPL_PP32 + %ifdef TMPL_RM + %error "Both 'TMPL_PP32' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_PP32' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_PP32' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_PP32' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_PP32' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_PP32' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_PP32' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_PP32' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_PP32' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_PP32' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_PP32' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_PP32' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_PP + %define TMPL_CMN_P32 + %define TMPL_32BIT + %define TMPL_BITS 32 + %define TMPL_PTR_DEF dd + %define TMPL_NM(Name) Name %+ _pp32 + %define TMPL_NM_CMN(Name) Name %+ _p32 + %define TMPL_MODE_STR '32-bit paged protected mode' +%endif + +%ifdef TMPL_PPV86 + %ifdef TMPL_RM + %error "Both 'TMPL_PPV86' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_PPV86' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_PPV86' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_PPV86' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_PPV86' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_PPV86' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_PPV86' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_PPV86' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_PPV86' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_PPV86' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_PPV86' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_PPV86' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_PP + %define TMPL_CMN_V86 + %define TMPL_CMN_R86 + %define TMPL_16BIT + %define TMPL_BITS 16 + %define TMPL_PTR_DEF dw + %define TMPL_NM(Name) Name %+ _ppv86 + %define TMPL_NM_CMN(Name) Name %+ _r86 + %define TMPL_MODE_STR 'v8086 paged protected mode' +%endif + +%ifdef TMPL_PAE16 + %ifdef TMPL_RM + %error "Both 'TMPL_PAE16' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_PAE16' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_PAE16' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_PAE16' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_PAE16' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_PAE16' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_PAE16' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_PAE16' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_PAE16' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_PAE16' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_PAE16' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_PAE16' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_PAE + %define TMPL_16BIT + %define TMPL_CMN_P16 + %define TMPL_BITS 16 + %define TMPL_PTR_DEF dw + %define TMPL_NM(Name) Name %+ _pae16 + %define TMPL_NM_CMN(Name) Name %+ _p16 + %define TMPL_MODE_STR '16-bit pae protected mode' +%endif + +%ifdef TMPL_PAE32 + %ifdef TMPL_RM + %error "Both 'TMPL_PAE32' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_PAE32' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_PAE32' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_PAE32' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_PAE32' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_PAE32' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_PAE32' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_PAE32' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_PAE32' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_PAE32' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_PAE32' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_PAE32' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_PAE + %define TMPL_CMN_P32 + %define TMPL_32BIT + %define TMPL_BITS 32 + %define TMPL_PTR_DEF dd + %define TMPL_NM(Name) Name %+ _pae32 + %define TMPL_NM_CMN(Name) Name %+ _p32 + %define TMPL_MODE_STR '32-bit pae protected mode' +%endif + +%ifdef TMPL_PAEV86 + %ifdef TMPL_RM + %error "Both 'TMPL_PAEV86' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_PAEV86' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_PAEV86' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_PAEV86' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_PAEV86' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_PAEV86' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_PAEV86' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_PAEV86' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_PAEV86' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_PAEV86' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_PAEV86' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_PAEV86' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_PAE + %define TMPL_CMN_V86 + %define TMPL_CMN_R86 + %define TMPL_16BIT + %define TMPL_BITS 16 + %define TMPL_PTR_DEF dw + %define TMPL_NM(Name) Name %+ _paev86 + %define TMPL_NM_CMN(Name) Name %+ _r86 + %define TMPL_MODE_STR 'v8086 pae protected mode' +%endif + +%ifdef TMPL_LM16 + %ifdef TMPL_RM + %error "Both 'TMPL_LM16' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_LM16' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_LM16' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_LM16' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_LM16' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_LM16' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_LM16' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_LM16' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_LM16' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_LM16' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_LM16' and 'TMPL_LM32' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_LM16' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_LM + %define TMPL_CMN_P16 + %define TMPL_16BIT + %define TMPL_BITS 16 + %define TMPL_PTR_DEF dw + %define TMPL_NM(Name) Name %+ _lm16 + %define TMPL_NM_CMN(Name) Name %+ _p16 + %define TMPL_MODE_STR '16-bit long mode' +%endif + +%ifdef TMPL_LM32 + %ifdef TMPL_RM + %error "Both 'TMPL_LM32' and 'TMPL_RM' are defined." + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_LM32' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_LM32' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_LM32' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_LM32' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_LM32' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_LM32' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_LM32' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_LM32' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_LM32' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_LM32' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM64 + %error "Both 'TMPL_LM32' and 'TMPL_LM64' are defined." + %endif + %define TMPL_CMN_LM + %define TMPL_CMN_P32 + %define TMPL_32BIT + %define TMPL_BITS 32 + %define TMPL_PTR_DEF dd + %define TMPL_NM(Name) Name %+ _lm32 + %define TMPL_NM_CMN(Name) Name %+ _p32 + %define TMPL_MODE_STR '32-bit long mode' +%endif + +%ifdef TMPL_LM64 + %ifdef TMPL_RM + %error ""Both 'TMPL_LM64' and 'TMPL_RM' are defined."" + %endif + %ifdef TMPL_PE16 + %error "Both 'TMPL_LM64' and 'TMPL_PE16' are defined." + %endif + %ifdef TMPL_PE32 + %error "Both 'TMPL_LM64' and 'TMPL_PE32' are defined." + %endif + %ifdef TMPL_PEV86 + %error "Both 'TMPL_LM64' and 'TMPL_PEV86' are defined." + %endif + %ifdef TMPL_PP16 + %error "Both 'TMPL_LM64' and 'TMPL_PP16' are defined." + %endif + %ifdef TMPL_PP32 + %error "Both 'TMPL_LM64' and 'TMPL_PP32' are defined." + %endif + %ifdef TMPL_PPV86 + %error "Both 'TMPL_LM64' and 'TMPL_PPV86' are defined." + %endif + %ifdef TMPL_PAE16 + %error "Both 'TMPL_LM64' and 'TMPL_PAE16' are defined." + %endif + %ifdef TMPL_PAE32 + %error "Both 'TMPL_LM64' and 'TMPL_PAE32' are defined." + %endif + %ifdef TMPL_PAEV86 + %error "Both 'TMPL_LM64' and 'TMPL_PAEV86' are defined." + %endif + %ifdef TMPL_LM16 + %error "Both 'TMPL_LM64' and 'TMPL_LM16' are defined." + %endif + %ifdef TMPL_LM32 + %error "Both 'TMPL_LM64' and 'TMPL_LM32' are defined." + %endif + %define TMPL_CMN_LM + %define TMPL_CMN_P64 + %define TMPL_64BIT + %define TMPL_BITS 64 + %define TMPL_PTR_DEF dq + %define TMPL_NM(Name) Name %+ _lm64 + %define TMPL_NM_CMN(Name) Name %+ _p64 + %define TMPL_MODE_STR '64-bit long mode' +%endif + +%ifndef TMPL_MODE_STR + %error "internal error" +%endif + + +; +; Register aliases. +; +%ifdef TMPL_64BIT + %define xCB 8 + %define xDEF dq + %define xRES resq + %define xPRE qword + %define xSP rsp + %define xBP rbp + %define xAX rax + %define xBX rbx + %define xCX rcx + %define xDX rdx + %define xDI rdi + %define xSI rsi + %define xWrtRIP wrt rip + %define xPUSHF pushq + %define xPOPF popfq +%else + %ifdef TMPL_32BIT + %define xCB 4 + %define xDEF dd + %define xRES resd + %define xPRE dword + %define xSP esp + %define xBP ebp + %define xAX eax + %define xBX ebx + %define xCX ecx + %define xDX edx + %define xDI edi + %define xSI esi + %define xWrtRIP + %define xPUSHF pushfd + %define xPOPF popfd + %else + %ifndef TMPL_16BIT + %error "TMPL_XXBIT is not defined." + %endif + %define xCB 2 + %define xDEF dw + %define xRES resw + %define xPRE word + %define xSP sp + %define xBP bp + %define xAX ax + %define xBX bx + %define xCX cx + %define xDX dx + %define xDI di + %define xSI si + %define xWrtRIP + %define xPUSHF pushf + %define xPOPF popf + %endif +%endif + +; +; Register names corresponding to the max size for pop/push <reg>. +; +; 16-bit can push both 32-bit and 16-bit registers. This 's' prefixed variant +; is used when 16-bit should use the 32-bit register. +; +%ifdef TMPL_64BIT + %define sCB 8 + %define sDEF dq + %define sRES resq + %define sPRE qword + %define sSP rsp + %define sBP rbp + %define sAX rax + %define sBX rbx + %define sCX rcx + %define sDX rdx + %define sDI rdi + %define sSI rsi + %define sPUSHF pushfq + %define sPOPF popfq +%else + %define sCB 4 + %define sDEF dd + %define sRES resd + %define sPRE dword + %define sSP esp + %define sBP ebp + %define sAX eax + %define sBX ebx + %define sCX ecx + %define sDX edx + %define sDI edi + %define sSI esi + %define sPUSHF pushfd + %define sPOPF popfd +%endif + +; +; Default code segment. +; +%ifdef TMPL_64BIT + %define TMPL_BEGINCODE BEGINCODEHIGH +%elifdef TMPL_32BIT + %define TMPL_BEGINCODE BEGINCODEHIGH +%elifdef TMPL_16BIT + %define TMPL_BEGINCODE BEGINCODELOW +%else + %error "Missing TMPL_xxBIT!" +%endif +TMPL_BEGINCODE + +; +; Change the bitness. +; +%ifdef TMPL_64BIT +BITS 64 +%else + %ifdef TMPL_32BIT +BITS 32 + %else +BITS 16 + %endif +%endif + |