1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
; $Id: VMMRC.mac $
;; @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.
%ifdef ASM_FORMAT_OMF
%macro VMMR0_SEG 1
segment VMMR0.%1 public CLASS=CONST align=1 use32
%endmacro
%define VMMR0_SEG_DEFINED
%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
%define VMMR0_SEG_DEFINED
%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
%define VMMR0_SEG_DEFINED
%endif
%ifdef ASM_FORMAT_PE
%macro VMMR0_SEG 1
[section .rdata$VMMR0.%1 align=1 ]
%endmacro
%define VMMR0_SEG_DEFINED
%endif
%ifndef VMMR0_SEG_DEFINED
%error "VMMR0_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
%endif
|