; $Id: VMMRC.mac 55028 2015-03-31 12:31:59Z vboxsync $ ;; @file ; VMMGC - Raw-mode Context Assembly Macros. ; ; ; Copyright (C) 2006-2012 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 __VMMGC_mac__ %define __VMMGC_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