summaryrefslogtreecommitdiffstats
path: root/src/VBox/VMM/VMMRC/VMMRC.mac
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/VMM/VMMRC/VMMRC.mac')
-rw-r--r--src/VBox/VMM/VMMRC/VMMRC.mac194
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