VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/SUPLibTracerA.asm@ 67954

Last change on this file since 67954 was 62490, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.0 KB
Line 
1; $Id: SUPLibTracerA.asm 62490 2016-07-22 18:41:49Z vboxsync $
2;; @file
3; VirtualBox Support Library - Tracer Interface, Assembly bits.
4;
5
6;
7; Copyright (C) 2012-2016 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26
27;*******************************************************************************
28;* Header Files *
29;*******************************************************************************
30%include "iprt/asmdefs.mac"
31%include "VBox/sup.mac"
32
33; This should go into asmdefs.mac
34%ifdef PIC
35 %ifdef ASM_FORMAT_ELF
36 %define RT_ASM_USE_GOT
37 %define RT_ASM_USE_PLT
38 %endif
39%endif
40
41
42;*******************************************************************************
43;* Structures and Typedefs *
44;*******************************************************************************
45struc SUPREQHDR
46 .u32Cookie resd 1
47 .u32SessionCookie resd 1
48 .cbIn resd 1
49 .cbOut resd 1
50 .fFlags resd 1
51 .rc resd 1
52endstruc
53
54struc SUPTRACERUMODFIREPROBE
55 .Hdr resb SUPREQHDR_size
56 .In resb SUPDRVTRACERUSRCTX64_size
57endstruc
58
59
60extern NAME(suplibTracerFireProbe)
61
62
63BEGINCODE
64
65
66;;
67; Set up a SUPTRACERUMODFIREPROBE request package on the stack and a C helper
68; function in SUPLib.cpp to do the rest.
69;
70EXPORTEDNAME SUPTracerFireProbe
71 push xBP
72 mov xBP, xSP
73
74 ;
75 ; Allocate package and set the sizes (the helper does the rest of
76 ; the header). Setting the sizes here allows the helper to verify our
77 ; idea of the request sizes.
78 ;
79 lea xSP, [xBP - SUPTRACERUMODFIREPROBE_size - 8]
80
81 mov dword [xSP + SUPTRACERUMODFIREPROBE.Hdr + SUPREQHDR.cbIn], SUPTRACERUMODFIREPROBE_size
82 mov dword [xSP + SUPTRACERUMODFIREPROBE.Hdr + SUPREQHDR.cbOut], SUPREQHDR_size
83
84%ifdef RT_ARCH_AMD64
85 ;
86 ; Save the AMD64 context.
87 ;
88 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rax], rax
89 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rcx], rcx
90 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rdx], rdx
91 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rbx], rbx
92 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rsi], rsi
93 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rdi], rdi
94 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.r8 ], r8
95 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.r9 ], r9
96 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.r10], r10
97 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.r11], r11
98 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.r12], r12
99 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.r13], r13
100 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.r14], r14
101 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.r15], r15
102 pushf
103 pop xAX
104 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rflags], xAX
105 mov xAX, [xBP + xCB]
106 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rip], xAX
107 mov xAX, [xBP]
108 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rbp], xAX
109 lea xAX, [xBP + xCB*2]
110 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.rsp], xAX
111 %ifdef ASM_CALL64_MSC
112 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.uVtgProbeLoc], rcx
113 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*0], rdx
114 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*1], r8
115 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*2], r9
116 mov xAX, [xBP + xCB*2 + 0x20 + xCB*0]
117 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*3], xAX
118 mov xAX, [xBP + xCB*2 + 0x20 + xCB*1]
119 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*4], xAX
120 mov xAX, [xBP + xCB*2 + 0x20 + xCB*2]
121 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*5], xAX
122 mov xAX, [xBP + xCB*2 + 0x20 + xCB*3]
123 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*6], xAX
124 mov xAX, [xBP + xCB*2 + 0x20 + xCB*4]
125 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*7], xAX
126 mov xAX, [xBP + xCB*2 + 0x20 + xCB*5]
127 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*8], xAX
128 mov xAX, [xBP + xCB*2 + 0x20 + xCB*6]
129 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*9], xAX
130 mov eax, [xCX + 4] ; VTGPROBELOC::idProbe.
131 %else
132 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.uVtgProbeLoc], rdi
133 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*0], rsi
134 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*1], rdx
135 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*2], rcx
136 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*3], r8
137 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*4], r9
138 mov xAX, [xBP + xCB*2 + xCB*0]
139 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*5], xAX
140 mov xAX, [xBP + xCB*2 + xCB*1]
141 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*6], xAX
142 mov xAX, [xBP + xCB*2 + xCB*2]
143 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*7], xAX
144 mov xAX, [xBP + xCB*2 + xCB*3]
145 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*8], xAX
146 mov xAX, [xBP + xCB*2 + xCB*4]
147 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.u.Amd64.aArgs + xCB*9], xAX
148 mov eax, [xDI + 4] ; VTGPROBELOC::idProbe.
149 %endif
150 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.idProbe], eax
151 mov dword [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX64.cBits], 64
152
153 ;
154 ; Call the helper.
155 ;
156 %ifdef ASM_CALL64_MSC
157 mov xDX, xSP
158 sub xSP, 0x20
159 call NAME(suplibTracerFireProbe)
160 %else
161 mov xSI, xSP
162 %ifdef RT_ASM_USE_PLT
163 call NAME(suplibTracerFireProbe) wrt ..plt
164 %else
165 call NAME(suplibTracerFireProbe)
166 %endif
167 %endif
168
169%elifdef RT_ARCH_X86
170 ;
171 ; Save the X86 context.
172 ;
173 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.eax], eax
174 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.ecx], ecx
175 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.edx], edx
176 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.ebx], ebx
177 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.esi], esi
178 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.edi], edi
179 pushf
180 pop xAX
181 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.eflags], xAX
182 mov xAX, [xBP + xCB]
183 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.eip], xAX
184 mov xAX, [xBP]
185 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.ebp], xAX
186 lea xAX, [xBP + xCB*2]
187 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.esp], xAX
188
189 mov xCX, [xBP + xCB*2 + xCB*0]
190 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.uVtgProbeLoc], xCX ; keep, used below.
191
192 mov edx, 20
193.more:
194 dec edx
195 mov xAX, [xBP + xCB*2 + xCB*xDX]
196 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.u.X86.aArgs + xCB*xDX], xAX
197 jnz .more
198
199 mov eax, [xCX + 4] ; VTGPROBELOC::idProbe.
200 mov [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.idProbe], eax
201 mov dword [xSP + SUPTRACERUMODFIREPROBE.In + SUPDRVTRACERUSRCTX32.cBits], 32
202
203 ;
204 ; Call the helper.
205 ;
206 mov xDX, xSP
207 push xDX
208 push xCX
209 %ifdef RT_ASM_USE_PLT
210 call NAME(suplibTracerFireProbe) wrt ..plt
211 %else
212 call NAME(suplibTracerFireProbe)
213 %endif
214%else
215 %error "Arch not supported (or correctly defined)."
216%endif
217
218
219 leave
220 ret
221ENDPROC SUPTracerFireProbe
222
223
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use