summaryrefslogtreecommitdiffstats
path: root/src/VBox/VMM/VMMR3/PATMA.mac
blob: b0423502c6a68f74c3fda80e124d15566de7533d (plain)
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
; $Id: PATMA.mac $
;; @file
; PATM macros & definitions (identical to PATMA.h!).
;

;
; 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.
;

; hardcoded dependency on single byte int 3
%define PATM_INT3            int3

;; @name Patch Fixup Types
; @remarks These fixups types are part of the saved state.
; @{
%define PATM_ASMFIX_VMFLAGS                     0xF1ABCD00
%ifdef VBOX_WITH_STATISTICS
 %define PATM_ASMFIX_ALLPATCHCALLS              0xF1ABCD01
 %define PATM_ASMFIX_PERPATCHCALLS              0xF1ABCD02
%endif
%define PATM_ASMFIX_JUMPDELTA                   0xF1ABCD03
%ifdef VBOX_WITH_STATISTICS
 %define PATM_ASMFIX_IRETEFLAGS                 0xF1ABCD04
 %define PATM_ASMFIX_IRETCS                     0xF1ABCD05
 %define PATM_ASMFIX_IRETEIP                    0xF1ABCD06
%endif
%define PATM_ASMFIX_FIXUP                       0xF1ABCD07
%define PATM_ASMFIX_PENDINGACTION               0xF1ABCD08
%define PATM_ASMFIX_CPUID_STD_PTR               0xF1ABCD09
%define PATM_ASMFIX_CPUID_EXT_PTR               0xF1ABCD0a
%define PATM_ASMFIX_CPUID_DEF_PTR               0xF1ABCD0b
%define PATM_ASMFIX_STACKBASE                   0xF1ABCD0c  ;;< Stack to store our private patch return addresses
%define PATM_ASMFIX_STACKBASE_GUEST             0xF1ABCD0d  ;;< Stack to store guest return addresses
%define PATM_ASMFIX_STACKPTR                    0xF1ABCD0e
%define PATM_ASMFIX_PATCHBASE                   0xF1ABCD0f
%define PATM_ASMFIX_INTERRUPTFLAG               0xF1ABCD10
%define PATM_ASMFIX_INHIBITIRQADDR              0xF1ABCD11
%define PATM_ASMFIX_VM_FORCEDACTIONS            0xF1ABCD12
%define PATM_ASMFIX_TEMP_EAX                    0xF1ABCD13  ;;< Location for original EAX register
%define PATM_ASMFIX_TEMP_ECX                    0xF1ABCD14  ;;< Location for original ECX register
%define PATM_ASMFIX_TEMP_EDI                    0xF1ABCD15  ;;< Location for original EDI register
%define PATM_ASMFIX_TEMP_EFLAGS                 0xF1ABCD16  ;;< Location for original eflags
%define PATM_ASMFIX_TEMP_RESTORE_FLAGS          0xF1ABCD17  ;;< Which registers to restore
%define PATM_ASMFIX_CALL_PATCH_TARGET_ADDR      0xF1ABCD18
%define PATM_ASMFIX_CALL_RETURN_ADDR            0xF1ABCD19
%define PATM_ASMFIX_CPUID_CENTAUR_PTR           0xF1ABCD1a
%define PATM_ASMFIX_REUSE_LATER_0               0xF1ABCD1b
%define PATM_ASMFIX_REUSE_LATER_1               0xF1ABCD1c
%define PATM_ASMFIX_REUSE_LATER_2               0xF1ABCD1d
%define PATM_ASMFIX_REUSE_LATER_3               0xF1ABCD1e
%define PATM_ASMFIX_PATCH_HLP_CPUM_CPUID        0xF1ABCD1f

;/* Anything larger doesn't require a fixup */
%define PATM_ASMFIX_NO_FIXUP                    0xF1ABCE00
%define PATM_ASMFIX_CPUID_STD_MAX               0xF1ABCE00
%define PATM_ASMFIX_CPUID_EXT_MAX               0xF1ABCE01
%define PATM_ASMFIX_RETURNADDR                  0xF1ABCE02
%define PATM_ASMFIX_PATCHNEXTBLOCK              0xF1ABCE03
%define PATM_ASMFIX_CALLTARGET                  0xF1ABCE04  ;;< relative call target
%define PATM_ASMFIX_NEXTINSTRADDR               0xF1ABCE05  ;;< absolute guest address of the next instruction
%define PATM_ASMFIX_CURINSTRADDR                0xF1ABCE06  ;;< absolute guest address of the current instruction
%define PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION    0xF1ABCE07  ;;< Relative address of global PATM lookup and call function.
%define PATM_ASMFIX_RETURN_FUNCTION             0xF1ABCE08  ;;< Relative address of global PATM return function.
%define PATM_ASMFIX_LOOKUP_AND_JUMP_FUNCTION    0xF1ABCE09  ;;< Relative address of global PATM lookup and jump function.
%define PATM_ASMFIX_IRET_FUNCTION               0xF1ABCE0A  ;;< Relative address of global PATM iret function.
%define PATM_ASMFIX_CPUID_CENTAUR_MAX           0xF1ABCE0B
;; @}


;; Everything except IOPL, NT, IF, VM, VIF, VIP and RF
%define PATM_FLAGS_MASK      (X86_EFL_CF|X86_EFL_PF|X86_EFL_AF|X86_EFL_ZF|X86_EFL_SF|X86_EFL_TF|X86_EFL_DF|X86_EFL_OF|X86_EFL_AC|X86_EFL_ID)

; currently only IF & IOPL
%define PATM_VIRTUAL_FLAGS_MASK (X86_EFL_IF|X86_EFL_IOPL)

; PATM stack size (identical in PATMA.h!!)
%define PATM_STACK_SIZE                    (4096)
%define PATM_STACK_TOTAL_SIZE              (2 * PATM_STACK_SIZE)
%define PATM_MAX_STACK                     (PATM_STACK_SIZE / RTRCPTR_CB)

;; @name Patch Manager pending actions (in GCSTATE).
;; @{
%define PATM_ACTION_LOOKUP_ADDRESS              1
%define PATM_ACTION_DISPATCH_PENDING_IRQ        2
%define PATM_ACTION_PENDING_IRQ_AFTER_IRET      3
%define PATM_ACTION_DO_V86_IRET                 4
%define PATM_ACTION_LOG_IF1                     5
%define PATM_ACTION_LOG_CLI                     6
%define PATM_ACTION_LOG_STI                     7
%define PATM_ACTION_LOG_POPF_IF1                8
%define PATM_ACTION_LOG_POPF_IF0                9
%define PATM_ACTION_LOG_PUSHF                   10
%define PATM_ACTION_LOG_IRET                    11
%define PATM_ACTION_LOG_RET                     12
%define PATM_ACTION_LOG_CALL                    13
%define PATM_ACTION_LOG_GATE_ENTRY              14
;; @}

;; Magic dword found in ecx for patm pending actions.
%define PATM_ACTION_MAGIC                       0xABCD4321

;; @name PATM_ASMFIX_TEMP_RESTORE_FLAGS
;; @{
%define PATM_RESTORE_EAX                        RT_BIT(0)
%define PATM_RESTORE_ECX                        RT_BIT(1)
%define PATM_RESTORE_EDI                        RT_BIT(2)
;; @}


;;
; Relocation entry for PATCHASMRECORD.
;
struc PATCHASMRELOC
    ;; The relocation type.
    .uType              resd 1
    ;; Additional information specific to the relocation type.
    .uCode              resd 1
endstruc

;;
; Assembly patch descriptor record.
;
struc PATCHASMRECORD
    ;; Pointer to the patch code.
    .pbFunction         RTCCPTR_RES 1
    ;; Offset of the jump table?
    .offJump            resd 1
    ;; Used only by loop/loopz/loopnz.
    .offRelJump         resd 1
    ;; Size override byte position.
    .offSizeOverride    resd 1
    ;; The size of the patch function.
    .cbFunction         resd 1
    ;; The number of relocations in aRelocs.
    .cRelocs            resd 1
    ;; Variable sized relocation table. (put after the iend, so no included)
    ;.aRelocs            resb PATCHASMRELOC_size
endstruc

;/* For indirect calls/jump (identical in PATMA.h & PATMA.mac!) */
%define PATM_MAX_JUMPTABLE_ENTRIES        16

struc PATCHJUMPTABLE
    .nrSlots         resw    1
    .ulInsertPos     resw    1
    .cAddresses      resd    1
    ; array of pInstrGC and pRelPatchGC pairs (nrSlot times)
    .Slot_pInstrGC   resd    1
    .Slot_pRelPatchGC resd   1
endstruc

;/* Must match structure size!!
%define PATCHJUMPTABLE_SIZE    (PATM_MAX_JUMPTABLE_ENTRIES*2*4)
;/* Direct calls need only one lookup slot */
%define PATCHDIRECTJUMPTABLE_SIZE (2*4)