VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-TestDoModesHlp.asm@ 60676

Last change on this file since 60676 was 60676, checked in by vboxsync, 9 years ago

bs3kit: updates

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 34.4 KB
Line 
1; $Id: bs3-mode-TestDoModesHlp.asm 60676 2016-04-24 11:04:57Z vboxsync $
2;; @file
3; BS3Kit - Bs3TestDoModes helpers
4;
5
6;
7; Copyright (C) 2007-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 "bs3kit-template-header.mac"
31
32
33;*********************************************************************************************************************************
34;* Defined Constants And Macros *
35;*********************************************************************************************************************************
36;
37; We put most of this mess in the RMTEXT16 segment when in real mode.
38;
39%if TMPL_MODE == BS3_MODE_RM
40 %define MY_BEGIN_TEXT BS3_BEGIN_RMTEXT16
41 %define MY_BEGIN_TEXT16 BS3_BEGIN_RMTEXT16
42%else
43 %define MY_BEGIN_TEXT TMPL_BEGIN_TEXT
44 %define MY_BEGIN_TEXT16 BS3_BEGIN_TEXT16
45%endif
46
47
48;*********************************************************************************************************************************
49;* External Symbols *
50;*********************************************************************************************************************************
51%if TMPL_MODE == BS3_MODE_RM
52BS3_BEGIN_TEXT16_FARSTUBS
53extern TMPL_FAR_NM(Bs3SwitchToRM)
54extern TMPL_FAR_NM(Bs3SwitchToPE16)
55extern TMPL_FAR_NM(Bs3SwitchToPE16_32)
56extern TMPL_FAR_NM(Bs3SwitchToPE16_V86)
57extern TMPL_FAR_NM(Bs3SwitchToPE32)
58extern TMPL_FAR_NM(Bs3SwitchToPE32_16)
59extern TMPL_FAR_NM(Bs3SwitchToPEV86)
60extern TMPL_FAR_NM(Bs3SwitchToPP16)
61extern TMPL_FAR_NM(Bs3SwitchToPP16_32)
62extern TMPL_FAR_NM(Bs3SwitchToPP16_V86)
63extern TMPL_FAR_NM(Bs3SwitchToPP32)
64extern TMPL_FAR_NM(Bs3SwitchToPP32_16)
65extern TMPL_FAR_NM(Bs3SwitchToPPV86)
66extern TMPL_FAR_NM(Bs3SwitchToPAE16)
67extern TMPL_FAR_NM(Bs3SwitchToPAE16_32)
68extern TMPL_FAR_NM(Bs3SwitchToPAE16_V86)
69extern TMPL_FAR_NM(Bs3SwitchToPAE32)
70extern TMPL_FAR_NM(Bs3SwitchToPAE32_16)
71extern TMPL_FAR_NM(Bs3SwitchToPAEV86)
72extern TMPL_FAR_NM(Bs3SwitchToLM16)
73extern TMPL_FAR_NM(Bs3SwitchToLM32)
74extern TMPL_FAR_NM(Bs3SwitchToLM64)
75extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_rm_far)
76extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe16_far)
77extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe16_v86_far)
78extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe32_16_far)
79extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pev86_far)
80extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp16_far)
81extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp16_v86_far)
82extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp32_16_far)
83extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_ppv86_far)
84extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae16_far)
85extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae16_v86_far)
86extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae32_16_far)
87extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_paev86_far)
88extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_lm16_far)
89%else
90BS3_BEGIN_TEXT16
91extern TMPL_NM(Bs3SwitchToRM)
92extern TMPL_NM(Bs3SwitchToPE16)
93extern TMPL_NM(Bs3SwitchToPE16_32)
94extern TMPL_NM(Bs3SwitchToPE16_V86)
95extern TMPL_NM(Bs3SwitchToPE32)
96extern TMPL_NM(Bs3SwitchToPE32_16)
97extern TMPL_NM(Bs3SwitchToPEV86)
98extern TMPL_NM(Bs3SwitchToPP16)
99extern TMPL_NM(Bs3SwitchToPP16_32)
100extern TMPL_NM(Bs3SwitchToPP16_V86)
101extern TMPL_NM(Bs3SwitchToPP32)
102extern TMPL_NM(Bs3SwitchToPP32_16)
103extern TMPL_NM(Bs3SwitchToPPV86)
104extern TMPL_NM(Bs3SwitchToPAE16)
105extern TMPL_NM(Bs3SwitchToPAE16_32)
106extern TMPL_NM(Bs3SwitchToPAE16_V86)
107extern TMPL_NM(Bs3SwitchToPAE32)
108extern TMPL_NM(Bs3SwitchToPAE32_16)
109extern TMPL_NM(Bs3SwitchToPAEV86)
110extern TMPL_NM(Bs3SwitchToLM16)
111extern TMPL_NM(Bs3SwitchToLM32)
112extern TMPL_NM(Bs3SwitchToLM64)
113extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_rm)
114extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe16)
115extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe16_v86)
116extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe32_16)
117extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pev86)
118extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp16)
119extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp16_v86)
120extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp32_16)
121extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_ppv86)
122extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae16)
123extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae16_v86)
124extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae32_16)
125extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_paev86)
126extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_lm16)
127%endif
128BS3_BEGIN_TEXT16
129extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe16_32):wrt BS3FLAT
130extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe32):wrt BS3FLAT
131extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp16_32):wrt BS3FLAT
132extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp32):wrt BS3FLAT
133extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae16_32):wrt BS3FLAT
134extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae32):wrt BS3FLAT
135extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_lm32):wrt BS3FLAT
136extern RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_lm64):wrt BS3FLAT
137
138
139
140MY_BEGIN_TEXT
141
142;;
143; Shared prologue code.
144; @param xAX Where to jump to for the main event.
145;
146BS3_GLOBAL_NAME_EX TMPL_NM(bs3TestCallDoerPrologue), , 0
147 BS3_CALL_CONV_PROLOG 1
148 push xBP
149 mov xBP, xSP
150 xPUSHF
151
152 ; Save non-volatile registers so the DO function doesn't have to.
153 push xBX
154 push xCX
155 push xDX
156 push xSI
157 push xDI
158%if TMPL_BITS != 64
159 push ds
160 push es
161 push ss
162 %if TMPL_BITS != 16
163 push fs
164 push gs
165 %endif
166%endif
167%if TMPL_BITS == 64
168 push r8
169 push r9
170 push r10
171 push r11
172 push r12
173 push r13
174 push r14
175 push r15
176%endif
177
178 ; Jump to the main code.
179 jmp xAX
180
181;;
182; Shared epilogue code.
183; @param xAX Return code.
184;
185BS3_GLOBAL_NAME_EX TMPL_NM(bs3TestCallDoerEpilogue), , 0
186 ; Restore registers.
187%if TMPL_BITS == 16
188 sub bp, (1+5+3)*2
189 mov sp, bp
190%elif TMPL_BITS == 32
191 lea xSP, [xBP - (1+5+5)*4]
192%else
193 lea xSP, [xBP - (1+5+8)*8]
194 pop r15
195 pop r14
196 pop r13
197 pop r12
198 pop r11
199 pop r10
200 pop r9
201 pop r8
202%endif
203%if TMPL_BITS != 64
204 %if TMPL_BITS != 16
205 pop gs
206 pop fs
207 %endif
208 pop ss
209 pop es
210 pop ds
211%endif
212 pop xDI
213 pop xSI
214 pop xDX
215 pop xCX
216 pop xBX
217 xPOPF
218 pop xBP
219 ret
220
221;
222; For checking that the mode switching macros doesn't screw up GPRs.
223; Note! Does not work on pre 286 hardware! So, for debugging only.
224;
225%if 0
226 %macro STRICT_SAVE_REGS 0
227 movzx esp, sp
228 sub esp, BS3REGCTX_size
229 mov [esp + BS3REGCTX.rax], eax
230 mov dword [esp + BS3REGCTX.rax+4], 0xdead0000
231 mov [esp + BS3REGCTX.rcx], ecx
232 mov dword [esp + BS3REGCTX.rcx+4], 0xdead0001
233 mov [esp + BS3REGCTX.rdx], edx
234 mov dword [esp + BS3REGCTX.rdx+4], 0xdead0002
235 mov [esp + BS3REGCTX.rbx], ebx
236 mov dword [esp + BS3REGCTX.rbx+4], 0xdead0003
237 mov [esp + BS3REGCTX.rbp], ebp
238 mov [esp + BS3REGCTX.rsp], esp
239 mov [esp + BS3REGCTX.rsi], esi
240 mov [esp + BS3REGCTX.rdi], edi
241 %endmacro
242
243 %macro STRICT_CHECK_REGS 0
244%%_esp: cmp [esp + BS3REGCTX.rsp], esp
245 jne %%_esp
246%%_eax: cmp [esp + BS3REGCTX.rax], eax
247 jne %%_eax
248%%_ecx: mov [esp + BS3REGCTX.rcx], ecx
249 jne %%_ecx
250%%_edx: cmp [esp + BS3REGCTX.rdx], edx
251 jne %%_edx
252%%_ebx: cmp [esp + BS3REGCTX.rbx], ebx
253 jne %%_ebx
254%%_ebp: cmp [esp + BS3REGCTX.rbp], ebp
255 jne %%_ebp
256%%_esi: cmp [esp + BS3REGCTX.rsi], esi
257 jne %%_esi
258%%_edi: cmp [esp + BS3REGCTX.rdi], edi
259 jne %%_edi
260 add esp, BS3REGCTX_size
261 %endmacro
262%else
263
264 %macro STRICT_SAVE_REGS 0
265 %endmacro
266 %macro STRICT_CHECK_REGS 0
267 %endmacro
268%endif
269
270
271;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
272;; Real mode
273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
274
275;;
276; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInRM(uint16_t offBs3Text16);
277; @uses rax
278BS3_PROC_BEGIN_MODE Bs3TestCallDoerInRM, BS3_PBC_NEAR
279 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
280 jmp TMPL_NM(bs3TestCallDoerPrologue)
281MY_BEGIN_TEXT16
282BS3_SET_BITS TMPL_BITS
283.doit:
284 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
285 mov dx, [xBP + xCB + cbCurRetAddr + 2]
286
287 ; Mode switch, make the call, switch back.
288 STRICT_SAVE_REGS
289%if TMPL_MODE == BS3_MODE_RM
290 call far TMPL_FAR_NM(Bs3SwitchToRM)
291%else
292 call TMPL_NM(Bs3SwitchToRM)
293%endif
294 BS3_SET_BITS 16
295 STRICT_CHECK_REGS
296
297 mov cx, BS3_MODE_RM
298 push cx
299 push cs
300 mov cx, .return
301 push cx
302 push dx
303 push ax
304 retf
305.return:
306
307 STRICT_SAVE_REGS
308%if TMPL_MODE == BS3_MODE_RM
309 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_rm_far)
310%else
311 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_rm)
312%endif
313 BS3_SET_BITS TMPL_BITS
314 STRICT_CHECK_REGS
315 jmp TMPL_NM(bs3TestCallDoerEpilogue)
316MY_BEGIN_TEXT
317BS3_PROC_END_MODE Bs3TestCallDoerInRM
318
319
320;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
321;; Unpage protection mode.
322;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
323
324;;
325; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPE16(uint16_t offBs3Text16);
326; @uses rax
327BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPE16, BS3_PBC_NEAR
328 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
329 jmp TMPL_NM(bs3TestCallDoerPrologue)
330MY_BEGIN_TEXT16
331BS3_SET_BITS TMPL_BITS
332.doit:
333 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
334 mov dx, [xBP + xCB + cbCurRetAddr + 2]
335
336 ; Mode switch, make the call, switch back.
337 STRICT_SAVE_REGS
338%if TMPL_MODE == BS3_MODE_RM
339 call far TMPL_FAR_NM(Bs3SwitchToPE16)
340%else
341 call TMPL_NM(Bs3SwitchToPE16)
342%endif
343 BS3_SET_BITS 16
344 STRICT_CHECK_REGS
345
346 push BS3_MODE_PE16
347 push cs
348 push .return
349 push dx
350 push ax
351 retf
352.return:
353
354 STRICT_SAVE_REGS
355%if TMPL_MODE == BS3_MODE_RM
356 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe16_far)
357%else
358 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe16)
359%endif
360 BS3_SET_BITS TMPL_BITS
361 jmp TMPL_NM(bs3TestCallDoerEpilogue)
362MY_BEGIN_TEXT
363BS3_PROC_END_MODE Bs3TestCallDoerInPE16
364
365;;
366; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPE16_32(uint16_t offBs3Text16);
367; @uses rax
368BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPE16_32, BS3_PBC_NEAR
369 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
370 jmp TMPL_NM(bs3TestCallDoerPrologue)
371.doit:
372 mov eax, [xBP + xCB + cbCurRetAddr] ; Load function pointer.
373
374 ; Mode switch, make the call, switch back.
375 STRICT_SAVE_REGS
376%if TMPL_MODE == BS3_MODE_RM
377 call far TMPL_FAR_NM(Bs3SwitchToPE16_32)
378%else
379 call TMPL_NM(Bs3SwitchToPE16_32)
380%endif
381 BS3_SET_BITS 32
382 STRICT_CHECK_REGS
383
384 push BS3_MODE_PE16_32
385 call eax
386
387 STRICT_SAVE_REGS
388 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe16_32)
389 BS3_SET_BITS TMPL_BITS
390 STRICT_CHECK_REGS
391 jmp TMPL_NM(bs3TestCallDoerEpilogue)
392BS3_PROC_END_MODE Bs3TestCallDoerInPE16_32
393
394;;
395; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPE16_V86(uint16_t offBs3Text16);
396; @uses rax
397BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPE16_V86, BS3_PBC_NEAR
398 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
399 jmp TMPL_NM(bs3TestCallDoerPrologue)
400.doit:
401 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
402 mov dx, [xBP + xCB + cbCurRetAddr + 2]
403
404 ; Mode switch, make the call, switch back.
405 STRICT_SAVE_REGS
406%if TMPL_MODE == BS3_MODE_RM
407 call far TMPL_FAR_NM(Bs3SwitchToPE16_V86)
408%else
409 call TMPL_NM(Bs3SwitchToPE16_V86)
410%endif
411 BS3_SET_BITS 16
412 STRICT_CHECK_REGS
413
414 push BS3_MODE_PE16_V86
415 push cs
416 push .return
417 push dx
418 push ax
419 retf
420.return:
421
422 STRICT_SAVE_REGS
423%if TMPL_MODE == BS3_MODE_RM
424 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe16_v86_far)
425%else
426 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe16_v86)
427%endif
428 BS3_SET_BITS TMPL_BITS
429 STRICT_CHECK_REGS
430 jmp TMPL_NM(bs3TestCallDoerEpilogue)
431BS3_PROC_END_MODE Bs3TestCallDoerInPE16_V86
432
433;;
434; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPE32(uint16_t offBs3Text16);
435; @uses rax
436BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPE32, BS3_PBC_NEAR
437 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
438 jmp TMPL_NM(bs3TestCallDoerPrologue)
439.doit:
440 mov eax, [xBP + xCB + cbCurRetAddr] ; Load function pointer.
441
442 ; Mode switch, make the call, switch back.
443 STRICT_SAVE_REGS
444%if TMPL_MODE == BS3_MODE_RM
445 call far TMPL_FAR_NM(Bs3SwitchToPE32)
446%else
447 call TMPL_NM(Bs3SwitchToPE32)
448%endif
449 BS3_SET_BITS 32
450 STRICT_CHECK_REGS
451
452 push BS3_MODE_PE32
453 call eax
454
455 STRICT_SAVE_REGS
456 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe32)
457 BS3_SET_BITS TMPL_BITS
458 STRICT_CHECK_REGS
459 jmp TMPL_NM(bs3TestCallDoerEpilogue)
460BS3_PROC_END_MODE Bs3TestCallDoerInPE32
461
462;;
463; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPE32_16(uint16_t offBs3Text16);
464; @uses rax
465BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPE32_16, BS3_PBC_NEAR
466 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
467 jmp TMPL_NM(bs3TestCallDoerPrologue)
468MY_BEGIN_TEXT16
469BS3_SET_BITS TMPL_BITS
470.doit:
471 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
472 mov dx, [xBP + xCB + cbCurRetAddr + 2]
473
474 ; Mode switch, make the call, switch back.
475 STRICT_SAVE_REGS
476%if TMPL_MODE == BS3_MODE_RM
477 call far TMPL_FAR_NM(Bs3SwitchToPE32_16)
478%else
479 call TMPL_NM(Bs3SwitchToPE32_16)
480%endif
481 BS3_SET_BITS 16
482 STRICT_CHECK_REGS
483
484 push BS3_MODE_PE32_16
485 push cs
486 push .return
487 push dx
488 push ax
489 retf
490.return:
491
492 STRICT_SAVE_REGS
493%if TMPL_MODE == BS3_MODE_RM
494 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe32_16_far)
495%else
496 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pe32_16)
497%endif
498 BS3_SET_BITS TMPL_BITS
499 STRICT_CHECK_REGS
500 jmp TMPL_NM(bs3TestCallDoerEpilogue)
501MY_BEGIN_TEXT
502BS3_PROC_END_MODE Bs3TestCallDoerInPE32_16
503
504;;
505; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPEV86(uint16_t offBs3Text16);
506; @uses rax
507BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPEV86, BS3_PBC_NEAR
508 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
509 jmp TMPL_NM(bs3TestCallDoerPrologue)
510MY_BEGIN_TEXT16
511BS3_SET_BITS TMPL_BITS
512.doit:
513 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
514 mov dx, [xBP + xCB + cbCurRetAddr + 2]
515
516 ; Mode switch, make the call, switch back.
517 STRICT_SAVE_REGS
518%if TMPL_MODE == BS3_MODE_RM
519 call far TMPL_FAR_NM(Bs3SwitchToPEV86)
520%else
521 call TMPL_NM(Bs3SwitchToPEV86)
522%endif
523 BS3_SET_BITS 16
524 STRICT_CHECK_REGS
525
526 push BS3_MODE_PEV86
527 push cs
528 push .return
529 push dx
530 push ax
531 retf
532.return:
533
534 STRICT_SAVE_REGS
535%if TMPL_MODE == BS3_MODE_RM
536 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pev86_far)
537%else
538 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pev86)
539%endif
540 BS3_SET_BITS TMPL_BITS
541 STRICT_CHECK_REGS
542 jmp TMPL_NM(bs3TestCallDoerEpilogue)
543MY_BEGIN_TEXT
544BS3_PROC_END_MODE Bs3TestCallDoerInPEV86
545
546
547
548;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
549;; Page protection mode.
550;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
551
552;;
553; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPP16(uint16_t offBs3Text16);
554; @uses rax
555BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPP16, BS3_PBC_NEAR
556 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
557 jmp TMPL_NM(bs3TestCallDoerPrologue)
558MY_BEGIN_TEXT16
559BS3_SET_BITS TMPL_BITS
560.doit:
561 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
562 mov dx, [xBP + xCB + cbCurRetAddr + 2]
563
564 ; Mode switch, make the call, switch back.
565 STRICT_SAVE_REGS
566%if TMPL_MODE == BS3_MODE_RM
567 call far TMPL_FAR_NM(Bs3SwitchToPP16)
568%else
569 call TMPL_NM(Bs3SwitchToPP16)
570%endif
571 BS3_SET_BITS 16
572 STRICT_CHECK_REGS
573
574 push BS3_MODE_PP16
575 push cs
576 push .return
577 push dx
578 push ax
579 retf
580.return:
581
582 STRICT_SAVE_REGS
583%if TMPL_MODE == BS3_MODE_RM
584 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp16_far)
585%else
586 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp16)
587%endif
588 BS3_SET_BITS TMPL_BITS
589 STRICT_CHECK_REGS
590 jmp TMPL_NM(bs3TestCallDoerEpilogue)
591MY_BEGIN_TEXT
592BS3_PROC_END_MODE Bs3TestCallDoerInPP16
593
594;;
595; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPP16_32(uint16_t offBs3Text16);
596; @uses rax
597BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPP16_32, BS3_PBC_NEAR
598 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
599 jmp TMPL_NM(bs3TestCallDoerPrologue)
600.doit:
601 mov eax, [xBP + xCB + cbCurRetAddr] ; Load function pointer.
602
603 ; Mode switch, make the call, switch back.
604 STRICT_SAVE_REGS
605%if TMPL_MODE == BS3_MODE_RM
606 call far TMPL_FAR_NM(Bs3SwitchToPP16_32)
607%else
608 call TMPL_NM(Bs3SwitchToPP16_32)
609%endif
610 BS3_SET_BITS 32
611 STRICT_CHECK_REGS
612
613 push BS3_MODE_PP16_32
614 call eax
615
616 STRICT_SAVE_REGS
617 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp16_32)
618 BS3_SET_BITS TMPL_BITS
619 STRICT_CHECK_REGS
620 jmp TMPL_NM(bs3TestCallDoerEpilogue)
621BS3_PROC_END_MODE Bs3TestCallDoerInPP16_32
622
623;;
624; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPP16_V86(uint16_t offBs3Text16);
625; @uses rax
626BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPP16_V86, BS3_PBC_NEAR
627 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
628 jmp TMPL_NM(bs3TestCallDoerPrologue)
629.doit:
630 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
631 mov dx, [xBP + xCB + cbCurRetAddr + 2]
632
633 ; Mode switch, make the call, switch back.
634 STRICT_SAVE_REGS
635%if TMPL_MODE == BS3_MODE_RM
636 call far TMPL_FAR_NM(Bs3SwitchToPP16_V86)
637%else
638 call TMPL_NM(Bs3SwitchToPP16_V86)
639%endif
640 BS3_SET_BITS 16
641 STRICT_CHECK_REGS
642
643 push BS3_MODE_PP16_V86
644 push cs
645 push .return
646 push dx
647 push ax
648 retf
649.return:
650
651 STRICT_SAVE_REGS
652%if TMPL_MODE == BS3_MODE_RM
653 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp16_v86_far)
654%else
655 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp16_v86)
656%endif
657 BS3_SET_BITS TMPL_BITS
658 STRICT_CHECK_REGS
659 jmp TMPL_NM(bs3TestCallDoerEpilogue)
660BS3_PROC_END_MODE Bs3TestCallDoerInPP16_V86
661
662;;
663; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPP32(uint16_t offBs3Text16);
664; @uses rax
665BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPP32, BS3_PBC_NEAR
666 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
667 jmp TMPL_NM(bs3TestCallDoerPrologue)
668.doit:
669 mov eax, [xBP + xCB + cbCurRetAddr] ; Load function pointer.
670
671 ; Mode switch, make the call, switch back.
672 STRICT_SAVE_REGS
673%if TMPL_MODE == BS3_MODE_RM
674 call far TMPL_FAR_NM(Bs3SwitchToPP32)
675%else
676 call TMPL_NM(Bs3SwitchToPP32)
677%endif
678 BS3_SET_BITS 32
679 STRICT_CHECK_REGS
680
681 push BS3_MODE_PP32
682 call eax
683
684 STRICT_SAVE_REGS
685 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp32)
686 BS3_SET_BITS TMPL_BITS
687 STRICT_CHECK_REGS
688 jmp TMPL_NM(bs3TestCallDoerEpilogue)
689BS3_PROC_END_MODE Bs3TestCallDoerInPP32
690
691;;
692; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPP32_16(uint16_t offBs3Text16);
693; @uses rax
694BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPP32_16, BS3_PBC_NEAR
695 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
696 jmp TMPL_NM(bs3TestCallDoerPrologue)
697MY_BEGIN_TEXT16
698BS3_SET_BITS TMPL_BITS
699.doit:
700 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
701 mov dx, [xBP + xCB + cbCurRetAddr + 2]
702
703 ; Mode switch, make the call, switch back.
704 STRICT_SAVE_REGS
705%if TMPL_MODE == BS3_MODE_RM
706 call far TMPL_FAR_NM(Bs3SwitchToPP32_16)
707%else
708 call TMPL_NM(Bs3SwitchToPP32_16)
709%endif
710 BS3_SET_BITS 16
711 STRICT_CHECK_REGS
712
713 push BS3_MODE_PP32_16
714 push cs
715 push .return
716 push dx
717 push ax
718 retf
719.return:
720
721 STRICT_SAVE_REGS
722%if TMPL_MODE == BS3_MODE_RM
723 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp32_16_far)
724%else
725 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pp32_16)
726%endif
727 BS3_SET_BITS TMPL_BITS
728 STRICT_CHECK_REGS
729 jmp TMPL_NM(bs3TestCallDoerEpilogue)
730MY_BEGIN_TEXT
731BS3_PROC_END_MODE Bs3TestCallDoerInPP32_16
732
733;;
734; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPPV86(uint16_t offBs3Text16);
735; @uses rax
736BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPPV86, BS3_PBC_NEAR
737 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
738 jmp TMPL_NM(bs3TestCallDoerPrologue)
739MY_BEGIN_TEXT16
740BS3_SET_BITS TMPL_BITS
741.doit:
742 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
743 mov dx, [xBP + xCB + cbCurRetAddr + 2]
744
745 ; Mode switch, make the call, switch back.
746 STRICT_SAVE_REGS
747%if TMPL_MODE == BS3_MODE_RM
748 call far TMPL_FAR_NM(Bs3SwitchToPPV86)
749%else
750 call TMPL_NM(Bs3SwitchToPPV86)
751%endif
752 BS3_SET_BITS 16
753 STRICT_CHECK_REGS
754
755 push BS3_MODE_PPV86
756 push cs
757 push .return
758 push dx
759 push ax
760 retf
761.return:
762
763 STRICT_SAVE_REGS
764%if TMPL_MODE == BS3_MODE_RM
765 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_ppv86_far)
766%else
767 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_ppv86)
768%endif
769 BS3_SET_BITS TMPL_BITS
770 STRICT_CHECK_REGS
771 jmp TMPL_NM(bs3TestCallDoerEpilogue)
772MY_BEGIN_TEXT
773BS3_PROC_END_MODE Bs3TestCallDoerInPPV86
774
775
776
777;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
778;; PAE paged protection mode.
779;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
780
781;;
782; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPAE16(uint16_t offBs3Text16);
783; @uses rax
784BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPAE16, BS3_PBC_NEAR
785 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
786 jmp TMPL_NM(bs3TestCallDoerPrologue)
787MY_BEGIN_TEXT16
788BS3_SET_BITS TMPL_BITS
789.doit:
790 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
791 mov dx, [xBP + xCB + cbCurRetAddr + 2]
792
793 ; Mode switch, make the call, switch back.
794 STRICT_SAVE_REGS
795%if TMPL_MODE == BS3_MODE_RM
796 call far TMPL_FAR_NM(Bs3SwitchToPAE16)
797%else
798 call TMPL_NM(Bs3SwitchToPAE16)
799%endif
800 BS3_SET_BITS 16
801 STRICT_CHECK_REGS
802
803 push BS3_MODE_PAE16
804 push cs
805 push .return
806 push dx
807 push ax
808 retf
809.return:
810
811 STRICT_SAVE_REGS
812%if TMPL_MODE == BS3_MODE_RM
813 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae16_far)
814%else
815 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae16)
816%endif
817 BS3_SET_BITS TMPL_BITS
818 STRICT_CHECK_REGS
819 jmp TMPL_NM(bs3TestCallDoerEpilogue)
820MY_BEGIN_TEXT
821BS3_PROC_END_MODE Bs3TestCallDoerInPAE16
822
823;;
824; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPAE16_32(uint16_t offBs3Text16);
825; @uses rax
826BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPAE16_32, BS3_PBC_NEAR
827 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
828 jmp TMPL_NM(bs3TestCallDoerPrologue)
829.doit:
830 mov eax, [xBP + xCB + cbCurRetAddr] ; Load function pointer.
831
832 ; Mode switch, make the call, switch back.
833 STRICT_SAVE_REGS
834%if TMPL_MODE == BS3_MODE_RM
835 call far TMPL_FAR_NM(Bs3SwitchToPAE16_32)
836%else
837 call TMPL_NM(Bs3SwitchToPAE16_32)
838%endif
839 BS3_SET_BITS 32
840 STRICT_CHECK_REGS
841
842 push BS3_MODE_PAE16_32
843 call eax
844
845 STRICT_SAVE_REGS
846 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae16_32)
847 BS3_SET_BITS TMPL_BITS
848 STRICT_CHECK_REGS
849 jmp TMPL_NM(bs3TestCallDoerEpilogue)
850BS3_PROC_END_MODE Bs3TestCallDoerInPAE16_32
851
852;;
853; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPAE16_V86(uint16_t offBs3Text16);
854; @uses rax
855BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPAE16_V86, BS3_PBC_NEAR
856 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
857 jmp TMPL_NM(bs3TestCallDoerPrologue)
858.doit:
859 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
860 mov dx, [xBP + xCB + cbCurRetAddr + 2]
861
862 ; Mode switch, make the call, switch back.
863 STRICT_SAVE_REGS
864%if TMPL_MODE == BS3_MODE_RM
865 call far TMPL_FAR_NM(Bs3SwitchToPAE16_V86)
866%else
867 call TMPL_NM(Bs3SwitchToPAE16_V86)
868%endif
869 BS3_SET_BITS 16
870 STRICT_CHECK_REGS
871
872 push BS3_MODE_PAE16_V86
873 push cs
874 push .return
875 push dx
876 push ax
877 retf
878.return:
879
880 STRICT_SAVE_REGS
881%if TMPL_MODE == BS3_MODE_RM
882 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae16_v86_far)
883%else
884 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae16_v86)
885%endif
886 BS3_SET_BITS TMPL_BITS
887 STRICT_CHECK_REGS
888 jmp TMPL_NM(bs3TestCallDoerEpilogue)
889BS3_PROC_END_MODE Bs3TestCallDoerInPAE16_V86
890
891;;
892; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPAE32(uint16_t offBs3Text16);
893; @uses rax
894BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPAE32, BS3_PBC_NEAR
895 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
896 jmp TMPL_NM(bs3TestCallDoerPrologue)
897.doit:
898 mov eax, [xBP + xCB + cbCurRetAddr] ; Load function pointer.
899
900 ; Mode switch, make the call, switch back.
901 STRICT_SAVE_REGS
902%if TMPL_MODE == BS3_MODE_RM
903 call far TMPL_FAR_NM(Bs3SwitchToPAE32)
904%else
905 call TMPL_NM(Bs3SwitchToPAE32)
906%endif
907 BS3_SET_BITS 32
908 STRICT_CHECK_REGS
909
910 push BS3_MODE_PAE32
911 call eax
912
913 STRICT_SAVE_REGS
914 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae32)
915 BS3_SET_BITS TMPL_BITS
916 STRICT_CHECK_REGS
917 jmp TMPL_NM(bs3TestCallDoerEpilogue)
918BS3_PROC_END_MODE Bs3TestCallDoerInPAE32
919
920;;
921; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPAE32_16(uint16_t offBs3Text16);
922; @uses rax
923BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPAE32_16, BS3_PBC_NEAR
924 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
925 jmp TMPL_NM(bs3TestCallDoerPrologue)
926MY_BEGIN_TEXT16
927BS3_SET_BITS TMPL_BITS
928.doit:
929 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
930 mov dx, [xBP + xCB + cbCurRetAddr + 2]
931
932 ; Mode switch, make the call, switch back.
933 STRICT_SAVE_REGS
934%if TMPL_MODE == BS3_MODE_RM
935 call far TMPL_FAR_NM(Bs3SwitchToPAE32_16)
936%else
937 call TMPL_NM(Bs3SwitchToPAE32_16)
938%endif
939 BS3_SET_BITS 16
940 STRICT_CHECK_REGS
941
942 push BS3_MODE_PAE32_16
943 push cs
944 push .return
945 push dx
946 push ax
947 retf
948.return:
949
950 STRICT_SAVE_REGS
951%if TMPL_MODE == BS3_MODE_RM
952 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae32_16_far)
953%else
954 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_pae32_16)
955%endif
956 BS3_SET_BITS TMPL_BITS
957 STRICT_CHECK_REGS
958 jmp TMPL_NM(bs3TestCallDoerEpilogue)
959MY_BEGIN_TEXT
960BS3_PROC_END_MODE Bs3TestCallDoerInPAE32_16
961
962;;
963; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInPAEV86(uint16_t offBs3Text16);
964; @uses rax
965BS3_PROC_BEGIN_MODE Bs3TestCallDoerInPAEV86, BS3_PBC_NEAR
966 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
967 jmp TMPL_NM(bs3TestCallDoerPrologue)
968MY_BEGIN_TEXT16
969BS3_SET_BITS TMPL_BITS
970.doit:
971 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
972 mov dx, [xBP + xCB + cbCurRetAddr + 2]
973
974 ; Mode switch, make the call, switch back.
975 STRICT_SAVE_REGS
976%if TMPL_MODE == BS3_MODE_RM
977 call far TMPL_FAR_NM(Bs3SwitchToPAEV86)
978%else
979 call TMPL_NM(Bs3SwitchToPAEV86)
980%endif
981 BS3_SET_BITS 16
982 STRICT_CHECK_REGS
983
984 push BS3_MODE_PAEV86
985 push cs
986 push .return
987 push dx
988 push ax
989 retf
990.return:
991
992 STRICT_SAVE_REGS
993%if TMPL_MODE == BS3_MODE_RM
994 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_paev86_far)
995%else
996 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_paev86)
997%endif
998 BS3_SET_BITS TMPL_BITS
999 STRICT_CHECK_REGS
1000 jmp TMPL_NM(bs3TestCallDoerEpilogue)
1001MY_BEGIN_TEXT
1002BS3_PROC_END_MODE Bs3TestCallDoerInPAEV86
1003
1004
1005
1006;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1007;; Long mode
1008;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1009
1010;;
1011; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInLM16(uint16_t offBs3Text16);
1012; @uses rax
1013BS3_PROC_BEGIN_MODE Bs3TestCallDoerInLM16, BS3_PBC_NEAR
1014 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
1015 jmp TMPL_NM(bs3TestCallDoerPrologue)
1016MY_BEGIN_TEXT16
1017BS3_SET_BITS TMPL_BITS
1018.doit:
1019 mov ax, [xBP + xCB + cbCurRetAddr] ; Load far function pointer.
1020 mov dx, [xBP + xCB + cbCurRetAddr + 2]
1021
1022 ; Mode switch, make the call, switch back.
1023 STRICT_SAVE_REGS
1024%if TMPL_MODE == BS3_MODE_RM
1025 call far TMPL_FAR_NM(Bs3SwitchToLM16)
1026%else
1027 call TMPL_NM(Bs3SwitchToLM16)
1028%endif
1029 BS3_SET_BITS 16
1030 STRICT_CHECK_REGS
1031
1032 push BS3_MODE_LM16
1033 push cs
1034 push .return
1035 push dx
1036 push ax
1037 retf
1038.return:
1039
1040 STRICT_SAVE_REGS
1041%if TMPL_MODE == BS3_MODE_RM
1042 call far RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_lm16_far)
1043%else
1044 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_lm16)
1045%endif
1046 BS3_SET_BITS TMPL_BITS
1047 STRICT_CHECK_REGS
1048 jmp TMPL_NM(bs3TestCallDoerEpilogue)
1049MY_BEGIN_TEXT
1050BS3_PROC_END_MODE Bs3TestCallDoerInLM16
1051
1052;;
1053; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInLM32(uint16_t offBs3Text16);
1054; @uses rax
1055BS3_PROC_BEGIN_MODE Bs3TestCallDoerInLM32, BS3_PBC_NEAR
1056 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
1057 jmp TMPL_NM(bs3TestCallDoerPrologue)
1058.doit:
1059 mov eax, [xBP + xCB + cbCurRetAddr] ; Load function pointer.
1060
1061 ; Mode switch, make the call, switch back.
1062 STRICT_SAVE_REGS
1063%if TMPL_MODE == BS3_MODE_RM
1064 call far TMPL_FAR_NM(Bs3SwitchToLM32)
1065%else
1066 call TMPL_NM(Bs3SwitchToLM32)
1067%endif
1068 BS3_SET_BITS 32
1069 STRICT_CHECK_REGS
1070
1071 and esp, ~03h
1072 push BS3_MODE_LM32
1073 call eax
1074
1075 STRICT_SAVE_REGS
1076 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_lm32)
1077 BS3_SET_BITS TMPL_BITS
1078 STRICT_CHECK_REGS
1079 jmp TMPL_NM(bs3TestCallDoerEpilogue)
1080BS3_PROC_END_MODE Bs3TestCallDoerInLM32
1081
1082;;
1083; @cproto BS3_DECL(uint8_t) Bs3TestCallDoerInLM64(uint16_t offBs3Text16);
1084; @uses rax
1085BS3_PROC_BEGIN_MODE Bs3TestCallDoerInLM64, BS3_PBC_NEAR
1086 BS3_LEA_MOV_WRT_RIP(xAX, .doit)
1087 jmp TMPL_NM(bs3TestCallDoerPrologue)
1088.doit:
1089 mov eax, [xBP + xCB + cbCurRetAddr] ; Load function pointer.
1090
1091 ; Mode switch, make the call, switch back.
1092 STRICT_SAVE_REGS
1093%if TMPL_MODE == BS3_MODE_RM
1094 call far TMPL_FAR_NM(Bs3SwitchToLM64)
1095%else
1096 call TMPL_NM(Bs3SwitchToLM64)
1097%endif
1098 BS3_SET_BITS 64
1099 STRICT_CHECK_REGS
1100
1101 and rsp, ~0fh
1102 sub rsp, 18h
1103 push BS3_MODE_LM64
1104 BS3_CALL rax, 1
1105
1106 STRICT_SAVE_REGS
1107 call RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_Safe_lm64)
1108 BS3_SET_BITS TMPL_BITS
1109 STRICT_CHECK_REGS
1110 jmp TMPL_NM(bs3TestCallDoerEpilogue)
1111BS3_PROC_END_MODE Bs3TestCallDoerInLM64
1112
1113
1114;
1115; Finally near stub for the API call (16-bit only).
1116;
1117%if TMPL_BITS == 16
1118BS3_BEGIN_TEXT16_NEARSTUBS
1119BS3_PROC_BEGIN_MODE Bs3TestDoModes, BS3_PBC_NEAR
1120 pop ax
1121 %if TMPL_MODE == BS3_MODE_RM
1122 push cs
1123 push ax
1124 extern TMPL_FAR_NM(Bs3TestDoModes):wrt BS3GROUPRMTEXT16
1125 jmp far TMPL_FAR_NM(Bs3TestDoModes)
1126 %else
1127 push cs
1128 push ax
1129 extern TMPL_FAR_NM(Bs3TestDoModes):wrt CGROUP16
1130 jmp TMPL_NM(Bs3TestDoModes)
1131 %endif
1132BS3_PROC_END_MODE Bs3TestDoModes
1133
1134%endif
1135
Note: See TracBrowser for help on using the repository browser.

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