1 | /* $Id: bs3kit-docs.c 82968 2020-02-04 10:35:17Z vboxsync $ */
|
---|
2 | /** @file
|
---|
3 | * BS3Kit - Documentation.
|
---|
4 | */
|
---|
5 |
|
---|
6 | /*
|
---|
7 | * Copyright (C) 2007-2020 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 |
|
---|
29 | /** @page pg_bs3kit BS3Kit - Boot Sector Kit \#3
|
---|
30 | *
|
---|
31 | * The BS3Kit is a framework for bare metal floppy/usb image tests.
|
---|
32 | *
|
---|
33 | * The 3rd iteration of the framework includes support for 16-bit and 32-bit
|
---|
34 | * C/C++ code, with provisions for 64-bit C code to possibly be added later.
|
---|
35 | * The C code have to do without a runtime library, otherwhat what we can share
|
---|
36 | * possibly with IPRT.
|
---|
37 | *
|
---|
38 | * This iteration also adds a real linker into the picture, which is an
|
---|
39 | * improvment over early when all had to done in a single assembler run with
|
---|
40 | * lots of includes and macros controlling what we needed. The functions are no
|
---|
41 | * in separate files and compiled/assembled into libraries, so the linker will
|
---|
42 | * only include exactly what is needed. The current linker is the OpenWatcom
|
---|
43 | * one, wlink, that we're already using when building the BIOSes. If it wasn't
|
---|
44 | * for the segment/selector fixups in 16-bit code (mostly), maybe we could
|
---|
45 | * convince the ELF linker from GNU binutils to do the job too (with help from
|
---|
46 | * the ).
|
---|
47 | *
|
---|
48 | *
|
---|
49 | * @sa grp_bs3kit, grp_bs3kit_tmpl, grp_bs3kit_cmn, grp_bs3kit_mode,
|
---|
50 | * grp_bs3kit_system
|
---|
51 | *
|
---|
52 | * @section sec_calling_convention Calling convention
|
---|
53 | *
|
---|
54 | * Because we're not mixing with C code, we will use __cdecl for 16-bit and
|
---|
55 | * 32-bit code, where as 64-bit code will use the microsoft calling AMD64
|
---|
56 | * convention. To avoid unnecessary %ifdef'ing in assembly code, we will use a
|
---|
57 | * macro to load the RCX, RDX, R8 and R9 registers off the stack in 64-bit
|
---|
58 | * assembly code.
|
---|
59 | *
|
---|
60 | * Register treatment in 16-bit __cdecl, 32-bit __cdecl and 64-bit msabi:
|
---|
61 | *
|
---|
62 | * | Register | 16-bit | 32-bit | 64-bit | ASM template |
|
---|
63 | * | ------------ | ----------- | ---------- | --------------- | ------------ |
|
---|
64 | * | EAX, RAX | volatile | volatile | volatile | volatile |
|
---|
65 | * | EBX, RBX | volatile | preserved | preserved | both |
|
---|
66 | * | ECX, RCX | volatile | volatile | volatile, arg 0 | volatile |
|
---|
67 | * | EDX, RDX | volatile | volatile | volatile, arg 1 | volatile |
|
---|
68 | * | ESP, RSP | preserved | preserved | preserved | preserved |
|
---|
69 | * | EBP, RBP | preserved | preserved | preserved | preserved |
|
---|
70 | * | EDI, RDI | preserved | preserved | preserved | preserved |
|
---|
71 | * | ESI, RSI | preserved | preserved | preserved | preserved |
|
---|
72 | * | R8 | volatile | volatile | volatile, arg 2 | volatile |
|
---|
73 | * | R9 | volatile | volatile | volatile, arg 3 | volatile |
|
---|
74 | * | R10 | volatile | volatile | volatile | volatile |
|
---|
75 | * | R11 | volatile | volatile | volatile | volatile |
|
---|
76 | * | R12 | volatile | volatile | preserved | preserved(*) |
|
---|
77 | * | R13 | volatile | volatile | preserved | preserved(*) |
|
---|
78 | * | R14 | volatile | volatile | preserved | preserved(*) |
|
---|
79 | * | R15 | volatile | volatile | preserved | preserved(*) |
|
---|
80 | * | RFLAGS.DF | =0 | =0 | =0 | =0 |
|
---|
81 | * | CS | preserved | preserved | preserved | preserved |
|
---|
82 | * | DS | preserved! | preserved? | preserved | both |
|
---|
83 | * | ES | volatile | volatile | preserved | volatile |
|
---|
84 | * | FS | preserved | preserved | preserved | preserved |
|
---|
85 | * | GS | preserved | volatile | preserved | both |
|
---|
86 | * | SS | preserved | preserved | preserved | preserved |
|
---|
87 | *
|
---|
88 | * The 'both' here means that we preserve it wrt to our caller, while at the
|
---|
89 | * same time assuming anything we call will clobber it.
|
---|
90 | *
|
---|
91 | * The 'preserved(*)' marking of R12-R15 indicates that they'll be preserved in
|
---|
92 | * 64-bit mode, but may be changed in certain cases when running 32-bit or
|
---|
93 | * 16-bit code. This is especially true if switching CPU mode, e.g. from 32-bit
|
---|
94 | * protected mode to 32-bit long mode.
|
---|
95 | *
|
---|
96 | * Return values are returned in the xAX register, but with the following
|
---|
97 | * caveats for values larger than ARCH_BITS:
|
---|
98 | * - 16-bit code:
|
---|
99 | * - 32-bit values are returned in AX:DX, where AX holds bits 15:0 and
|
---|
100 | * DX bits 31:16.
|
---|
101 | * - 64-bit values are returned in DX:CX:BX:AX, where DX holds bits
|
---|
102 | * 15:0, CX bits 31:16, BX bits 47:32, and AX bits 63:48.
|
---|
103 | * - 32-bit code:
|
---|
104 | * - 64-bit values are returned in EAX:EDX, where eax holds the least
|
---|
105 | * significant bits.
|
---|
106 | *
|
---|
107 | * The DS segment register is pegged to BS3DATA16_GROUP in 16-bit code so that
|
---|
108 | * we don't need to reload it all the time. This allows us to modify it in
|
---|
109 | * ring-0 and mode switching code without ending up in any serious RPL or DPL
|
---|
110 | * trouble. In 32-bit and 64-bit mode the DS register is a flat, unlimited,
|
---|
111 | * writable selector.
|
---|
112 | *
|
---|
113 | * In 16-bit and 32-bit code we do not assume anything about ES, FS, and GS.
|
---|
114 | *
|
---|
115 | *
|
---|
116 | * For an in depth coverage of x86 and AMD64 calling convensions, see
|
---|
117 | * http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/function-calling-conventions.html
|
---|
118 | *
|
---|
119 | *
|
---|
120 | *
|
---|
121 | * @section sec_modes Execution Modes
|
---|
122 | *
|
---|
123 | * BS3Kit defines a number of execution modes in order to be able to test the
|
---|
124 | * full CPU capabilities (that VirtualBox care about anyways). It currently
|
---|
125 | * omits system management mode, hardware virtualization modes, and security
|
---|
126 | * modes as those aren't supported by VirtualBox or are difficult to handle.
|
---|
127 | *
|
---|
128 | * The modes are categorized into normal and weird ones.
|
---|
129 | *
|
---|
130 | * The normal ones are:
|
---|
131 | * + RM - Real mode.
|
---|
132 | * + PE16 - Protected mode running 16-bit code, 16-bit TSS and 16-bit handlers.
|
---|
133 | * + PE32 - Protected mode running 32-bit code, 32-bit TSS and 32-bit handlers.
|
---|
134 | * + PEV86 - Protected mode running v8086 code, 32-bit TSS and 32-bit handlers.
|
---|
135 | * + PP16 - 386 paged mode running 16-bit code, 16-bit TSS and 16-bit handlers.
|
---|
136 | * + PP32 - 386 paged mode running 32-bit code, 32-bit TSS and 32-bit handlers.
|
---|
137 | * + PPV86 - 386 paged mode running v8086 code, 32-bit TSS and 32-bit handlers.
|
---|
138 | * + PAE16 - PAE paged mode running 16-bit code, 16-bit TSS and 16-bit handlers.
|
---|
139 | * + PAE32 - PAE paged mode running 32-bit code, 32-bit TSS and 32-bit handlers.
|
---|
140 | * + PAEV86 - PAE paged mode running v8086 code, 32-bit TSS and 32-bit handlers.
|
---|
141 | * + LM16 - AMD64 long mode running 16-bit code, 64-bit TSS and 64-bit handlers.
|
---|
142 | * + LM32 - AMD64 long mode running 32-bit code, 64-bit TSS and 64-bit handlers.
|
---|
143 | * + LM64 - AMD64 long mode running 64-bit code, 64-bit TSS and 64-bit handlers.
|
---|
144 | *
|
---|
145 | * The weird ones:
|
---|
146 | * + PE16_32 - Protected mode running 16-bit code, 16-bit TSS and 16-bit handlers.
|
---|
147 | * + PE16_V86 - Protected mode running 16-bit code, 16-bit TSS and 16-bit handlers.
|
---|
148 | * + PE32_16 - Protected mode running 32-bit code, 32-bit TSS and 32-bit handlers.
|
---|
149 | * + PP16_32 - 386 paged mode running 16-bit code, 16-bit TSS and 16-bit handlers.
|
---|
150 | * + PP16_V86 - 386 paged mode running 16-bit code, 16-bit TSS and 16-bit handlers.
|
---|
151 | * + PP32_16 - 386 paged mode running 32-bit code, 32-bit TSS and 32-bit handlers.
|
---|
152 | * + PAE16_32 - PAE paged mode running 16-bit code, 16-bit TSS and 16-bit handlers.
|
---|
153 | * + PAE16_V86 - PAE paged mode running 16-bit code, 16-bit TSS and 16-bit handlers.
|
---|
154 | * + PAE32_16 - PAE paged mode running 32-bit code, 32-bit TSS and 32-bit handlers.
|
---|
155 | *
|
---|
156 | * Actually, the PE32_16, PP32_16 and PAE32_16 modes aren't all that weird and fits in
|
---|
157 | * right next to LM16 and LM32, but this is the way it ended up. :-)
|
---|
158 | *
|
---|
159 | */
|
---|
160 |
|
---|