VirtualBox

source: vbox/trunk/src/recompiler/new/VBoxREMWrapperA.asm@ 1818

Last change on this file since 1818 was 1818, checked in by vboxsync, 18 years ago

vista 64 loads dlls above 4GB, so do indirect calls/jmps.

  • Property svn:keywords set to Id
File size: 11.7 KB
Line 
1; $Id: VBoxREMWrapperA.asm 1818 2007-03-30 05:43:05Z vboxsync $
2;; @file
3;
4; VBoxREM Wrapper, Assembly routines and wrapper Templates.
5;
6; InnoTek Systemberatung GmbH confidential
7;
8; Copyright (c) 2006 InnoTek Systemberatung GmbH
9;
10; Author: knut st. osmundsen <[email protected]>
11;
12; All Rights Reserved
13;
14;
15
16
17
18
19;*******************************************************************************
20;* Header Files *
21;*******************************************************************************
22%include "iprt/asmdefs.mac"
23
24
25
26BEGINCODE
27
28%ifdef __WIN64__
29
30
31BEGINPROC WrapGCC2MSC0Int
32%ifdef USE_DIRECT_CALLS
33 jmp $+5+0deadbeefh
34%else
35 mov rax, 0xdeadf00df00ddead
36 jmp rax
37%endif
38ENDPROC WrapGCC2MSC0Int
39
40
41BEGINPROC WrapGCC2MSC1Int
42 push rbp
43 mov rbp, rsp
44 sub rsp, 10h
45
46 mov rcx, rdi
47%ifdef USE_DIRECT_CALLS
48 call $+5+0deadbeefh
49%else
50 mov rax, 0xdeadf00df00ddead
51 call rax
52%endif
53
54 leave
55 ret
56ENDPROC WrapGCC2MSC1Int
57
58
59BEGINPROC WrapGCC2MSC2Int
60 push rbp
61 mov rbp, rsp
62 sub rsp, 10h
63
64 mov rdx, rsi
65 mov rcx, rdi
66%ifdef USE_DIRECT_CALLS
67 call $+5+0deadbeefh
68%else
69 mov rax, 0xdeadf00df00ddead
70 call rax
71%endif
72
73 leave
74 ret
75ENDPROC WrapGCC2MSC2Int
76
77
78BEGINPROC WrapGCC2MSC3Int
79 push rbp
80 mov rbp, rsp
81 sub rsp, 20h
82
83 mov r8, rdx
84 mov rdx, rsi
85 mov rcx, rdi
86%ifdef USE_DIRECT_CALLS
87 call $+5+0deadbeefh
88%else
89 mov rax, 0xdeadf00df00ddead
90 call rax
91%endif
92
93 leave
94 ret
95ENDPROC WrapGCC2MSC3Int
96
97
98BEGINPROC WrapGCC2MSC4Int
99 push rbp
100 mov rbp, rsp
101 sub rsp, 20h
102
103 mov r9, rcx
104 mov r8, rdx
105 mov rdx, rsi
106 mov rcx, rdi
107%ifdef USE_DIRECT_CALLS
108 call $+5+0deadbeefh
109%else
110 mov rax, 0xdeadf00df00ddead
111 call rax
112%endif
113
114 leave
115 ret
116ENDPROC WrapGCC2MSC4Int
117
118
119BEGINPROC WrapGCC2MSC5Int
120 push rbp
121 mov rbp, rsp
122 sub rsp, 30h
123
124 mov [rsp + 20h], r8
125 mov r9, rcx
126 mov r8, rdx
127 mov rdx, rsi
128 mov rcx, rdi
129%ifdef USE_DIRECT_CALLS
130 call $+5+0deadbeefh
131%else
132 mov rax, 0xdeadf00df00ddead
133 call rax
134%endif
135
136 leave
137 ret
138ENDPROC WrapGCC2MSC5Int
139
140
141BEGINPROC WrapGCC2MSC6Int
142 push rbp
143 mov rbp, rsp
144 sub rsp, 30h
145
146 mov [rsp + 28h], r9
147 mov [rsp + 20h], r8
148 mov r9, rcx
149 mov r8, rdx
150 mov rdx, rsi
151 mov rcx, rdi
152%ifdef USE_DIRECT_CALLS
153 call $+5+0deadbeefh
154%else
155 mov rax, 0xdeadf00df00ddead
156 call rax
157%endif
158
159 leave
160 ret
161ENDPROC WrapGCC2MSC6Int
162
163
164BEGINPROC WrapGCC2MSC7Int
165 push rbp
166 mov rbp, rsp
167 sub rsp, 40h
168
169 mov r11, [ebp + 10h]
170 mov [rsp + 30h], r11
171 mov [rsp + 28h], r9
172 mov [rsp + 20h], r8
173 mov r9, rcx
174 mov r8, rdx
175 mov rdx, rsi
176 mov rcx, rdi
177%ifdef USE_DIRECT_CALLS
178 call $+5+0deadbeefh
179%else
180 mov rax, 0xdeadf00df00ddead
181 call rax
182%endif
183
184 leave
185 ret
186ENDPROC WrapGCC2MSC7Int
187
188
189BEGINPROC WrapGCC2MSC8Int
190 push rbp
191 mov rbp, rsp
192 sub rsp, 40h
193
194 mov r10, [ebp + 18h]
195 mov [rsp + 38h], r10
196 mov r11, [ebp + 10h]
197 mov [rsp + 30h], r11
198 mov [rsp + 28h], r9
199 mov [rsp + 20h], r8
200 mov r9, rcx
201 mov r8, rdx
202 mov rdx, rsi
203 mov rcx, rdi
204%ifdef USE_DIRECT_CALLS
205 call $+5+0deadbeefh
206%else
207 mov rax, 0xdeadf00df00ddead
208 call rax
209%endif
210
211 leave
212 ret
213ENDPROC WrapGCC2MSC8Int
214
215
216BEGINPROC WrapGCC2MSC9Int
217 push rbp
218 mov rbp, rsp
219 sub rsp, 50h
220
221 mov rax, [ebp + 20h]
222 mov [rsp + 40h], rax
223 mov r10, [ebp + 18h]
224 mov [rsp + 38h], r10
225 mov r11, [ebp + 10h]
226 mov [rsp + 30h], r11
227 mov [rsp + 28h], r9
228 mov [rsp + 20h], r8
229 mov r9, rcx
230 mov r8, rdx
231 mov rdx, rsi
232 mov rcx, rdi
233%ifdef USE_DIRECT_CALLS
234 call $+5+0deadbeefh
235%else
236 mov rax, 0xdeadf00df00ddead
237 call rax
238%endif
239
240 leave
241 ret
242ENDPROC WrapGCC2MSC9Int
243
244
245BEGINPROC WrapGCC2MSC10Int
246 push rbp
247 mov rbp, rsp
248 sub rsp, 50h
249
250 mov r11, [ebp + 28h]
251 mov [rsp + 48h], r11
252 mov rax, [ebp + 20h]
253 mov [rsp + 40h], rax
254 mov r10, [ebp + 18h]
255 mov [rsp + 38h], r10
256 mov r11, [ebp + 10h]
257 mov [rsp + 30h], r11
258 mov [rsp + 28h], r9
259 mov [rsp + 20h], r8
260 mov r9, rcx
261 mov r8, rdx
262 mov rdx, rsi
263 mov rcx, rdi
264%ifdef USE_DIRECT_CALLS
265 call $+5+0deadbeefh
266%else
267 mov rax, 0xdeadf00df00ddead
268 call rax
269%endif
270
271 leave
272 ret
273ENDPROC WrapGCC2MSC10Int
274
275
276BEGINPROC WrapGCC2MSC11Int
277 push rbp
278 mov rbp, rsp
279 sub rsp, 60h
280
281 mov r10, [ebp + 30h]
282 mov [rsp + 50h], r10
283 mov r11, [ebp + 28h]
284 mov [rsp + 48h], r11
285 mov rax, [ebp + 20h]
286 mov [rsp + 40h], rax
287 mov r10, [ebp + 18h]
288 mov [rsp + 38h], r10
289 mov r11, [ebp + 10h]
290 mov [rsp + 30h], r11
291 mov [rsp + 28h], r9
292 mov [rsp + 20h], r8
293 mov r9, rcx
294 mov r8, rdx
295 mov rdx, rsi
296 mov rcx, rdi
297%ifdef USE_DIRECT_CALLS
298 call $+5+0deadbeefh
299%else
300 mov rax, 0xdeadf00df00ddead
301 call rax
302%endif
303
304 leave
305 ret
306ENDPROC WrapGCC2MSC11Int
307
308
309BEGINPROC WrapGCC2MSC12Int
310 push rbp
311 mov rbp, rsp
312 sub rsp, 60h
313
314 mov rax, [ebp + 28h]
315 mov [rsp + 48h], rax
316 mov r10, [ebp + 30h]
317 mov [rsp + 50h], r10
318 mov r11, [ebp + 28h]
319 mov [rsp + 48h], r11
320 mov rax, [ebp + 20h]
321 mov [rsp + 40h], rax
322 mov r10, [ebp + 18h]
323 mov [rsp + 38h], r10
324 mov r11, [ebp + 10h]
325 mov [rsp + 30h], r11
326 mov [rsp + 28h], r9
327 mov [rsp + 20h], r8
328 mov r9, rcx
329 mov r8, rdx
330 mov rdx, rsi
331 mov rcx, rdi
332%ifdef USE_DIRECT_CALLS
333 call $+5+0deadbeefh
334%else
335 mov rax, 0xdeadf00df00ddead
336 call rax
337%endif
338
339 leave
340 ret
341ENDPROC WrapGCC2MSC12Int
342
343
344
345BEGINPROC WrapGCC2MSCVariadictInt
346%ifdef DEBUG
347 ; check that there are NO floting point arguments in XMM registers!
348 or rax, rax
349 jz .ok
350 int3
351.ok:
352%endif
353 sub rsp, 28h
354 mov r11, [rsp + 28h] ; r11 = return address.
355 mov [rsp + 28h], r9
356 mov [rsp + 20h], r8
357 mov r9, rcx
358 mov [rsp + 18h], r9 ; (*)
359 mov r8, rdx
360 mov [rsp + 14h], r8 ; (*)
361 mov rdx, rsi
362 mov [rsp + 8h], rdx ; (*)
363 mov rcx, rdi
364 mov [rsp], rcx ; (*)
365 mov rsi, r11 ; rsi is preserved by the callee.
366%ifdef USE_DIRECT_CALLS
367 call $+5+0deadbeefh
368%else
369 mov rax, 0xdeadf00df00ddead
370 call rax
371%endif
372
373 add rsp, 30h
374 jmp rsi
375 ; (*) unconditionally spill the registers, just in case '...' implies weird stuff on MSC. Check this out!
376ENDPROC WrapGCC2MSCVariadictInt
377
378
379
380;
381; The other way around:
382;
383
384
385BEGINPROC WrapMSC2GCC0Int
386 push rbp
387 mov rbp, rsp
388 sub rsp, 10h
389 mov [ebp - 10h], rsi
390 mov [ebp - 18h], rdi
391
392%ifdef USE_DIRECT_CALLS
393 call $+5+0deadbeefh
394%else
395 mov rax, 0xdeadf00df00ddead
396 call rax
397%endif
398
399 mov rdi, [ebp - 18h]
400 mov rsi, [ebp - 10h]
401 leave
402 ret
403ENDPROC WrapMSC2GCC0Int
404
405
406BEGINPROC WrapMSC2GCC1Int
407 push rbp
408 mov rbp, rsp
409 sub rsp, 20h
410 mov [ebp - 10h], rsi
411 mov [ebp - 18h], rdi
412
413 mov rdi, rcx
414%ifdef USE_DIRECT_CALLS
415 call $+5+0deadbeefh
416%else
417 mov rax, 0xdeadf00df00ddead
418 call rax
419%endif
420
421 mov rdi, [ebp - 18h]
422 mov rsi, [ebp - 10h]
423 leave
424 ret
425ENDPROC WrapMSC2GCC1Int
426
427
428BEGINPROC WrapMSC2GCC2Int
429 push rbp
430 mov rbp, rsp
431 sub rsp, 20h
432 mov [ebp - 10h], rsi
433 mov [ebp - 18h], rdi
434
435 mov rdi, rcx
436 mov rsi, rdx
437%ifdef USE_DIRECT_CALLS
438 call $+5+0deadbeefh
439%else
440 mov rax, 0xdeadf00df00ddead
441 call rax
442%endif
443
444 mov rdi, [ebp - 18h]
445 mov rsi, [ebp - 10h]
446 leave
447 ret
448ENDPROC WrapMSC2GCC2Int
449
450
451BEGINPROC WrapMSC2GCC3Int
452 push rbp
453 mov rbp, rsp
454 sub rsp, 20h
455 mov [ebp - 10h], rsi
456 mov [ebp - 18h], rdi
457
458 mov rdi, rcx
459 mov rsi, rdx
460 mov rdx, r8
461 call $+5+0deadbeefh
462
463 mov rdi, [ebp - 18h]
464 mov rsi, [ebp - 10h]
465 leave
466 ret
467ENDPROC WrapMSC2GCC3Int
468
469
470BEGINPROC WrapMSC2GCC4Int
471 push rbp
472 mov rbp, rsp
473 sub rsp, 20h
474 mov [ebp - 10h], rsi
475 mov [ebp - 18h], rdi
476
477 mov rdi, rcx
478 mov rsi, rdx
479 mov rdx, r8
480 mov rcx, r9
481 call $+5+0deadbeefh
482
483 mov rdi, [ebp - 18h]
484 mov rsi, [ebp - 10h]
485 leave
486 ret
487ENDPROC WrapMSC2GCC4Int
488
489
490BEGINPROC WrapMSC2GCC5Int
491 push rbp
492 mov rbp, rsp
493 sub rsp, 20h
494 mov [ebp - 10h], rsi
495 mov [ebp - 18h], rdi
496
497 mov rdi, rcx
498 mov rsi, rdx
499 mov rdx, r8
500 mov rcx, r9
501 mov r8, [ebp + 30h]
502 call $+5+0deadbeefh
503
504 mov rdi, [ebp - 18h]
505 mov rsi, [ebp - 10h]
506 leave
507 ret
508ENDPROC WrapMSC2GCC5Int
509
510
511BEGINPROC WrapMSC2GCC6Int
512 push rbp
513 mov rbp, rsp
514 sub rsp, 20h
515 mov [ebp - 10h], rsi
516 mov [ebp - 18h], rdi
517
518 mov rdi, rcx
519 mov rsi, rdx
520 mov rdx, r8
521 mov rcx, r9
522 mov r8, [ebp + 30h]
523 mov r9, [ebp + 38h]
524 call $+5+0deadbeefh
525
526 mov rdi, [ebp - 18h]
527 mov rsi, [ebp - 10h]
528 leave
529 ret
530ENDPROC WrapMSC2GCC6Int
531
532
533BEGINPROC WrapMSC2GCC7Int
534 push rbp
535 mov rbp, rsp
536 sub rsp, 30h
537 mov [ebp - 10h], rsi
538 mov [ebp - 18h], rdi
539
540 mov rdi, rcx
541 mov rsi, rdx
542 mov rdx, r8
543 mov rcx, r9
544 mov r8, [ebp + 30h]
545 mov r9, [ebp + 38h]
546 mov r10, [ebp + 40h]
547 mov [esp], r10
548 call $+5+0deadbeefh
549
550 mov rdi, [ebp - 18h]
551 mov rsi, [ebp - 10h]
552 leave
553 ret
554ENDPROC WrapMSC2GCC7Int
555
556
557BEGINPROC WrapMSC2GCC8Int
558 push rbp
559 mov rbp, rsp
560 sub rsp, 30h
561 mov [ebp - 10h], rsi
562 mov [ebp - 18h], rdi
563
564 mov rdi, rcx
565 mov rsi, rdx
566 mov rdx, r8
567 mov rcx, r9
568 mov r8, [ebp + 30h]
569 mov r9, [ebp + 38h]
570 mov r10, [ebp + 40h]
571 mov [esp], r10
572 mov r11, [ebp + 48h]
573 mov [esp + 8], r11
574 call $+5+0deadbeefh
575
576 mov rdi, [ebp - 18h]
577 mov rsi, [ebp - 10h]
578 leave
579 ret
580ENDPROC WrapMSC2GCC8Int
581
582
583BEGINPROC WrapMSC2GCC9Int
584 push rbp
585 mov rbp, rsp
586 sub rsp, 40h
587 mov [ebp - 10h], rsi
588 mov [ebp - 18h], rdi
589
590 mov rdi, rcx
591 mov rsi, rdx
592 mov rdx, r8
593 mov rcx, r9
594 mov r8, [ebp + 30h]
595 mov r9, [ebp + 38h]
596 mov r10, [ebp + 40h]
597 mov [esp], r10
598 mov r11, [ebp + 48h]
599 mov [esp + 8], r11
600 mov rax, [ebp + 50h]
601 mov [esp + 10h], rax
602 call $+5+0deadbeefh
603
604 mov rdi, [ebp - 18h]
605 mov rsi, [ebp - 10h]
606 leave
607 ret
608ENDPROC WrapMSC2GCC9Int
609
610%endif ; __WIN64__
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette