diff options
Diffstat (limited to 'src/VBox/VMM/VMMRC/VMMRC.mac')
-rw-r--r-- | src/VBox/VMM/VMMRC/VMMRC.mac | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/src/VBox/VMM/VMMRC/VMMRC.mac b/src/VBox/VMM/VMMRC/VMMRC.mac new file mode 100644 index 00000000..6f204121 --- /dev/null +++ b/src/VBox/VMM/VMMRC/VMMRC.mac @@ -0,0 +1,194 @@ +; $Id: VMMRC.mac $ +;; @file +; VMMRC - Raw-mode Context Assembly Macros. +; + +; +; Copyright (C) 2006-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. +; + +%ifndef __VMMRC_mac__ +%define __VMMRC_mac__ + +%include "VBox/asmdefs.mac" + + +;; @def VMMR0_SEG +; Set the output segment to one of the special VMMR0 segments. +; @param %1 The segment name. +; @remark Use BEGINCODE to switch back to the code segment. + +;; @def VMMR0_SEG_CODE +; Set the output segment to one of the special VMMR0 code segments. +; @param %1 The segment name. +%ifdef ASM_FORMAT_OMF + %macro VMMR0_SEG 1 + segment VMMR0.%1 public CLASS=CONST align=1 use32 flat + %endmacro + + %macro VMMR0_CODE_SEG 1 + segment VMMR0.%1 public CLASS=CODE align=16 use32 flat + %endmacro +%endif + +%ifdef ASM_FORMAT_ELF + %macro VMMR0_SEG 1 + %ifndef DEFINED_VMMR0_SEG.%1 + %define DEFINED_VMMR0_SEG.%1 1 + [section .VMMR0.%1 progbits alloc noexec nowrite align=1 ] + %else + [section .VMMR0.%1 ] + %endif + %endmacro + + %macro VMMR0_CODE_SEG 1 + %ifndef DEFINED_VMMR0_CODE_SEG.%1 + %define DEFINED_VMMR0_CODE_SEG.%1 1 + [section .VMMR0.%1 progbits alloc exec nowrite align=16 ] + %else + [section .VMMR0.%1 ] + %endif + %endmacro +%endif + +%ifdef ASM_FORMAT_MACHO + %ifdef __YASM__ + %macro VMMR0_SEG 1 + %ifndef DEFINED_VMMR0_SEG.%1 + %define DEFINED_VMMR0_SEG.%1 1 + [section VMMR0 %1 align=1 ] + %else + [section VMMR0 %1 ] + %endif + %endmacro + %else + %macro VMMR0_SEG 1 + [section VMMR0.%1 rdata align=1 ] + %endmacro + %endif + + %ifdef __YASM__ + %macro VMMR0_CODE_SEG 1 + %ifndef DEFINED_VMMR0_CODE_SEG.%1 + %define DEFINED_VMMR0_CODE_SEG.%1 1 + [section VMMR0 %1 exec align=16 ] + %else + [section VMMR0 %1 ] + %endif + %endmacro + %else + %macro VMMR0_CODE_SEG 1 + [section VMMR0.%1 exec align=16 ] + %endmacro + %endif +%endif + +%ifdef ASM_FORMAT_PE + %macro VMMR0_SEG 1 + %ifndef DEFINED_VMMR0_SEG.%1 + %define DEFINED_VMMR0_SEG.%1 1 + [section .rdata$VMMR0.%1 align=1 ] + %else + [section .rdata$VMMR0.%1] + %endif + %endmacro + + %macro VMMR0_CODE_SEG 1 + %ifndef DEFINED_VMMR0_CODE_SEG.%1 + %define DEFINED_VMMR0_CODE_SEG.%1 1 + [section .text$VMMR0.%1 align=16 ] + %else + [section .text$VMMR0.%1] + %endif + %endmacro +%endif + +%ifnmacro VMMR0_SEG + %error "VMMR0_CODE_SEG / ASM_FORMAT_xxx" +%endif +%ifnmacro VMMR0_CODE_SEG + %error "VMMR0_CODE_SEG / ASM_FORMAT_xxx" +%endif + + +;; @def TRPM_HANDLER +; Sets up a trap handler. +; +; @param %1 The segment name. +; @param %2 The end address. Use 0 to just handle one instruction. +; @param %3 Address of the handler function. +; @param %4 The user data member. +%macro TRPM_HANDLER 4 + +VMMR0_SEG %1 ; switch to the record segment. + + dd %%current_instr ; uStartEip + dd %2 ; uEndEip + dd %3 ; pfnHandler + dd %4 ; pvUser + +BEGINCODE ; back to the code segment. +%%current_instr: + +%endmacro + +;; @def TRPM_NP_HANDLER +; Sets up a segment not present fault handler for the current (=next) instruction. +; +; @param %1 Address of the handler function. +; @param %2 The user data member. +%macro TRPM_NP_HANDLER 2 +TRPM_HANDLER Trap0b, 0, %1, %2 +%endmacro + + +;; @def TRPM_GP_HANDLER +; Sets up a general protection fault handler for the current (=next) instruction. +; +; @param %1 Address of the handler function. +; @param %2 The user data member. +%macro TRPM_GP_HANDLER 2 +TRPM_HANDLER Trap0d, 0, %1, %2 +%endmacro + + +;; @def TRPM_PF_HANDLER +; Sets up a page fault handler for the current (=next) instruction. +; +; @param %1 Address of the handler function. +; @param %2 The user data member. +%macro TRPM_PF_HANDLER 2 +TRPM_HANDLER Trap0e, 0, %1, %2 +%endmacro + + +;; @def TRPM_NP_GP_HANDLER +; Sets up a segment not present fault and general protection fault handler +; for the current (=next) instruction. +; +; @param %1 Address of the handler function. +; @param %2 The user data member. +%macro TRPM_NP_GP_HANDLER 2 +TRPM_HANDLER Trap0b, 0, %1, %2 +TRPM_HANDLER Trap0d, 0, %1, %2 +%endmacro + + + +;; @def PATCH_HLP_SEG +; Set the output segment a special code segment for patch helpers (runs in ring-1 or ring-2). +; @param %1 The segment name. +; @remark Use BEGINCODE to switch back to the code segment. +%macro BEGIN_PATCH_HLP_SEG 0 +VMMR0_CODE_SEG PatchHlp +%endmacro + +%endif |