summaryrefslogtreecommitdiff
path: root/src/VBox/VMM/PATM/PATMA.mac
blob: ffe2d1fdf5133c829000e018b2639b8602fd6435 (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
; $Id: PATMA.mac $
;; @file
; PATM macros & definitions (identical to PATMA.h!!)
;

;
; Copyright (C) 2006-2007 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

%define PATM_VMFLAGS         0xF1ABCD00
%ifdef VBOX_WITH_STATISTICS
%define PATM_ALLPATCHCALLS   0xF1ABCD01
%define PATM_PERPATCHCALLS   0xF1ABCD02
%endif
%define PATM_JUMPDELTA       0xF1ABCD03
%ifdef VBOX_WITH_STATISTICS
%define PATM_IRETEFLAGS      0xF1ABCD04
%define PATM_IRETCS          0xF1ABCD05
%define PATM_IRETEIP         0xF1ABCD06
%endif
%define PATM_FIXUP           0xF1ABCD07
%define PATM_PENDINGACTION   0xF1ABCD08
%define PATM_CPUID_STD_PTR   0xF1ABCD09
%define PATM_CPUID_EXT_PTR   0xF1ABCD0a
%define PATM_CPUID_DEF_PTR   0xF1ABCD0b
%define PATM_STACKBASE       0xF1ABCD0c    ;/** Stack to store our private patch return addesses */
%define PATM_STACKBASE_GUEST 0xF1ABCD0d    ;/** Stack to store guest return addresses */
%define PATM_STACKPTR        0xF1ABCD0e
%define PATM_PATCHBASE       0xF1ABCD0f
%define PATM_INTERRUPTFLAG   0xF1ABCD10
%define PATM_INHIBITIRQADDR  0xF1ABCD11
%define PATM_VM_FORCEDACTIONS  0xF1ABCD12
%define PATM_TEMP_EAX                           0xF1ABCD13      ;/** Location for original EAX register */
%define PATM_TEMP_ECX                           0xF1ABCD14      ;/** Location for original ECX register */
%define PATM_TEMP_EDI                           0xF1ABCD15      ;/** Location for original EDI register */
%define PATM_TEMP_EFLAGS                        0xF1ABCD16      ;/** Location for original eflags */
%define PATM_TEMP_RESTORE_FLAGS                 0xF1ABCD17      ;/** Which registers to restore */
%define PATM_CALL_PATCH_TARGET_ADDR             0xF1ABCD18
%define PATM_CALL_RETURN_ADDR                   0xF1ABCD19
%define PATM_CPUID_CENTAUR_PTR                  0xF1ABCD1A

;/* Anything larger doesn't require a fixup */
%define PATM_NO_FIXUP        0xF1ABCE00
%define PATM_CPUID_STD_MAX   0xF1ABCE00
%define PATM_CPUID_EXT_MAX   0xF1ABCE01
%define PATM_RETURNADDR      0xF1ABCE02
%define PATM_PATCHNEXTBLOCK  0xF1ABCE03
%define PATM_CALLTARGET      0xF1ABCE04    ; /* relative */
%define PATM_NEXTINSTRADDR   0xF1ABCE05    ; /* absolute guest address of the next instruction */
%define PATM_CURINSTRADDR    0xF1ABCE06    ; /* absolute guest address of the current instruction */
%define PATM_LOOKUP_AND_CALL_FUNCTION           0xF1ABCE07   ; /** Relative address of global PATM lookup and call function. */
%define PATM_RETURN_FUNCTION                    0xF1ABCE08   ; /** Relative address of global PATM return function. */
%define PATM_LOOKUP_AND_JUMP_FUNCTION           0xF1ABCE09   ; /** Relative address of global PATM lookup and jump function. */
%define PATM_IRET_FUNCTION                      0xF1ABCE0A   ; /** Relative address of global PATM iret function. */
%define PATM_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.mac!!)
%define PATM_STACK_SIZE                    (4096)
%define PATM_STACK_TOTAL_SIZE              (2*PATM_STACK_SIZE)

;/* 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

%define PATM_RESTORE_EAX                        RT_BIT(0)
%define PATM_RESTORE_ECX                        RT_BIT(1)
%define PATM_RESTORE_EDI                        RT_BIT(2)


;/* 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)