mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 08:24:32 -08:00
Compare commits
294 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd73cf833f | ||
|
|
71fe3d733b | ||
|
|
991b13424e | ||
|
|
6963304c01 | ||
|
|
ae651a4fcd | ||
|
|
17c2fe6e4e | ||
|
|
f066ac3ffd | ||
|
|
edcf633e84 | ||
|
|
d09a454b8b | ||
|
|
d6329ea9bf | ||
|
|
83897048ab | ||
|
|
7cc59770b8 | ||
|
|
b056d95920 | ||
|
|
19cd01ef8d | ||
|
|
b3f88bbe02 | ||
|
|
f57f38edbd | ||
|
|
12377ae730 | ||
|
|
bb93dcef44 | ||
|
|
678a12dc90 | ||
|
|
c3dacb2906 | ||
|
|
3a68ec439d | ||
|
|
7ce418aabc | ||
|
|
8ee5091f41 | ||
|
|
6285517ef7 | ||
|
|
2b0cd6f2f2 | ||
|
|
a653c55941 | ||
|
|
ce035d2a43 | ||
|
|
2d54eb5143 | ||
|
|
b9c8edb657 | ||
|
|
88315c25a5 | ||
|
|
806bfd1fbf | ||
|
|
910b5116f4 | ||
|
|
6302e8b73a | ||
|
|
fd1adc0262 | ||
|
|
070be0b005 | ||
|
|
5034ffbe59 | ||
|
|
cd13b88540 | ||
|
|
e050d6f151 | ||
|
|
863555ec6b | ||
|
|
c605793a9d | ||
|
|
8375870af6 | ||
|
|
11a53e792f | ||
|
|
ca2362f858 | ||
|
|
5cdbedd4d1 | ||
|
|
ee6d69bcd2 | ||
|
|
f9193b4602 | ||
|
|
979e5f036e | ||
|
|
39baec852b | ||
|
|
ed3f9410a6 | ||
|
|
b18243f098 | ||
|
|
9472dab522 | ||
|
|
9067f8d298 | ||
|
|
866073ae8a | ||
|
|
91cb00fde2 | ||
|
|
c435bcfb67 | ||
|
|
7fe1b7d1f5 | ||
|
|
39524b2b9f | ||
|
|
c592f5f537 | ||
|
|
94c491d286 | ||
|
|
645938a194 | ||
|
|
73756820bd | ||
|
|
33374ab257 | ||
|
|
bf8286d15f | ||
|
|
6410c898c5 | ||
|
|
be007c6278 | ||
|
|
f7558e3d18 | ||
|
|
97e8f2c69a | ||
|
|
49bdf47514 | ||
|
|
81162f30dc | ||
|
|
4379256c11 | ||
|
|
870ca1db45 | ||
|
|
74a5c301f8 | ||
|
|
2955e6c9c1 | ||
|
|
cd2ccb4e06 | ||
|
|
722ee4c52c | ||
|
|
67b9f45004 | ||
|
|
2035fffa1c | ||
|
|
97ac3c09fa | ||
|
|
241e1dacb0 | ||
|
|
ac19d3f532 | ||
|
|
194527e0fe | ||
|
|
28cf5562ac | ||
|
|
8cdc39fdee | ||
|
|
626eec4a31 | ||
|
|
5901237fee | ||
|
|
24316ca0c4 | ||
|
|
f9d964cccb | ||
|
|
a9ac30b991 | ||
|
|
61df9cf32c | ||
|
|
bbd31929ba | ||
|
|
ec20e9f3d9 | ||
|
|
3bcd83f5a3 | ||
|
|
341ba5146a | ||
|
|
83b37ef536 | ||
|
|
1965197ccd | ||
|
|
29747f4891 | ||
|
|
aca442ee87 | ||
|
|
8e85ae5318 | ||
|
|
8c32471e0d | ||
|
|
79711be46a | ||
|
|
863e5bda15 | ||
|
|
d19cedb12a | ||
|
|
f2d39f7df8 | ||
|
|
579f6f64e6 | ||
|
|
a71af1be96 | ||
|
|
237c242f96 | ||
|
|
c4dc52c06c | ||
|
|
e1d8dd3124 | ||
|
|
38a1197d9e | ||
|
|
bc01a37452 | ||
|
|
acdca19f59 | ||
|
|
a1fe745a53 | ||
|
|
73df20d195 | ||
|
|
7e1933d79b | ||
|
|
8d23fac6cc | ||
|
|
0f8efdb55e | ||
|
|
523d0b3b8c | ||
|
|
591ca7c83c | ||
|
|
dffdcc095d | ||
|
|
229c1e4965 | ||
|
|
d8399e3c07 | ||
|
|
f1bb3556eb | ||
|
|
cef0a71bce | ||
|
|
a9d72b8102 | ||
|
|
d469482a7f | ||
|
|
c67c1bd6a2 | ||
|
|
5e6769036c | ||
|
|
482b9f50fc | ||
|
|
f4e7eaeb40 | ||
|
|
8c2ff33c40 | ||
|
|
1308864061 | ||
|
|
62c559043d | ||
|
|
c2f85ce61b | ||
|
|
5808599005 | ||
|
|
fafe582802 | ||
|
|
593cda3ee8 | ||
|
|
d5c44645eb | ||
|
|
e7a509176d | ||
|
|
3a39d9440a | ||
|
|
cabfec3f1e | ||
|
|
956efabd8f | ||
|
|
f146a96298 | ||
|
|
585abe9a18 | ||
|
|
3d0b262435 | ||
|
|
3f264b4490 | ||
|
|
1758ee4215 | ||
|
|
dc40c2f6ad | ||
|
|
2fb92e8592 | ||
|
|
57829e1b79 | ||
|
|
bc26d7d01d | ||
|
|
b93519e06f | ||
|
|
5d861d243a | ||
|
|
f1b84ab370 | ||
|
|
d5b8902d8f | ||
|
|
799fbbdd10 | ||
|
|
d33f1bc6f2 | ||
|
|
28a90e550e | ||
|
|
647801f096 | ||
|
|
1664566bd2 | ||
|
|
cd09c17d71 | ||
|
|
f74f3f03d1 | ||
|
|
23006b2b43 | ||
|
|
7f69a6c9b1 | ||
|
|
1726d10554 | ||
|
|
757bc21550 | ||
|
|
e187679f93 | ||
|
|
2597e2002b | ||
|
|
e6f819ed90 | ||
|
|
0c8bcb2400 | ||
|
|
c5761cc51e | ||
|
|
24ccf65aba | ||
|
|
814d6f1de6 | ||
|
|
bfaab294e6 | ||
|
|
0ddcf668cb | ||
|
|
4005e9e791 | ||
|
|
abaa007c54 | ||
|
|
87d80f84c2 | ||
|
|
3fdf246a22 | ||
|
|
79b95d0045 | ||
|
|
1e66e5cd82 | ||
|
|
193d9939f0 | ||
|
|
81fc559802 | ||
|
|
0d75cc999c | ||
|
|
a5da56d02f | ||
|
|
a7e20fd390 | ||
|
|
9f38e7e5f5 | ||
|
|
93e60cc136 | ||
|
|
5f7ec50055 | ||
|
|
ff0019841f | ||
|
|
7eeeced2ca | ||
|
|
0fc369789e | ||
|
|
09f72f5ac6 | ||
|
|
716109bab5 | ||
|
|
0684fcf7e9 | ||
|
|
289104cde0 | ||
|
|
c9277e4b12 | ||
|
|
08125fc2a5 | ||
|
|
d06dd2ef43 | ||
|
|
8ae3eea19c | ||
|
|
a1bc76f305 | ||
|
|
045bede481 | ||
|
|
0a231f2e0e | ||
|
|
87e7c5f00a | ||
|
|
7ded9fe219 | ||
|
|
b389e75d33 | ||
|
|
9128bfc5f1 | ||
|
|
bb227d2c37 | ||
|
|
954da93301 | ||
|
|
1dce0f265d | ||
|
|
0f54630725 | ||
|
|
712cd69242 | ||
|
|
ff3bd640f0 | ||
|
|
abb347e1a8 | ||
|
|
949c9c0b8c | ||
|
|
627a9f7972 | ||
|
|
cce892e92f | ||
|
|
97fb8ef653 | ||
|
|
649d6169c9 | ||
|
|
9efb97c2a7 | ||
|
|
d876aa141c | ||
|
|
f64efad057 | ||
|
|
20edb87505 | ||
|
|
34156c55ae | ||
|
|
569bc243f1 | ||
|
|
bc6a42735c | ||
|
|
b2f2a9c721 | ||
|
|
8a00b9c77d | ||
|
|
d7506b6aaf | ||
|
|
3a86e89116 | ||
|
|
0e71bdab65 | ||
|
|
0c553b3406 | ||
|
|
33012f35ef | ||
|
|
a6b915f6b4 | ||
|
|
772c981c39 | ||
|
|
05905f8c3c | ||
|
|
9542bd8a44 | ||
|
|
d9fe457b44 | ||
|
|
59700b07db | ||
|
|
428e4563d0 | ||
|
|
6c3bbaa686 | ||
|
|
7009bb6d05 | ||
|
|
23a5692d59 | ||
|
|
2d4e7cfdee | ||
|
|
99222d8ab9 | ||
|
|
a845fee689 | ||
|
|
cfecf4f1d4 | ||
|
|
b3e49590a7 | ||
|
|
358837ed69 | ||
|
|
2a353830c2 | ||
|
|
14f51436d7 | ||
|
|
57e5465c2d | ||
|
|
d9619e65a2 | ||
|
|
9754994e0c | ||
|
|
34c894b15d | ||
|
|
a2665d9247 | ||
|
|
1e3ae67646 | ||
|
|
25b9625635 | ||
|
|
2404b22c1f | ||
|
|
bed882f41c | ||
|
|
fd9e0944cb | ||
|
|
7e462319c9 | ||
|
|
94de87ef86 | ||
|
|
eb13f1f4fb | ||
|
|
0a6c39ded4 | ||
|
|
ff1aac64c1 | ||
|
|
ef24894211 | ||
|
|
1113164505 | ||
|
|
1de73de2e3 | ||
|
|
571cc5a1da | ||
|
|
8cb0803605 | ||
|
|
95d52b87f4 | ||
|
|
07fd3abe2c | ||
|
|
5dedd2e0e0 | ||
|
|
57abb03deb | ||
|
|
4a38a74b16 | ||
|
|
9a45ea562b | ||
|
|
da404f520d | ||
|
|
799ad8b264 | ||
|
|
818b51d57c | ||
|
|
e8866abc7a | ||
|
|
3b560c063a | ||
|
|
a27b8d6a3a | ||
|
|
2050b89334 | ||
|
|
504de44ff3 | ||
|
|
71a6f13fa5 | ||
|
|
f62fbefe54 | ||
|
|
6c29024eac | ||
|
|
b7f18c0d31 | ||
|
|
696c29086b | ||
|
|
bce281606e | ||
|
|
2388a92085 | ||
|
|
447991e82b | ||
|
|
a8984350da | ||
|
|
4d5da72e2e |
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1,5 +1,10 @@
|
|||||||
.lock*
|
.lock*
|
||||||
build
|
/build*
|
||||||
*.bak
|
*.bak
|
||||||
tags
|
tags
|
||||||
.gdbinit
|
jsix.log
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
sysroot
|
||||||
|
.gdb_history
|
||||||
|
.peru
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +0,0 @@
|
|||||||
[submodule "external/gnu-efi"]
|
|
||||||
path = external/gnu-efi
|
|
||||||
url = https://github.com/justinian/gnu-efi.git
|
|
||||||
|
|||||||
354
LICENSE.md
Normal file
354
LICENSE.md
Normal file
@@ -0,0 +1,354 @@
|
|||||||
|
# License
|
||||||
|
|
||||||
|
jsix is (c) 2017-2019 Justin C Miller, and distributed under the terms of the
|
||||||
|
Mozilla Public License 2.0.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mozilla Public License Version 2.0
|
||||||
|
|
||||||
|
### 1. Definitions
|
||||||
|
|
||||||
|
#### 1.1. "Contributor"
|
||||||
|
|
||||||
|
means each individual or legal entity that creates, contributes to the creation
|
||||||
|
of, or owns Covered Software.
|
||||||
|
|
||||||
|
#### 1.2. "Contributor Version"
|
||||||
|
|
||||||
|
means the combination of the Contributions of others (if any) used by a
|
||||||
|
Contributor and that particular Contributor's Contribution.
|
||||||
|
|
||||||
|
#### 1.3. "Contribution
|
||||||
|
|
||||||
|
means Covered Software of a particular Contributor.
|
||||||
|
|
||||||
|
#### 1.4. "Covered Software"
|
||||||
|
|
||||||
|
means Source Code Form to which the initial Contributor has attached the notice
|
||||||
|
in Exhibit A, the Executable Form of such Source Code Form, and Modifications
|
||||||
|
of such Source Code Form, in each case including portions thereof.
|
||||||
|
|
||||||
|
#### 1.5. "Incompatible With Secondary Licenses"
|
||||||
|
|
||||||
|
means
|
||||||
|
|
||||||
|
* **(a)** that the initial Contributor has attached the notice described in
|
||||||
|
Exhibit B to the Covered Software; or
|
||||||
|
* **(b)** that the Covered Software was made available under the terms of
|
||||||
|
version 1.1 or earlier of the License, but not also under the terms of a
|
||||||
|
Secondary License.
|
||||||
|
|
||||||
|
#### 1.6. "Executable Form"
|
||||||
|
|
||||||
|
means any form of the work other than Source Code Form.
|
||||||
|
|
||||||
|
#### 1.7. "Larger Work"
|
||||||
|
|
||||||
|
means a work that combines Covered Software with other material, in a separate
|
||||||
|
file or files, that is not Covered Software.
|
||||||
|
|
||||||
|
#### 1.8. "License"
|
||||||
|
|
||||||
|
means this document.
|
||||||
|
|
||||||
|
#### 1.9. "Licensable"
|
||||||
|
|
||||||
|
means having the right to grant, to the maximum extent possible, whether at the
|
||||||
|
time of the initial grant or subsequently, any and all of the rights conveyed
|
||||||
|
by this License.
|
||||||
|
|
||||||
|
#### 1.10. "Modifications"
|
||||||
|
|
||||||
|
means any of the following:
|
||||||
|
|
||||||
|
* **(a)** any file in Source Code Form that results from an addition to,
|
||||||
|
deletion from, or modification of the contents of Covered Software; or
|
||||||
|
* **(b)** any new file in Source Code Form that contains any Covered Software.
|
||||||
|
|
||||||
|
#### 1.11. "Patent Claims" of a Contributor
|
||||||
|
|
||||||
|
means any patent claim(s), including without limitation, method, process, and
|
||||||
|
apparatus claims, in any patent Licensable by such Contributor that would be
|
||||||
|
infringed, but for the grant of the License, by the making, using, selling,
|
||||||
|
offering for sale, having made, import, or transfer of either its Contributions
|
||||||
|
or its Contributor Version.
|
||||||
|
|
||||||
|
#### 1.12. "Secondary License"
|
||||||
|
|
||||||
|
means either the GNU General Public License, Version 2.0, the GNU Lesser
|
||||||
|
General Public License, Version 2.1, the GNU Affero General Public License,
|
||||||
|
Version 3.0, or any later versions of those licenses.
|
||||||
|
|
||||||
|
#### 1.13. "Source Code Form"
|
||||||
|
|
||||||
|
means the form of the work preferred for making modifications.
|
||||||
|
|
||||||
|
#### 1.14. "You" (or "Your")
|
||||||
|
|
||||||
|
means an individual or a legal entity exercising rights under this License. For
|
||||||
|
legal entities, "You" includes any entity that controls, is controlled by, or
|
||||||
|
is under common control with You. For purposes of this definition, "control"
|
||||||
|
means **(a)** the power, direct or indirect, to cause the direction or
|
||||||
|
management of such entity, whether by contract or otherwise, or **(b)**
|
||||||
|
ownership of more than fifty percent (50%) of the outstanding shares or
|
||||||
|
beneficial ownership of such entity.
|
||||||
|
|
||||||
|
|
||||||
|
### 2. License Grants and Conditions
|
||||||
|
|
||||||
|
#### 2.1. Grants
|
||||||
|
|
||||||
|
Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive
|
||||||
|
license:
|
||||||
|
|
||||||
|
* **(a)** under intellectual property rights (other than patent or trademark)
|
||||||
|
Licensable by such Contributor to use, reproduce, make available, modify,
|
||||||
|
display, perform, distribute, and otherwise exploit its Contributions, either
|
||||||
|
on an unmodified basis, with Modifications, or as part of a Larger Work; and
|
||||||
|
* **(b)** under Patent Claims of such Contributor to make, use, sell, offer for
|
||||||
|
sale, have made, import, and otherwise transfer either its Contributions or
|
||||||
|
its Contributor Version.
|
||||||
|
|
||||||
|
#### 2.2. Effective Date
|
||||||
|
|
||||||
|
The licenses granted in Section 2.1 with respect to any Contribution become
|
||||||
|
effective for each Contribution on the date the Contributor first distributes
|
||||||
|
such Contribution.
|
||||||
|
|
||||||
|
#### 2.3. Limitations on Grant Scope
|
||||||
|
|
||||||
|
The licenses granted in this Section 2 are the only rights granted under this
|
||||||
|
License. No additional rights or licenses will be implied from the distribution
|
||||||
|
or licensing of Covered Software under this License. Notwithstanding Section
|
||||||
|
2.1(b) above, no patent license is granted by a Contributor:
|
||||||
|
|
||||||
|
* **(a)** for any code that a Contributor has removed from Covered Software; or
|
||||||
|
* **(b)** for infringements caused by: **(i)** Your and any other third party's
|
||||||
|
modifications of Covered Software, or **(ii)** the combination of its
|
||||||
|
Contributions with other software (except as part of its Contributor
|
||||||
|
Version); or
|
||||||
|
* **(c)** under Patent Claims infringed by Covered Software in the absence of
|
||||||
|
its Contributions.
|
||||||
|
|
||||||
|
This License does not grant any rights in the trademarks, service marks, or
|
||||||
|
logos of any Contributor (except as may be necessary to comply with the notice
|
||||||
|
requirements in Section 3.4).
|
||||||
|
|
||||||
|
#### 2.4. Subsequent Licenses
|
||||||
|
|
||||||
|
No Contributor makes additional grants as a result of Your choice to distribute
|
||||||
|
the Covered Software under a subsequent version of this License (see Section
|
||||||
|
10.2) or under the terms of a Secondary License (if permitted under the terms
|
||||||
|
of Section 3.3).
|
||||||
|
|
||||||
|
#### 2.5. Representation
|
||||||
|
|
||||||
|
Each Contributor represents that the Contributor believes its Contributions are
|
||||||
|
its original creation(s) or it has sufficient rights to grant the rights to its
|
||||||
|
Contributions conveyed by this License.
|
||||||
|
|
||||||
|
#### 2.6. Fair Use
|
||||||
|
|
||||||
|
This License is not intended to limit any rights You have under applicable
|
||||||
|
copyright doctrines of fair use, fair dealing, or other equivalents.
|
||||||
|
|
||||||
|
#### 2.7. Conditions
|
||||||
|
|
||||||
|
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
|
||||||
|
Section 2.1.
|
||||||
|
|
||||||
|
|
||||||
|
### 3. Responsibilities
|
||||||
|
|
||||||
|
#### 3.1. Distribution of Source Form
|
||||||
|
|
||||||
|
All distribution of Covered Software in Source Code Form, including any
|
||||||
|
Modifications that You create or to which You contribute, must be under the
|
||||||
|
terms of this License. You must inform recipients that the Source Code Form of
|
||||||
|
the Covered Software is governed by the terms of this License, and how they can
|
||||||
|
obtain a copy of this License. You may not attempt to alter or restrict the
|
||||||
|
recipients' rights in the Source Code Form.
|
||||||
|
|
||||||
|
#### 3.2. Distribution of Executable Form
|
||||||
|
|
||||||
|
If You distribute Covered Software in Executable Form then:
|
||||||
|
|
||||||
|
* **(a)** such Covered Software must also be made available in Source Code
|
||||||
|
Form, as described in Section 3.1, and You must inform recipients of the
|
||||||
|
Executable Form how they can obtain a copy of such Source Code Form by
|
||||||
|
reasonable means in a timely manner, at a charge no more than the cost of
|
||||||
|
distribution to the recipient; and
|
||||||
|
* **(b)** You may distribute such Executable Form under the terms of this
|
||||||
|
License, or sublicense it under different terms, provided that the license
|
||||||
|
for the Executable Form does not attempt to limit or alter the recipients'
|
||||||
|
rights in the Source Code Form under this License.
|
||||||
|
|
||||||
|
#### 3.3. Distribution of a Larger Work
|
||||||
|
|
||||||
|
You may create and distribute a Larger Work under terms of Your choice,
|
||||||
|
provided that You also comply with the requirements of this License for the
|
||||||
|
Covered Software. If the Larger Work is a combination of Covered Software with
|
||||||
|
a work governed by one or more Secondary Licenses, and the Covered Software is
|
||||||
|
not Incompatible With Secondary Licenses, this License permits You to
|
||||||
|
additionally distribute such Covered Software under the terms of such Secondary
|
||||||
|
License(s), so that the recipient of the Larger Work may, at their option,
|
||||||
|
further distribute the Covered Software under the terms of either this License
|
||||||
|
or such Secondary License(s).
|
||||||
|
|
||||||
|
#### 3.4. Notices
|
||||||
|
|
||||||
|
You may not remove or alter the substance of any license notices (including
|
||||||
|
copyright notices, patent notices, disclaimers of warranty, or limitations of
|
||||||
|
liability) contained within the Source Code Form of the Covered Software,
|
||||||
|
except that You may alter any license notices to the extent required to remedy
|
||||||
|
known factual inaccuracies.
|
||||||
|
|
||||||
|
#### 3.5. Application of Additional Terms
|
||||||
|
|
||||||
|
You may choose to offer, and to charge a fee for, warranty, support, indemnity
|
||||||
|
or liability obligations to one or more recipients of Covered Software.
|
||||||
|
However, You may do so only on Your own behalf, and not on behalf of any
|
||||||
|
Contributor. You must make it absolutely clear that any such warranty, support,
|
||||||
|
indemnity, or liability obligation is offered by You alone, and You hereby
|
||||||
|
agree to indemnify every Contributor for any liability incurred by such
|
||||||
|
Contributor as a result of warranty, support, indemnity or liability terms You
|
||||||
|
offer. You may include additional disclaimers of warranty and limitations of
|
||||||
|
liability specific to any jurisdiction.
|
||||||
|
|
||||||
|
|
||||||
|
### 4. Inability to Comply Due to Statute or Regulation
|
||||||
|
|
||||||
|
If it is impossible for You to comply with any of the terms of this License
|
||||||
|
with respect to some or all of the Covered Software due to statute, judicial
|
||||||
|
order, or regulation then You must: **(a)** comply with the terms of this
|
||||||
|
License to the maximum extent possible; and **(b)** describe the limitations
|
||||||
|
and the code they affect. Such description must be placed in a text file
|
||||||
|
included with all distributions of the Covered Software under this License.
|
||||||
|
Except to the extent prohibited by statute or regulation, such description must
|
||||||
|
be sufficiently detailed for a recipient of ordinary skill to be able to
|
||||||
|
understand it.
|
||||||
|
|
||||||
|
|
||||||
|
### 5. Termination
|
||||||
|
|
||||||
|
**5.1.** The rights granted under this License will terminate automatically if
|
||||||
|
You fail to comply with any of its terms. However, if You become compliant,
|
||||||
|
then the rights granted under this License from a particular Contributor are
|
||||||
|
reinstated **(a)** provisionally, unless and until such Contributor explicitly
|
||||||
|
and finally terminates Your grants, and **(b)** on an ongoing basis, if such
|
||||||
|
Contributor fails to notify You of the non-compliance by some reasonable means
|
||||||
|
prior to 60 days after You have come back into compliance. Moreover, Your
|
||||||
|
grants from a particular Contributor are reinstated on an ongoing basis if such
|
||||||
|
Contributor notifies You of the non-compliance by some reasonable means, this
|
||||||
|
is the first time You have received notice of non-compliance with this License
|
||||||
|
from such Contributor, and You become compliant prior to 30 days after Your
|
||||||
|
receipt of the notice.
|
||||||
|
|
||||||
|
**5.2.** If You initiate litigation against any entity by asserting a patent
|
||||||
|
infringement claim (excluding declaratory judgment actions, counter-claims, and
|
||||||
|
cross-claims) alleging that a Contributor Version directly or indirectly
|
||||||
|
infringes any patent, then the rights granted to You by any and all
|
||||||
|
Contributors for the Covered Software under Section 2.1 of this License shall
|
||||||
|
terminate.
|
||||||
|
|
||||||
|
**5.3.** In the event of termination under Sections 5.1 or 5.2 above, all end
|
||||||
|
user license agreements (excluding distributors and resellers) which have been
|
||||||
|
validly granted by You or Your distributors under this License prior to
|
||||||
|
termination shall survive termination.
|
||||||
|
|
||||||
|
|
||||||
|
### 6. Disclaimer of Warranty
|
||||||
|
|
||||||
|
> Covered Software is provided under this License on an "as is" basis, without
|
||||||
|
> warranty of any kind, either expressed, implied, or statutory, including,
|
||||||
|
> without limitation, warranties that the Covered Software is free of defects,
|
||||||
|
> merchantable, fit for a particular purpose or non-infringing. The entire risk
|
||||||
|
> as to the quality and performance of the Covered Software is with You.
|
||||||
|
> Should any Covered Software prove defective in any respect, You (not any
|
||||||
|
> Contributor) assume the cost of any necessary servicing, repair, or
|
||||||
|
> correction. This disclaimer of warranty constitutes an essential part of this
|
||||||
|
> License. No use of any Covered Software is authorized under this License
|
||||||
|
> except under this disclaimer.
|
||||||
|
|
||||||
|
### 7. Limitation of Liability
|
||||||
|
|
||||||
|
> Under no circumstances and under no legal theory, whether tort (including
|
||||||
|
> negligence), contract, or otherwise, shall any Contributor, or anyone who
|
||||||
|
> distributes Covered Software as permitted above, be liable to You for any
|
||||||
|
> direct, indirect, special, incidental, or consequential damages of any
|
||||||
|
> character including, without limitation, damages for lost profits, loss of
|
||||||
|
> goodwill, work stoppage, computer failure or malfunction, or any and all
|
||||||
|
> other commercial damages or losses, even if such party shall have been
|
||||||
|
> informed of the possibility of such damages. This limitation of liability
|
||||||
|
> shall not apply to liability for death or personal injury resulting from such
|
||||||
|
> party's negligence to the extent applicable law prohibits such limitation.
|
||||||
|
> Some jurisdictions do not allow the exclusion or limitation of incidental or
|
||||||
|
> consequential damages, so this exclusion and limitation may not apply to You.
|
||||||
|
|
||||||
|
|
||||||
|
### 8. Litigation
|
||||||
|
|
||||||
|
Any litigation relating to this License may be brought only in the courts of a
|
||||||
|
jurisdiction where the defendant maintains its principal place of business and
|
||||||
|
such litigation shall be governed by laws of that jurisdiction, without
|
||||||
|
reference to its conflict-of-law provisions. Nothing in this Section shall
|
||||||
|
prevent a party's ability to bring cross-claims or counter-claims.
|
||||||
|
|
||||||
|
|
||||||
|
### 9. Miscellaneous
|
||||||
|
|
||||||
|
This License represents the complete agreement concerning the subject matter
|
||||||
|
hereof. If any provision of this License is held to be unenforceable, such
|
||||||
|
provision shall be reformed only to the extent necessary to make it
|
||||||
|
enforceable. Any law or regulation which provides that the language of a
|
||||||
|
contract shall be construed against the drafter shall not be used to construe
|
||||||
|
this License against a Contributor.
|
||||||
|
|
||||||
|
|
||||||
|
### 10. Versions of the License
|
||||||
|
|
||||||
|
#### 10.1. New Versions
|
||||||
|
|
||||||
|
Mozilla Foundation is the license steward. Except as provided in Section 10.3,
|
||||||
|
no one other than the license steward has the right to modify or publish new
|
||||||
|
versions of this License. Each version will be given a distinguishing version
|
||||||
|
number.
|
||||||
|
|
||||||
|
#### 10.2. Effect of New Versions
|
||||||
|
|
||||||
|
You may distribute the Covered Software under the terms of the version of the
|
||||||
|
License under which You originally received the Covered Software, or under the
|
||||||
|
terms of any subsequent version published by the license steward.
|
||||||
|
|
||||||
|
#### 10.3. Modified Versions
|
||||||
|
|
||||||
|
If you create software not governed by this License, and you want to create a
|
||||||
|
new license for such software, you may create and use a modified version of
|
||||||
|
this License if you rename the license and remove any references to the name of
|
||||||
|
the license steward (except to note that such modified license differs from
|
||||||
|
this License).
|
||||||
|
|
||||||
|
#### 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
|
||||||
|
|
||||||
|
If You choose to distribute Source Code Form that is Incompatible With
|
||||||
|
Secondary Licenses under the terms of this version of the License, the notice
|
||||||
|
described in Exhibit B of this License must be attached.
|
||||||
|
|
||||||
|
### Exhibit A - Source Code Form License Notice
|
||||||
|
|
||||||
|
This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
If it is not possible or desirable to put the notice in a particular file, then
|
||||||
|
You may include the notice in a location (such as a LICENSE file in a relevant
|
||||||
|
directory) where a recipient would be likely to look for such a notice.
|
||||||
|
|
||||||
|
You may add additional accurate notices of copyright ownership.
|
||||||
|
|
||||||
|
### Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||||
|
|
||||||
|
This Source Code Form is "Incompatible With Secondary Licenses", as defined
|
||||||
|
by the Mozilla Public License, v. 2.0.
|
||||||
|
|
||||||
228
Makefile
228
Makefile
@@ -1,228 +0,0 @@
|
|||||||
ARCH ?= x86_64
|
|
||||||
|
|
||||||
include src/arch/$(ARCH)/config.mk
|
|
||||||
|
|
||||||
BUILD_D := build
|
|
||||||
ARCH_D := src/arch/$(ARCH)
|
|
||||||
VERSION ?= $(shell git describe --dirty --always)
|
|
||||||
GITSHA ?= $(shell git rev-parse --short HEAD)
|
|
||||||
|
|
||||||
KERNEL_FILENAME:= popcorn.bin
|
|
||||||
KERNEL_FONT := assets/fonts/tamsyn8x16r.psf
|
|
||||||
|
|
||||||
MODULES := main
|
|
||||||
|
|
||||||
|
|
||||||
EFI_DIR := external/gnu-efi
|
|
||||||
EFI_DATA := $(EFI_DIR)/gnuefi
|
|
||||||
EFI_LDS := $(EFI_DATA)/elf_$(ARCH)_efi.lds
|
|
||||||
EFI_ARCH_DIR := $(EFI_DIR)/$(ARCH)
|
|
||||||
EFI_ARCH_DATA := $(EFI_ARCH_DIR)/gnuefi
|
|
||||||
EFI_CRT_OBJ := $(EFI_ARCH_DATA)/crt0-efi-$(ARCH).o
|
|
||||||
EFI_LIB := $(EFI_ARCH_DIR)/lib/libefi.a
|
|
||||||
EFI_INCLUDES := $(EFI_DIR)/inc
|
|
||||||
|
|
||||||
DEPENDFLAGS := -MMD
|
|
||||||
|
|
||||||
INCLUDES := -I $(ARCH_D)
|
|
||||||
INCLUDES += -I src/modules
|
|
||||||
INCLUDES += -I src/include
|
|
||||||
INCLUDES += -isystem $(EFI_INCLUDES)
|
|
||||||
INCLUDES += -isystem $(EFI_INCLUDES)/$(ARCH)
|
|
||||||
INCLUDES += -isystem $(EFI_INCLUDES)/protocol
|
|
||||||
|
|
||||||
BASEFLAGS := -ggdb -nostdlib
|
|
||||||
BASEFLAGS += -ffreestanding -nodefaultlibs
|
|
||||||
BASEFLAGS += -fno-builtin -fomit-frame-pointer
|
|
||||||
BASEFLAGS += -mno-red-zone -fno-stack-protector
|
|
||||||
|
|
||||||
ifdef CPU
|
|
||||||
BASEFLAGS += -mcpu=$(CPU)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Removed Flags:: -Wcast-align
|
|
||||||
WARNFLAGS += -Wformat=2 -Winit-self -Wfloat-equal -Winline
|
|
||||||
WARNFLAGS += -Winvalid-pch -Wmissing-format-attribute
|
|
||||||
WARNFLAGS += -Wmissing-include-dirs -Wswitch -Wundef
|
|
||||||
WARNFLAGS += -Wdisabled-optimization -Wpointer-arith
|
|
||||||
|
|
||||||
WARNFLAGS += -Wno-attributes -Wno-sign-compare -Wno-multichar
|
|
||||||
WARNFLAGS += -Wno-div-by-zero -Wno-endif-labels -Wno-pragmas
|
|
||||||
WARNFLAGS += -Wno-format-extra-args -Wno-unused-result
|
|
||||||
WARNFLAGS += -Wno-deprecated-declarations -Wno-unused-function
|
|
||||||
WARNFLAGS += -Wno-unused-but-set-parameter
|
|
||||||
|
|
||||||
ASFLAGS ?=
|
|
||||||
ASFLAGS += -p $(BUILD_D)/versions.s
|
|
||||||
|
|
||||||
CFLAGS := $(INCLUDES) $(DEPENDFLAGS) $(BASEFLAGS) $(WARNFLAGS)
|
|
||||||
CFLAGS += -DGIT_VERSION="\"$(VERSION)\""
|
|
||||||
CFLAGS += -std=c11
|
|
||||||
|
|
||||||
CXXFLAGS := $(INCLUDES) $(DEPENDFLAGS) $(BASEFLAGS) $(WARNFLAGS)
|
|
||||||
CXXFLAGS += -DGIT_VERSION="\"$(VERSION)\""
|
|
||||||
CXXFLAGS += -std=c++14
|
|
||||||
|
|
||||||
BOOT_CFLAGS := -I src/boot $(CFLAGS) -fPIC -fshort-wchar
|
|
||||||
BOOT_CFLAGS += -DKERNEL_FILENAME="L\"$(KERNEL_FILENAME)\""
|
|
||||||
BOOT_CFLAGS += -DGIT_VERSION_WIDE="L\"$(VERSION)\""
|
|
||||||
BOOT_CFLAGS += -DGNU_EFI_USE_MS_ABI -DHAVE_USE_MS_ABI
|
|
||||||
BOOT_CFLAGS += -DEFI_DEBUG=0 -DEFI_DEBUG_CLEAR_MEMORY=0
|
|
||||||
#BOOT_CFLAGS += -DEFI_FUNCTION_WRAPPER
|
|
||||||
|
|
||||||
ifdef MAX_HRES
|
|
||||||
BOOT_CFLAGS += -DMAX_HRES=$(MAX_HRES)
|
|
||||||
endif
|
|
||||||
|
|
||||||
LDFLAGS := -L $(BUILD_D) -ggdb
|
|
||||||
LDFLAGS += -nostdlib -znocombreloc -Bsymbolic -nostartfiles
|
|
||||||
|
|
||||||
BOOT_LDFLAGS := $(LDFLAGS) -shared
|
|
||||||
BOOT_LDFLAGS += -L $(EFI_ARCH_DIR)/lib -L $(EFI_ARCH_DIR)/gnuefi
|
|
||||||
|
|
||||||
AS ?= $(CROSS)nasm
|
|
||||||
AR ?= $(CROSS)ar
|
|
||||||
CC ?= $(CROSS)gcc
|
|
||||||
CXX ?= $(CROSS)g++
|
|
||||||
LD ?= $(CROSS)ld
|
|
||||||
OBJC := $(CROSS)objcopy
|
|
||||||
OBJD := $(CROSS)objdump
|
|
||||||
|
|
||||||
INIT_DEP := $(BUILD_D)/.builddir
|
|
||||||
|
|
||||||
BOOT_SRCS := $(wildcard src/boot/*.c)
|
|
||||||
BOBJS += $(patsubst src/boot/%,$(BUILD_D)/boot/%,$(patsubst %,%.o,$(BOOT_SRCS)))
|
|
||||||
BDEPS := $(patsubst src/boot/%,$(BUILD_D)/boot/%,$(patsubst %,%.d,$(BOOT_SRCS)))
|
|
||||||
|
|
||||||
ARCH_SRCS := $(wildcard $(ARCH_D)/*.s)
|
|
||||||
ARCH_SRCS += $(wildcard $(ARCH_D)/*.c)
|
|
||||||
KOBJS += $(patsubst $(ARCH_D)/%,$(BUILD_D)/arch/%,$(patsubst %,%.o,$(ARCH_SRCS)))
|
|
||||||
DEPS := $(patsubst $(ARCH_D)/%,$(BUILD_D)/arch/%,$(patsubst %,%.d,$(ARCH_SRCS)))
|
|
||||||
MOD_TARGETS :=
|
|
||||||
|
|
||||||
PARTED ?= /sbin/parted
|
|
||||||
QEMU ?= qemu-system-x86_64
|
|
||||||
GDBPORT ?= 27006
|
|
||||||
CPUS ?= 1
|
|
||||||
OVMF ?= assets/ovmf/x64/OVMF.fd
|
|
||||||
|
|
||||||
QEMUOPTS := -pflash $(BUILD_D)/flash.img
|
|
||||||
QEMUOPTS += -drive file=$(BUILD_D)/fs.img,format=raw
|
|
||||||
QEMUOPTS += -smp $(CPUS)
|
|
||||||
QEMUOPTS += -m 512
|
|
||||||
QEMUOPTS += -d guest_errors
|
|
||||||
QEMUOPTS += $(QEMUEXTRA)
|
|
||||||
|
|
||||||
|
|
||||||
all: $(BUILD_D)/fs.img
|
|
||||||
init: $(INIT_DEP)
|
|
||||||
|
|
||||||
$(INIT_DEP):
|
|
||||||
mkdir -p $(BUILD_D) $(patsubst %,$(BUILD_D)/d.%,$(MODULES))
|
|
||||||
mkdir -p $(BUILD_D)/boot
|
|
||||||
mkdir -p $(BUILD_D)/arch
|
|
||||||
touch $(INIT_DEP)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf $(BUILD_D)/* $(BUILD_D)/.version $(BUILD_D)/.builddir
|
|
||||||
|
|
||||||
dist-clean: clean
|
|
||||||
make -C external/gnu-efi clean
|
|
||||||
|
|
||||||
dump: $(BUILD_D)/kernel.dump
|
|
||||||
vim $<
|
|
||||||
|
|
||||||
.PHONY: all clean dist-clean init dump
|
|
||||||
|
|
||||||
$(BUILD_D)/.version:
|
|
||||||
echo '$(VERSION)' | cmp -s - $@ || echo '$(VERSION)' > $@
|
|
||||||
|
|
||||||
$(BUILD_D)/versions.s:
|
|
||||||
./parse_version.py "$(VERSION)" "$(GITSHA)" > $@
|
|
||||||
|
|
||||||
-include x $(patsubst %,src/modules/%/module.mk,$(MODULES))
|
|
||||||
-include x $(DEPS)
|
|
||||||
|
|
||||||
$(EFI_LIB):
|
|
||||||
make -C external/gnu-efi all
|
|
||||||
|
|
||||||
$(BUILD_D)/boot.elf: $(BOBJS) $(EFI_LIB)
|
|
||||||
$(LD) $(BOOT_LDFLAGS) -T $(EFI_LDS) -o $@ \
|
|
||||||
$(EFI_CRT_OBJ) $(BOBJS) -lefi -lgnuefi
|
|
||||||
|
|
||||||
$(BUILD_D)/boot.efi: $(BUILD_D)/boot.elf
|
|
||||||
$(OBJC) -j .text -j .sdata -j .data -j .dynamic \
|
|
||||||
-j .dynsym -j .rel -j .rela -j .reloc \
|
|
||||||
--target=efi-app-$(ARCH) $^ $@
|
|
||||||
|
|
||||||
$(BUILD_D)/boot.debug.efi: $(BUILD_D)/boot.elf
|
|
||||||
$(OBJC) -j .text -j .sdata -j .data -j .dynamic \
|
|
||||||
-j .dynsym -j .rel -j .rela -j .reloc \
|
|
||||||
-j .debug_info -j .debug_abbrev -j .debug_loc -j .debug_str \
|
|
||||||
-j .debug_aranges -j .debug_line -j .debug_macinfo \
|
|
||||||
--target=efi-app-$(ARCH) $^ $@
|
|
||||||
|
|
||||||
$(BUILD_D)/%.bin: $(BUILD_D)/%.elf
|
|
||||||
$(OBJC) $< -O binary $@
|
|
||||||
|
|
||||||
$(BUILD_D)/boot.dump: $(BUILD_D)/boot.efi
|
|
||||||
$(OBJD) -D -S $< > $@
|
|
||||||
|
|
||||||
$(BUILD_D)/boot/%.s.o: src/boot/%.s $(BUILD_D)/versions.s $(INIT_DEP)
|
|
||||||
$(AS) $(ASFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
$(BUILD_D)/boot/%.c.o: src/boot/%.c $(INIT_DEP)
|
|
||||||
$(CC) $(BOOT_CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(BUILD_D)/kernel.elf: $(KOBJS) $(MOD_TARGETS) $(ARCH_D)/kernel.ld
|
|
||||||
$(LD) $(LDFLAGS) -u _header -T $(ARCH_D)/kernel.ld -o $@ $(patsubst %,-l%,$(MODULES)) $(KOBJS)
|
|
||||||
$(OBJC) --only-keep-debug $@ $@.sym
|
|
||||||
|
|
||||||
$(BUILD_D)/kernel.dump: $(BUILD_D)/kernel.elf
|
|
||||||
$(OBJD) -D -S $< > $@
|
|
||||||
|
|
||||||
$(BUILD_D)/arch/%.s.o: $(ARCH_D)/%.s $(BUILD_D)/versions.s $(INIT_DEP)
|
|
||||||
$(AS) $(ASFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
$(BUILD_D)/arch/%.c.o: $(ARCH_D)/%.c $(INIT_DEP)
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(BUILD_D)/flash.img: $(OVMF)
|
|
||||||
cp $^ $@
|
|
||||||
|
|
||||||
$(BUILD_D)/screenfont.psf: $(KERNEL_FONT)
|
|
||||||
cp $^ $@
|
|
||||||
|
|
||||||
$(BUILD_D)/fs.img: $(BUILD_D)/boot.efi $(BUILD_D)/kernel.bin $(BUILD_D)/screenfont.psf
|
|
||||||
$(eval TEMPFILE := $(shell mktemp --suffix=.img))
|
|
||||||
dd if=/dev/zero of=$@.tmp bs=512 count=93750
|
|
||||||
$(PARTED) $@.tmp -s -a minimal mklabel gpt
|
|
||||||
$(PARTED) $@.tmp -s -a minimal mkpart EFI FAT16 2048s 93716s
|
|
||||||
$(PARTED) $@.tmp -s -a minimal toggle 1 boot
|
|
||||||
dd if=/dev/zero of=$(TEMPFILE) bs=512 count=91669
|
|
||||||
mformat -i $(TEMPFILE) -h 32 -t 32 -n 64 -c 1
|
|
||||||
mmd -i $(TEMPFILE) ::/EFI
|
|
||||||
mmd -i $(TEMPFILE) ::/EFI/BOOT
|
|
||||||
mcopy -i $(TEMPFILE) $(BUILD_D)/boot.efi ::/EFI/BOOT/BOOTX64.efi
|
|
||||||
mcopy -i $(TEMPFILE) $(BUILD_D)/kernel.bin ::$(KERNEL_FILENAME)
|
|
||||||
mcopy -i $(TEMPFILE) $(BUILD_D)/screenfont.psf ::screenfont.psf
|
|
||||||
mlabel -i $(TEMPFILE) ::Popcorn_OS
|
|
||||||
dd if=$(TEMPFILE) of=$@.tmp bs=512 count=91669 seek=2048 conv=notrunc
|
|
||||||
rm $(TEMPFILE)
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
$(BUILD_D)/fs.iso: $(BUILD_D)/fs.img
|
|
||||||
mkdir -p $(BUILD_D)/iso
|
|
||||||
cp $< $(BUILD_D)/iso/
|
|
||||||
xorriso -as mkisofs -R -f -e fs.img -no-emul-boot -o $@ $(BUILD_D)/iso
|
|
||||||
|
|
||||||
qemu: $(BUILD_D)/fs.img $(BUILD_D)/flash.img
|
|
||||||
"$(QEMU)" $(QEMUOPTS) -nographic
|
|
||||||
|
|
||||||
qemu-window: $(BUILD_D)/fs.img $(BUILD_D)/flash.img
|
|
||||||
"$(QEMU)" $(QEMUOPTS)
|
|
||||||
|
|
||||||
qemu-gdb: $(BUILD_D)/fs.img $(BUILD_D)/boot.debug.efi $(BUILD_D)/flash.img $(BUILD_D)/kernel.elf
|
|
||||||
"$(QEMU)" $(QEMUOPTS) -d mmu,guest_errors,page -D popcorn.log -s -nographic
|
|
||||||
|
|
||||||
# vim: ft=make ts=4
|
|
||||||
38
NOTES.md
38
NOTES.md
@@ -1,10 +1,38 @@
|
|||||||
# Design / WIP notes
|
# Design / WIP notes
|
||||||
|
|
||||||
## Bootloader / UEFI
|
## TODO
|
||||||
|
|
||||||
* What is the interface between the UEFI boot portion and the kernel?
|
- Paging manager
|
||||||
* Allocate pages, use UEFI reserved mapping types (0x70000000 - 0x7fffffff)
|
- Copy-on-write pages
|
||||||
* Passing memory map: Allocate earliest pages and fill with UEFI's memory map
|
- Better page-allocation model?
|
||||||
stuctures?
|
- Allow for more than one IOAPIC in ACPI module
|
||||||
|
- The objects get created, but GSI lookup only uses the one at index 0
|
||||||
|
- mark kernel memory pages global
|
||||||
|
- Serial out based on circular/bip biffer and interrupts, not spinning on
|
||||||
|
`write_ready()`
|
||||||
|
- Split out more code into kutil for testing
|
||||||
|
- AHCI / MSI interrupts on Vbox break?
|
||||||
|
- FXSAVE to save XMM registers.
|
||||||
|
- optimization using #NM (0x7) to detect SSE usage
|
||||||
|
- Clean up of process memory maps
|
||||||
|
- Better stack tracer
|
||||||
|
- Bootloader rewrite
|
||||||
|
- C++ and sharing library code for ELF, initrd, etc
|
||||||
|
- Parse initrd and pre-load certain ELF images, eg the process loader process?
|
||||||
|
- Do initial memory bootstrap?
|
||||||
|
- Calling global ctors
|
||||||
|
- Device Tree
|
||||||
|
- Actual serial driver
|
||||||
|
- Disk driver
|
||||||
|
- File system
|
||||||
|
- Multiprocessing
|
||||||
|
- Fast syscalls using syscall/sysret
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
- Clean up build generator and its templates
|
||||||
|
- More robust objects to represent modules & targets to pass to templates
|
||||||
|
- Read project setup from a simple JSON/TOML/etc
|
||||||
|
- Better compartmentalizing when doing template inheritance
|
||||||
|
- Move to LLD as sysroot linker
|
||||||
|
|
||||||
|
|||||||
81
README.md
81
README.md
@@ -1,7 +1,78 @@
|
|||||||
# popcorn: A toy microkernel x64 UEFI OS
|
# jsix: A toy OS kernel
|
||||||
|
|
||||||
**popcorn** is a hobby OS for x64 UEFI environments to play with building a
|
**jsix** is the kernel for the hobby OS that I am currently building. It's
|
||||||
microkenerl architecture. It's far from finished, or even being usable - for
|
far from finished, or even being usable. Instead, it's a sandbox for me to play
|
||||||
now, it's a sandbox for me to explore the UEFI architecture, microkernels, and
|
with kernel-level code and explore architectures.
|
||||||
OS-related concepts that I want to play with.
|
|
||||||
|
The design goals of the project are:
|
||||||
|
|
||||||
|
* Modernity - I'm not interested in designing for legacy systems, or running on
|
||||||
|
all hardware out there. My target is only 64 bit architecutres, and modern
|
||||||
|
commodity hardware. Currently that means x64 systems with Nehalem or newer
|
||||||
|
CPUs and UEFI firmware. Eventually I'd like to work on an AArch64 port,
|
||||||
|
partly to force myself to factor out the architecture-dependent pieces of the
|
||||||
|
code base.
|
||||||
|
|
||||||
|
* Modularity - I'd like to pull as much of the system out into separate
|
||||||
|
processes as possible, in the microkernel fashion. A sub-goal of this is to
|
||||||
|
explore where the bottlenecks of such a microkernel are now, and whether
|
||||||
|
eschewing legacy hardware will let me design a system that's less bogged down
|
||||||
|
by the traditional microkernel problems. Given that there are no processes
|
||||||
|
yet, the kernel is monolithic by default.
|
||||||
|
|
||||||
|
* Exploration - I'm really mostly doing this to have fun learning and exploring
|
||||||
|
modern OS development. Modular design may be tossed out (hopefully
|
||||||
|
temporarily) in some places to allow me to play around with the related
|
||||||
|
hardware.
|
||||||
|
|
||||||
|
A note on the name: This kernel was originally named Popcorn, but I have since
|
||||||
|
discovered that the Popcorn Linux project is also developing a kernel with that
|
||||||
|
name, started around the same time as this project. So I've renamed this kernel
|
||||||
|
jsix (Always styled _jsix_ or `j6`, never capitalized) as an homage to L4, xv6,
|
||||||
|
and my wonderful wife.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
jsix uses the [Ninja][] build tool, and generates the build files for it with a
|
||||||
|
custom tool called [Bonnibel][]. Bonnibel can be installed with [Cargo][], or
|
||||||
|
downloaded as a prebuilt binary from its Github repository.
|
||||||
|
|
||||||
|
[Ninja]: https://ninja-build.org
|
||||||
|
[Bonnibel]: https://github.com/justinian/bonnibel
|
||||||
|
[Cargo]: https://crates.io/crates/bonnibel
|
||||||
|
|
||||||
|
Requrirements:
|
||||||
|
|
||||||
|
* bonnibel
|
||||||
|
* ninja
|
||||||
|
* clang
|
||||||
|
* nasm
|
||||||
|
* mtools
|
||||||
|
* curl for downloading the toolchain
|
||||||
|
|
||||||
|
### Setting up the cross toolchain
|
||||||
|
|
||||||
|
Running `pb sync` will download and unpack the toolchain into `sysroot`.
|
||||||
|
|
||||||
|
#### Compiling the toolchain yourself
|
||||||
|
|
||||||
|
If you have `clang` and `curl` installed, runing the `scripts/build_sysroot.sh`
|
||||||
|
script will download and build a LLVM toolchain configured for building jsix
|
||||||
|
host binaries.
|
||||||
|
|
||||||
|
### Building and running jsix
|
||||||
|
|
||||||
|
Once the toolchain has been set up, running Bonnibel's `pb init` command will
|
||||||
|
set up the build configuration, and `pb build` will actually run the build. If
|
||||||
|
you have `qemu-system-x86_64` installed, the `qemu.sh` script will to run jsix
|
||||||
|
in QEMU `-nographic` mode.
|
||||||
|
|
||||||
|
I personally run this either from a real debian amd64 testing/buster machine or
|
||||||
|
a windows WSL debian testing/buster installation. The following should be
|
||||||
|
enough to set up such a system to build the kernel:
|
||||||
|
|
||||||
|
sudo apt install qemu-system-x86 nasm clang-6.0 mtools curl
|
||||||
|
sudo update-alternatives /usr/bin/clang clang /usr/bin/clang-6.0 1000
|
||||||
|
sudo update-alternatives /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 1000
|
||||||
|
curl -L -o pb https://github.com/justinian/bonnibel/releases/download/2.0.0/pb_linux_amd64 && chmod a+x pb
|
||||||
|
|
||||||
|
|||||||
31
assets/debugging/jsix.elf-gdb.py
Normal file
31
assets/debugging/jsix.elf-gdb.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import gdb
|
||||||
|
|
||||||
|
class PrintStackCommand(gdb.Command):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__("popc_stack", gdb.COMMAND_DATA)
|
||||||
|
|
||||||
|
def invoke(self, arg, from_tty):
|
||||||
|
args = gdb.string_to_argv(arg)
|
||||||
|
|
||||||
|
base = "$rsp"
|
||||||
|
if len(args) > 0:
|
||||||
|
base = args[0]
|
||||||
|
|
||||||
|
depth = 22
|
||||||
|
if len(args) > 1:
|
||||||
|
depth = int(args[1])
|
||||||
|
|
||||||
|
for i in range(depth-1, -1, -1):
|
||||||
|
offset = i * 8
|
||||||
|
base_addr = gdb.parse_and_eval(base)
|
||||||
|
value = gdb.parse_and_eval(f"*(uint64_t*)({base} + {offset})")
|
||||||
|
print("{:016x} (+{:04x}): {:016x}".format(int(base_addr) + offset, offset, int(value)))
|
||||||
|
|
||||||
|
|
||||||
|
PrintStackCommand()
|
||||||
|
|
||||||
|
import time
|
||||||
|
time.sleep(3.5)
|
||||||
|
gdb.execute("target remote :1234")
|
||||||
|
gdb.execute("set waiting = false")
|
||||||
|
gdb.execute("display/i $rip")
|
||||||
BIN
assets/diskbase.img
Normal file
BIN
assets/diskbase.img
Normal file
Binary file not shown.
BIN
assets/floppy.img
Normal file
BIN
assets/floppy.img
Normal file
Binary file not shown.
28
assets/initrd.toml
Normal file
28
assets/initrd.toml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# This is the manifest for the initial ramdisk, read by the `makerd` tool.
|
||||||
|
# The contents should be a table array of files to add to the ramdistk:
|
||||||
|
#
|
||||||
|
# [[files]]
|
||||||
|
# dest = "foo.bar" # Name of the file in the ramdisk
|
||||||
|
# source = "build/foo/foo.bar" # Location of the file from the project root
|
||||||
|
# executable = true # Optional, default false. Whether this is an
|
||||||
|
# # initial application for the kernel to execute
|
||||||
|
# # on startup
|
||||||
|
|
||||||
|
[[files]]
|
||||||
|
dest = "vdso.so"
|
||||||
|
source = "host/libvdso.so"
|
||||||
|
type = "vdso"
|
||||||
|
|
||||||
|
[[files]]
|
||||||
|
dest = "screenfont.psf"
|
||||||
|
source = "../assets/fonts/tamsyn8x16r.psf"
|
||||||
|
|
||||||
|
[[files]]
|
||||||
|
dest = "nulldrv1"
|
||||||
|
source = "user/nulldrv"
|
||||||
|
type = "executable"
|
||||||
|
|
||||||
|
[[files]]
|
||||||
|
dest = "nulldrv2"
|
||||||
|
source = "user/nulldrv"
|
||||||
|
type = "executable"
|
||||||
Binary file not shown.
BIN
assets/ovmf/x64/ovmf_code.fd
Normal file
BIN
assets/ovmf/x64/ovmf_code.fd
Normal file
Binary file not shown.
BIN
assets/ovmf/x64/ovmf_vars.fd
Normal file
BIN
assets/ovmf/x64/ovmf_vars.fd
Normal file
Binary file not shown.
BIN
assets/ovmf/x64/ovmf_vars_d.fd
Normal file
BIN
assets/ovmf/x64/ovmf_vars_d.fd
Normal file
Binary file not shown.
17075
external/catch/catch.hpp
vendored
Normal file
17075
external/catch/catch.hpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3669
external/cpptoml/cpptoml.h
vendored
Normal file
3669
external/cpptoml/cpptoml.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
external/gnu-efi
vendored
1
external/gnu-efi
vendored
Submodule external/gnu-efi deleted from fc5af9e47f
6
make.bat
6
make.bat
@@ -1,6 +0,0 @@
|
|||||||
@echo off
|
|
||||||
if exist C:\Windows\Sysnative\bash.exe (
|
|
||||||
C:\Windows\Sysnative\bash.exe -c "make %*"
|
|
||||||
) else (
|
|
||||||
C:\Windows\System32\bash.exe -c "make %*"
|
|
||||||
)
|
|
||||||
35
modules.mk
35
modules.mk
@@ -1,35 +0,0 @@
|
|||||||
ifeq "$(MOD_NAME)" ""
|
|
||||||
include "you must specify a MOD_NAME"
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifndef SOURCES
|
|
||||||
SOURCES := $(wildcard src/modules/$(MOD_NAME)/*.c)
|
|
||||||
SOURCES += $(wildcard src/modules/$(MOD_NAME)/*.cpp)
|
|
||||||
SOURCES += $(wildcard src/modules/$(MOD_NAME)/*.s)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq "$(SOURCES)" ""
|
|
||||||
include "you must specify a SOURCES list"
|
|
||||||
endif
|
|
||||||
|
|
||||||
MOD_SRC_D := src/modules/$(MOD_NAME)
|
|
||||||
MOD_BUILD_D := $(BUILD_D)/d.$(MOD_NAME)
|
|
||||||
MOD_LIBNAME := $(BUILD_D)/lib$(MOD_NAME).a
|
|
||||||
MOD_TARGETS += $(MOD_LIBNAME)
|
|
||||||
|
|
||||||
OBJS_$(MOD_NAME) := $(patsubst %,build/d.%.o,$(patsubst src/modules/%,%,$(SOURCES)))
|
|
||||||
|
|
||||||
$(MOD_LIBNAME): $(OBJS_$(MOD_NAME))
|
|
||||||
$(AR) cr $@ $(OBJS_$(MOD_NAME))
|
|
||||||
|
|
||||||
$(MOD_BUILD_D)/%.c.o: $(MOD_SRC_D)/%.c $(INIT_DEP)
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(MOD_BUILD_D)/%.cpp.o: $(MOD_SRC_D)/%.cpp $(INIT_DEP)
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(MOD_BUILD_D)/%.s.o: $(MOD_SRC_D)/%.s $(BUILD_D)/versions.s $(INIT_DEP)
|
|
||||||
$(AS) $(ASFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
DEPS += $(patsubst %.o,%.d,$(OBJS_$(MOD_NAME)))
|
|
||||||
|
|
||||||
147
modules.yaml
Normal file
147
modules.yaml
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
name: jsix
|
||||||
|
templates: scripts/templates
|
||||||
|
modules:
|
||||||
|
kernel:
|
||||||
|
kind: exe
|
||||||
|
output: jsix.elf
|
||||||
|
target: host
|
||||||
|
deps:
|
||||||
|
- elf
|
||||||
|
- initrd
|
||||||
|
- kutil
|
||||||
|
- vdso
|
||||||
|
includes:
|
||||||
|
- src/kernel
|
||||||
|
source:
|
||||||
|
- src/kernel/crti.s
|
||||||
|
- src/kernel/apic.cpp
|
||||||
|
- src/kernel/assert.cpp
|
||||||
|
- src/kernel/boot.s
|
||||||
|
- src/kernel/console.cpp
|
||||||
|
- src/kernel/cpprt.cpp
|
||||||
|
- src/kernel/cpu.cpp
|
||||||
|
- src/kernel/debug.cpp
|
||||||
|
- src/kernel/debug.s
|
||||||
|
- src/kernel/device_manager.cpp
|
||||||
|
- src/kernel/font.cpp
|
||||||
|
- src/kernel/frame_allocator.cpp
|
||||||
|
- src/kernel/fs/gpt.cpp
|
||||||
|
- src/kernel/gdt.cpp
|
||||||
|
- src/kernel/gdt.s
|
||||||
|
- src/kernel/interrupts.cpp
|
||||||
|
- src/kernel/interrupts.s
|
||||||
|
- src/kernel/io.cpp
|
||||||
|
- src/kernel/loader.s
|
||||||
|
- src/kernel/log.cpp
|
||||||
|
- src/kernel/main.cpp
|
||||||
|
- src/kernel/memory_bootstrap.cpp
|
||||||
|
- src/kernel/msr.cpp
|
||||||
|
- src/kernel/objects/handle.cpp
|
||||||
|
- src/kernel/objects/kobject.cpp
|
||||||
|
- src/kernel/page_manager.cpp
|
||||||
|
- src/kernel/pci.cpp
|
||||||
|
- src/kernel/process.cpp
|
||||||
|
- src/kernel/scheduler.cpp
|
||||||
|
- src/kernel/screen.cpp
|
||||||
|
- src/kernel/serial.cpp
|
||||||
|
- src/kernel/syscall.cpp
|
||||||
|
- src/kernel/syscall.s
|
||||||
|
- src/kernel/syscalls/object.cpp
|
||||||
|
- src/kernel/syscalls/process.cpp
|
||||||
|
- src/kernel/task.s
|
||||||
|
- src/kernel/crtn.s
|
||||||
|
|
||||||
|
boot:
|
||||||
|
kind: exe
|
||||||
|
target: boot
|
||||||
|
output: boot.elf
|
||||||
|
source:
|
||||||
|
- src/boot/crt0.s
|
||||||
|
- src/boot/console.cpp
|
||||||
|
- src/boot/guids.cpp
|
||||||
|
- src/boot/loader.cpp
|
||||||
|
- src/boot/main.cpp
|
||||||
|
- src/boot/memory.cpp
|
||||||
|
- src/boot/reloc.cpp
|
||||||
|
- src/boot/utility.cpp
|
||||||
|
|
||||||
|
vdso:
|
||||||
|
kind: exe
|
||||||
|
target: host
|
||||||
|
output: libvdso.so
|
||||||
|
extra:
|
||||||
|
- src/arch/x86_64/vdso.ld
|
||||||
|
source:
|
||||||
|
- src/vdso/syscalls.cpp
|
||||||
|
- src/vdso/overrides.cpp
|
||||||
|
|
||||||
|
nulldrv:
|
||||||
|
kind: exe
|
||||||
|
target: user
|
||||||
|
output: nulldrv
|
||||||
|
source:
|
||||||
|
- src/drivers/nulldrv/main.cpp
|
||||||
|
- src/drivers/nulldrv/main.s
|
||||||
|
|
||||||
|
elf:
|
||||||
|
kind: lib
|
||||||
|
output: libelf.a
|
||||||
|
deps:
|
||||||
|
- kutil
|
||||||
|
includes:
|
||||||
|
- src/libraries/elf/include
|
||||||
|
source:
|
||||||
|
- src/libraries/elf/elf.cpp
|
||||||
|
|
||||||
|
initrd:
|
||||||
|
kind: lib
|
||||||
|
output: libinitrd.a
|
||||||
|
deps:
|
||||||
|
- kutil
|
||||||
|
includes:
|
||||||
|
- src/libraries/initrd/include
|
||||||
|
source:
|
||||||
|
- src/libraries/initrd/initrd.cpp
|
||||||
|
|
||||||
|
kutil:
|
||||||
|
kind: lib
|
||||||
|
output: libkutil.a
|
||||||
|
includes:
|
||||||
|
- src/libraries/kutil/include
|
||||||
|
source:
|
||||||
|
- src/libraries/kutil/assert.cpp
|
||||||
|
- src/libraries/kutil/bip_buffer.cpp
|
||||||
|
- src/libraries/kutil/heap_allocator.cpp
|
||||||
|
- src/libraries/kutil/logger.cpp
|
||||||
|
- src/libraries/kutil/memory.cpp
|
||||||
|
- src/libraries/kutil/printf.c
|
||||||
|
- src/libraries/kutil/vm_space.cpp
|
||||||
|
|
||||||
|
makerd:
|
||||||
|
kind: exe
|
||||||
|
target: native
|
||||||
|
output: makerd
|
||||||
|
deps:
|
||||||
|
- initrd
|
||||||
|
source:
|
||||||
|
- src/tools/makerd/entry.cpp
|
||||||
|
- src/tools/makerd/main.cpp
|
||||||
|
|
||||||
|
tests:
|
||||||
|
kind: exe
|
||||||
|
target: native
|
||||||
|
output: tests
|
||||||
|
deps:
|
||||||
|
- kutil
|
||||||
|
source:
|
||||||
|
- src/tests/address_manager.cpp
|
||||||
|
- src/tests/constexpr_hash.cpp
|
||||||
|
- src/tests/linked_list.cpp
|
||||||
|
- src/tests/logger.cpp
|
||||||
|
- src/tests/heap_allocator.cpp
|
||||||
|
- src/tests/main.cpp
|
||||||
|
overlays:
|
||||||
|
- url: https://f000.backblazeb2.com/file/jsix-os/sysroot-llvm8-20190706.tar.bz2
|
||||||
|
path: sysroot
|
||||||
|
- url: https://f000.backblazeb2.com/file/jsix-os/sysroot-j6libc-8cb8ce7.tar.bz2
|
||||||
|
path: sysroot
|
||||||
132
other_software.md
Normal file
132
other_software.md
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
# Included works
|
||||||
|
|
||||||
|
jsix includes and/or is derived from a number of other works, listed here.
|
||||||
|
|
||||||
|
## Catch2
|
||||||
|
|
||||||
|
jsix uses [Catch2][] for testing. Catch2 is released under the terms of the
|
||||||
|
Boost Software license:
|
||||||
|
|
||||||
|
[Catch2]: https://github.com/catchorg/Catch2
|
||||||
|
|
||||||
|
> Boost Software License - Version 1.0 - August 17th, 2003
|
||||||
|
>
|
||||||
|
> Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
> obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
> this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
> execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
> Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
> do so, all subject to the following:
|
||||||
|
>
|
||||||
|
> The copyright notices in the Software and this entire statement, including
|
||||||
|
> the above license grant, this restriction and the following disclaimer,
|
||||||
|
> must be included in all copies of the Software, in whole or in part, and
|
||||||
|
> all derivative works of the Software, unless such copies or derivative
|
||||||
|
> works are solely in the form of machine-executable object code generated by
|
||||||
|
> a source language processor.
|
||||||
|
>
|
||||||
|
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
> FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
> SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
> FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
> ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
> DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
## cpptoml
|
||||||
|
|
||||||
|
jsix uses the [cpptoml][] library for parsing TOML configuration files. cpptoml
|
||||||
|
is released under the terms of the MIT license:
|
||||||
|
|
||||||
|
[cpptoml]: https://github.com/skystrife/cpptoml
|
||||||
|
|
||||||
|
> Copyright (c) 2014 Chase Geigle
|
||||||
|
>
|
||||||
|
> Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
> this software and associated documentation files (the "Software"), to deal in
|
||||||
|
> the Software without restriction, including without limitation the rights to
|
||||||
|
> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
> the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
> subject to the following conditions:
|
||||||
|
>
|
||||||
|
> The above copyright notice and this permission notice shall be included in all
|
||||||
|
> copies or substantial portions of the Software.
|
||||||
|
>
|
||||||
|
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
## printf
|
||||||
|
|
||||||
|
jsix uses Marco Paland's tiny [printf][] library for its `*printf()` functions,
|
||||||
|
which is also released under the terms of the MIT license:
|
||||||
|
|
||||||
|
[printf]: https://github.com/mpaland/printf
|
||||||
|
|
||||||
|
> The MIT License (MIT)
|
||||||
|
>
|
||||||
|
> Copyright (c) 2014 Marco Paland
|
||||||
|
>
|
||||||
|
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
> of this software and associated documentation files (the "Software"), to deal
|
||||||
|
> in the Software without restriction, including without limitation the rights
|
||||||
|
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
> copies of the Software, and to permit persons to whom the Software is
|
||||||
|
> furnished to do so, subject to the following conditions:
|
||||||
|
>
|
||||||
|
> The above copyright notice and this permission notice shall be included in all
|
||||||
|
> copies or substantial portions of the Software.
|
||||||
|
>
|
||||||
|
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
> SOFTWARE.
|
||||||
|
|
||||||
|
## GNU-EFI
|
||||||
|
|
||||||
|
jsix's UEFI bootloader initially used [GNU-EFI][], and still uses one file (the
|
||||||
|
linker script for the bootloader) from that project. GNU-EFI claims to be
|
||||||
|
released under the BSD license. Again, I could not find its specific license
|
||||||
|
file, so I am reproducing a generic 3-clause BSD license (the most restrictive,
|
||||||
|
so as not to assume any extra rights that may not actually be granted) for it
|
||||||
|
here:
|
||||||
|
|
||||||
|
[GNU-EFI]: https://gnu-efi.sourceforge.net
|
||||||
|
|
||||||
|
> Copyright (c) Nigel Croxon
|
||||||
|
>
|
||||||
|
> Redistribution and use in source and binary forms, with or without
|
||||||
|
> modification, are permitted provided that the following conditions are met:
|
||||||
|
>
|
||||||
|
> 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
> list of conditions and the following disclaimer.
|
||||||
|
>
|
||||||
|
> 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
> this list of conditions and the following disclaimer in the documentation
|
||||||
|
> and/or other materials provided with the distribution.
|
||||||
|
>
|
||||||
|
> 3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
> may be used to endorse or promote products derived from this software
|
||||||
|
> without specific prior written permission.
|
||||||
|
>
|
||||||
|
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
> ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
> WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
## Intel EFI Application Toolkit
|
||||||
|
|
||||||
|
jsix's UEFI loader uses code from Intel's EFI Application toolkit. Relevant
|
||||||
|
code includes license statements at the top of each file.
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
#
|
|
||||||
# parse_version.py - Create a NASM version definition file given
|
|
||||||
# version inputs. Usage:
|
|
||||||
#
|
|
||||||
# parse_version.py <git-describe version> <git short sha>
|
|
||||||
|
|
||||||
|
|
||||||
def split_version(version_string):
|
|
||||||
major, minor, patch_dirty = version_string.split(".")
|
|
||||||
patch_dirty = patch_dirty.split("-")
|
|
||||||
|
|
||||||
return major, minor, patch_dirty[0], len(patch_dirty) > 1
|
|
||||||
|
|
||||||
|
|
||||||
def make_nasm(major, minor, patch, dirty, sha):
|
|
||||||
if dirty:
|
|
||||||
dirty = "1"
|
|
||||||
else:
|
|
||||||
dirty = "0"
|
|
||||||
|
|
||||||
lines = [
|
|
||||||
"%define VERSION_MAJOR {}".format(major),
|
|
||||||
"%define VERSION_MINOR {}".format(minor),
|
|
||||||
"%define VERSION_PATCH {}".format(patch),
|
|
||||||
"%define VERSION_GITSHA 0x{}{}".format(dirty, sha),
|
|
||||||
]
|
|
||||||
return "\n".join(lines)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import sys
|
|
||||||
if len(sys.argv) != 3:
|
|
||||||
print("Usage: {} <desc version> <git sha>".format(sys.argv[0]), file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
print(make_nasm(*split_version(sys.argv[1]), sys.argv[2]))
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
call make.bat
|
|
||||||
qemu-system-x86_64.exe -bios .\assets\ovmf\x64\OVMF.fd -hda .\build\fs.img -m 512 -vga cirrus
|
|
||||||
1
qemu.bat
1
qemu.bat
@@ -1 +0,0 @@
|
|||||||
qemu-system-x86_64.exe -bios .\assets\ovmf\x64\OVMF.fd -hda .\build\fs.img -m 512 -nographic -echr 23
|
|
||||||
65
qemu.sh
Executable file
65
qemu.sh
Executable file
@@ -0,0 +1,65 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
build="$(dirname $0)/build"
|
||||||
|
assets="$(dirname $0)/assets"
|
||||||
|
debug=""
|
||||||
|
flash_name="ovmf_vars"
|
||||||
|
gfx="-nographic"
|
||||||
|
kvm=""
|
||||||
|
cpu="Broadwell,+pdpe1gb"
|
||||||
|
|
||||||
|
for arg in $@; do
|
||||||
|
case "${arg}" in
|
||||||
|
--debug)
|
||||||
|
debug="-s"
|
||||||
|
flash_name="ovmf_vars_d"
|
||||||
|
;;
|
||||||
|
--gfx)
|
||||||
|
gfx=""
|
||||||
|
;;
|
||||||
|
--kvm)
|
||||||
|
kvm="-enable-kvm"
|
||||||
|
cpu="host"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
build="${arg}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ! -c /dev/kvm ]]; then
|
||||||
|
kvm=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! ninja -C "${build}"; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n $TMUX ]]; then
|
||||||
|
if [[ -n $debug ]]; then
|
||||||
|
tmux split-window "gdb ${build}/jsix.elf" &
|
||||||
|
else
|
||||||
|
tmux split-window -l 10 "sleep 1; telnet localhost 45454" &
|
||||||
|
fi
|
||||||
|
elif [[ $DESKTOP_SESSION = "i3" ]]; then
|
||||||
|
if [[ -n $debug ]]; then
|
||||||
|
i3-msg exec i3-sensible-terminal -- -e "gdb ${PWD}/${build}/jsix.elf" &
|
||||||
|
else
|
||||||
|
i3-msg exec i3-sensible-terminal -- -e 'telnet localhost 45454' &
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec qemu-system-x86_64 \
|
||||||
|
-drive "if=pflash,format=raw,readonly,file=${assets}/ovmf/x64/ovmf_code.fd" \
|
||||||
|
-drive "if=pflash,format=raw,file=${build}/${flash_name}.fd" \
|
||||||
|
-drive "format=raw,file=${build}/jsix.img" \
|
||||||
|
-device "isa-debug-exit,iobase=0xf4,iosize=0x04" \
|
||||||
|
-monitor telnet:localhost:45454,server,nowait \
|
||||||
|
-smp 4 \
|
||||||
|
-m 512 \
|
||||||
|
-d mmu,int,guest_errors \
|
||||||
|
-D jsix.log \
|
||||||
|
-cpu "${cpu}" \
|
||||||
|
-M q35 \
|
||||||
|
-no-reboot \
|
||||||
|
$gfx $kvm $debug
|
||||||
131
scripts/build_sysroot.sh
Executable file
131
scripts/build_sysroot.sh
Executable file
@@ -0,0 +1,131 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
TARGET="x86_64-elf"
|
||||||
|
LLVM_BRANCH="release_80"
|
||||||
|
|
||||||
|
TOOLS="clang lld" # lld libunwind libcxxabi libcxx"
|
||||||
|
PROJECTS="compiler-rt libcxxabi libcxx libunwind"
|
||||||
|
#RUNTIMES="compiler-rt libcxxabi libcxx libunwind"
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
README=$(realpath "$(dirname $0)/readme_for_prebuilt_sysroots.md")
|
||||||
|
SYSROOT=$(realpath "$(dirname $0)/../sysroot")
|
||||||
|
WORK=$(realpath "$(dirname $0)/sysroot")
|
||||||
|
mkdir -p "${SYSROOT}"
|
||||||
|
mkdir -p "${WORK}"
|
||||||
|
|
||||||
|
export CC=clang
|
||||||
|
export CXX=clang++
|
||||||
|
|
||||||
|
if [[ ! -d "${WORK}/llvm" ]]; then
|
||||||
|
echo "Downloading LLVM..."
|
||||||
|
git clone -q \
|
||||||
|
--branch "${LLVM_BRANCH}" \
|
||||||
|
--depth 1 \
|
||||||
|
"https://git.llvm.org/git/llvm.git" "${WORK}/llvm"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tool in ${TOOLS}; do
|
||||||
|
if [[ ! -d "${WORK}/llvm/tools/${tool}" ]]; then
|
||||||
|
echo "Downloading ${tool}..."
|
||||||
|
git clone -q \
|
||||||
|
--branch "${LLVM_BRANCH}" \
|
||||||
|
--depth 1 \
|
||||||
|
"https://git.llvm.org/git/${tool}.git" "${WORK}/llvm/tools/${tool}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ! -d "${WORK}/llvm/tools/clang/tools/extra" ]]; then
|
||||||
|
echo "Downloading clang-tools-extra..."
|
||||||
|
git clone -q \
|
||||||
|
--branch "${LLVM_BRANCH}" \
|
||||||
|
--depth 1 \
|
||||||
|
"https://git.llvm.org/git/clang-tools-extra.git" "${WORK}/llvm/tools/clang/tools/extra"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for proj in ${PROJECTS}; do
|
||||||
|
if [[ ! -d "${WORK}/llvm/projects/${proj}" ]]; then
|
||||||
|
echo "Downloading ${proj}..."
|
||||||
|
git clone -q \
|
||||||
|
--branch "${LLVM_BRANCH}" \
|
||||||
|
--depth 1 \
|
||||||
|
"https://git.llvm.org/git/${proj}.git" "${WORK}/llvm/projects/${proj}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for proj in ${RUNTIMES}; do
|
||||||
|
if [[ ! -d "${WORK}/llvm/runtimes/${proj}" ]]; then
|
||||||
|
echo "Downloading ${proj}..."
|
||||||
|
git clone -q \
|
||||||
|
--branch "${LLVM_BRANCH}" \
|
||||||
|
--depth 1 \
|
||||||
|
"https://git.llvm.org/git/${proj}.git" "${WORK}/llvm/runtime/${proj}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
mkdir -p "${WORK}/build/llvm"
|
||||||
|
pushd "${WORK}/build/llvm"
|
||||||
|
|
||||||
|
echo "Configuring LLVM..."
|
||||||
|
|
||||||
|
cmake -G Ninja \
|
||||||
|
-DCLANG_DEFAULT_RTLIB=compiler-rt \
|
||||||
|
-DCLANG_DEFAULT_STD_C=c11 \
|
||||||
|
-DCLANG_DEFAULT_STD_CXX=cxx14 \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_C_COMPILER="clang" \
|
||||||
|
-DCMAKE_CXX_COMPILER="clang++" \
|
||||||
|
-DCMAKE_CXX_FLAGS="-Wno-unused-parameter -D_LIBCPP_HAS_NO_ALIGNED_ALLOCATION -D_LIBUNWIND_IS_BAREMETAL=1 -U_LIBUNWIND_SUPPORT_DWARF_UNWIND" \
|
||||||
|
-DCMAKE_INSTALL_PREFIX="${SYSROOT}" \
|
||||||
|
-DCMAKE_MAKE_PROGRAM=`which ninja` \
|
||||||
|
-DDEFAULT_SYSROOT="${SYSROOT}" \
|
||||||
|
-DLIBCXX_CXX_ABI=libcxxabi \
|
||||||
|
-DLIBCXX_CXX_ABI_INCLUDE_PATHS="${WORK}/llvm/projects/libcxxabi/include" \
|
||||||
|
-DLIBCXX_CXX_ABI_LIBRARY_PATH=lib \
|
||||||
|
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
|
||||||
|
-DLIBCXX_ENABLE_NEW_DELETE_DEFINITIONS=ON \
|
||||||
|
-DLIBCXX_ENABLE_SHARED=OFF \
|
||||||
|
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON \
|
||||||
|
-DLIBCXX_ENABLE_THREADS=OFF \
|
||||||
|
-DLIBCXX_INCLUDE_BENCHMARKS=OFF \
|
||||||
|
-DLIBCXX_USE_COMPILER_RT=ON \
|
||||||
|
-DLIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS=OFF \
|
||||||
|
-DLIBCXXABI_ENABLE_SHARED=OFF \
|
||||||
|
-DLIBCXXABI_ENABLE_STATIC_UNWINDER=ON \
|
||||||
|
-DLIBCXXABI_ENABLE_THREADS=OFF \
|
||||||
|
-DLIBCXXABI_LIBCXX_PATH="${WORK}/llvm/projects/libcxx" \
|
||||||
|
-DLIBCXXABI_USE_COMPILER_RT=ON \
|
||||||
|
-DLIBCXXABI_USE_LLVM_UNWINDER=ON \
|
||||||
|
-DLIBUNWIND_ENABLE_SHARED=OFF \
|
||||||
|
-DLIBUNWIND_ENABLE_THREADS=OFF \
|
||||||
|
-DLIBUNWIND_USE_COMPILER_RT=ON \
|
||||||
|
-DLLVM_CONFIG_PATH="${SYSROOT}/bin/llvm-config" \
|
||||||
|
-DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-unknown-elf" \
|
||||||
|
-DLLVM_ENABLE_LIBCXX=ON \
|
||||||
|
-DLLVM_ENABLE_LLD=ON \
|
||||||
|
-DLLVM_ENABLE_PIC=OFF \
|
||||||
|
-DLLVM_ENABLE_THREADS=OFF \
|
||||||
|
-DLLVM_INSTALL_BINUTILS_SYMLINKS=ON \
|
||||||
|
-DLLVM_TARGETS_TO_BUILD="X86" \
|
||||||
|
${WORK}/llvm > cmake_configure.log
|
||||||
|
|
||||||
|
# -DCMAKE_ASM_COMPILER=nasm \
|
||||||
|
# -DCMAKE_LINKER="${SYSROOT}/bin/ld.lld" \
|
||||||
|
# -DCOMPILER_RT_ENABLE_LLD=ON \
|
||||||
|
# -DLIBCXX_ENABLE_LLD=ON \
|
||||||
|
# -DLIBCXX_ENABLE_STATIC_UNWINDER=ON \
|
||||||
|
# -DLIBCXXABI_ENABLE_LLD=ON \
|
||||||
|
# -DLIBUNWIND_ENABLE_LLD=ON \
|
||||||
|
# -DLLVM_ENABLE_PROJECTS="libcxx;libcxxabi;libunwind;compiler-rt" \
|
||||||
|
# -DCOMPILER_RT_BAREMETAL_BUILD=ON \
|
||||||
|
# -DLIBCXXABI_BAREMETAL=ON \
|
||||||
|
|
||||||
|
echo "Building LLVM..."
|
||||||
|
ninja && ninja install
|
||||||
|
ninja cxx cxxabi compiler-rt
|
||||||
|
ninja install-compiler-rt install-cxx install-cxxabi
|
||||||
|
popd
|
||||||
|
|
||||||
|
|
||||||
|
cp "${README}" "${SYSROOT}/README.md"
|
||||||
60
scripts/parse_memmap.py
Executable file
60
scripts/parse_memmap.py
Executable file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from struct import unpack_from, calcsize
|
||||||
|
import sys
|
||||||
|
|
||||||
|
memory_type_names = {
|
||||||
|
0: "EfiReservedMemoryType",
|
||||||
|
1: "EfiLoaderCode",
|
||||||
|
2: "EfiLoaderData",
|
||||||
|
3: "EfiBootServicesCode",
|
||||||
|
4: "EfiBootServicesData",
|
||||||
|
5: "EfiRuntimeServicesCode",
|
||||||
|
6: "EfiRuntimeServicesData",
|
||||||
|
7: "EfiConventionalMemory",
|
||||||
|
8: "EfiUnusableMemory",
|
||||||
|
9: "EfiACPIReclaimMemory",
|
||||||
|
10: "EfiACPIMemoryNVS",
|
||||||
|
11: "EfiMemoryMappedIO",
|
||||||
|
12: "EfiMemoryMappedIOPortSpace",
|
||||||
|
13: "EfiPalCode",
|
||||||
|
14: "EfiPersistentMemory",
|
||||||
|
|
||||||
|
0x80000000: "Kernel Image",
|
||||||
|
0x80000001: "Kernel Data",
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_MEMORY_UC = 0x0000000000000001
|
||||||
|
EFI_MEMORY_WC = 0x0000000000000002
|
||||||
|
EFI_MEMORY_WT = 0x0000000000000004
|
||||||
|
EFI_MEMORY_WB = 0x0000000000000008
|
||||||
|
EFI_MEMORY_UCE = 0x0000000000000010
|
||||||
|
EFI_MEMORY_WP = 0x0000000000001000
|
||||||
|
EFI_MEMORY_RP = 0x0000000000002000
|
||||||
|
EFI_MEMORY_XP = 0x0000000000004000
|
||||||
|
EFI_MEMORY_NV = 0x0000000000008000
|
||||||
|
EFI_MEMORY_MORE_RELIABLE = 0x0000000000010000
|
||||||
|
EFI_MEMORY_RO = 0x0000000000020000
|
||||||
|
EFI_MEMORY_RUNTIME = 0x8000000000000000
|
||||||
|
|
||||||
|
fmt = "LQQQQQ"
|
||||||
|
size = calcsize(fmt)
|
||||||
|
|
||||||
|
print("Descriptor size: {} bytes\n".format(size))
|
||||||
|
if size != 48:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
data = open(sys.argv[1], 'rb').read()
|
||||||
|
length = len(data)
|
||||||
|
consumed = 0
|
||||||
|
|
||||||
|
while length - consumed > size:
|
||||||
|
memtype, phys, virt, pages, attr, pad = unpack_from(fmt, data, consumed)
|
||||||
|
consumed += size
|
||||||
|
if pages == 0: break
|
||||||
|
|
||||||
|
memtype = memory_type_names.get(memtype, "{:016x}".format(memtype))
|
||||||
|
runtime = {EFI_MEMORY_RUNTIME: "*"}.get(attr & EFI_MEMORY_RUNTIME, " ")
|
||||||
|
|
||||||
|
print("{:>23}{} {:016x} {:016x} [{:4d}]".format(memtype, runtime, phys, virt, pages))
|
||||||
|
|
||||||
10
scripts/parse_syms.py
Executable file
10
scripts/parse_syms.py
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def parse_elf(filename):
|
||||||
|
import struct
|
||||||
|
with open(filename, 'rb') as elf:
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
for arg in sys.argv[1:]:
|
||||||
|
parse_elf(arg)
|
||||||
14
scripts/readme_for_prebuilt_sysroots.md
Normal file
14
scripts/readme_for_prebuilt_sysroots.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# jsix OS sysroot
|
||||||
|
|
||||||
|
This is a pre-built sysroot for building the jsix operating system kernel,
|
||||||
|
bootloader, and utilities. This package is provided as a convenience, and
|
||||||
|
contains software from the following repositories.
|
||||||
|
|
||||||
|
## The LLVM toolchain
|
||||||
|
|
||||||
|
The LLVM sources as downloaded via git from [llvm.org][llvm] under the terms of
|
||||||
|
the [Apache License v2.0][apache2], modified [as described here][llvmlic].
|
||||||
|
|
||||||
|
[llvm]: https://llvm.org
|
||||||
|
[apache2]: https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
[llvmlic]: https://llvm.org/docs/DeveloperPolicy.html#new-llvm-project-license-framework
|
||||||
208
scripts/templates/build.ninja.j2
Normal file
208
scripts/templates/build.ninja.j2
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
ninja_required_version = 1.3
|
||||||
|
builddir = {{ buildroot }}
|
||||||
|
srcroot = {{ srcroot }}
|
||||||
|
modulefile = {{ modulefile }}
|
||||||
|
|
||||||
|
{%- for var, value in vars %}
|
||||||
|
{{ var }} = {{ value }}
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
|
warnflags = $
|
||||||
|
-Wformat=2 $
|
||||||
|
-Winit-self $
|
||||||
|
-Wfloat-equal $
|
||||||
|
-Winline $
|
||||||
|
-Wmissing-format-attribute $
|
||||||
|
-Wmissing-include-dirs $
|
||||||
|
-Wswitch $
|
||||||
|
-Wundef $
|
||||||
|
-Wdisabled-optimization $
|
||||||
|
-Wpointer-arith $
|
||||||
|
-Wno-attributes $
|
||||||
|
-Wno-sign-compare $
|
||||||
|
-Wno-multichar $
|
||||||
|
-Wno-div-by-zero $
|
||||||
|
-Wno-endif-labels $
|
||||||
|
-Wno-pragmas $
|
||||||
|
-Wno-format-extra-args $
|
||||||
|
-Wno-unused-result $
|
||||||
|
-Wno-deprecated-declarations $
|
||||||
|
-Wno-unused-function $
|
||||||
|
-Werror
|
||||||
|
|
||||||
|
ccflags = $
|
||||||
|
-I${srcroot}/src/include $
|
||||||
|
-I${srcroot}/src/include/x86_64 $
|
||||||
|
-fcolor-diagnostics $
|
||||||
|
-DVERSION_MAJOR={{ version_major }} $
|
||||||
|
-DVERSION_MINOR={{ version_minor }} $
|
||||||
|
-DVERSION_PATCH={{ version_patch }} $
|
||||||
|
-DVERSION_GITSHA=0x0{{ version_sha }} $
|
||||||
|
-DGIT_VERSION=\"{{ version }}\" $
|
||||||
|
-DGIT_VERSION_WIDE=L\"{{ version }}\" $
|
||||||
|
$warnflags
|
||||||
|
|
||||||
|
asflags = $
|
||||||
|
-I${srcroot}/src/include $
|
||||||
|
-DVERSION_MAJOR={{ version_major }} $
|
||||||
|
-DVERSION_MINOR={{ version_minor }} $
|
||||||
|
-DVERSION_PATCH={{ version_patch }} $
|
||||||
|
-DVERSION_GITSHA=0x{{ version_sha }}
|
||||||
|
|
||||||
|
cflags = -std=c11
|
||||||
|
cxxflags = -std=c++14
|
||||||
|
libs =
|
||||||
|
|
||||||
|
rule c
|
||||||
|
deps = gcc
|
||||||
|
depfile = $out.d
|
||||||
|
description = Compiling $name
|
||||||
|
command = $cc -MMD -MF $out.d $ccflags $cflags -o $out -c $in
|
||||||
|
|
||||||
|
rule dump_c_defs
|
||||||
|
description = Dumping C defines for $target
|
||||||
|
command = echo "" | $cc $ccflags $cflags -dM -E - > $out
|
||||||
|
|
||||||
|
rule dump_c_run
|
||||||
|
description = Dumping C arguments for $target
|
||||||
|
command = $
|
||||||
|
echo "#!/bin/bash" > $out; $
|
||||||
|
echo '$cc $ccflags $cflags $$*' > $out; $
|
||||||
|
chmod a+x $out
|
||||||
|
|
||||||
|
rule cpp
|
||||||
|
deps = gcc
|
||||||
|
depfile = $out.d
|
||||||
|
description = Compiling $name
|
||||||
|
command = $cxx -MMD -MF $out.d $cxxflags $ccflags -o $out -c $in
|
||||||
|
|
||||||
|
rule dump_cpp_defs
|
||||||
|
description = Dumping C++ defines for $target
|
||||||
|
command = echo "" | $cxx -x c++ $cxxflags $ccflags -dM -E - > $out
|
||||||
|
|
||||||
|
rule dump_cpp_run
|
||||||
|
description = Dumping C++ arguments for $target
|
||||||
|
command = $
|
||||||
|
echo "#!/bin/bash" > $out; $
|
||||||
|
echo '$cc $cxxflags $ccflags $$*' > $out; $
|
||||||
|
chmod a+x $out
|
||||||
|
|
||||||
|
rule s
|
||||||
|
deps = gcc
|
||||||
|
depfile = $out.d
|
||||||
|
description = Assembling $name
|
||||||
|
command = $nasm -o $out -felf64 -MD $out.d $asflags $in
|
||||||
|
|
||||||
|
rule exe
|
||||||
|
description = Linking $name
|
||||||
|
command = $ld $ldflags -o $out $in $libs
|
||||||
|
|
||||||
|
rule lib
|
||||||
|
description = Archiving $name
|
||||||
|
command = $ar qcs $out $in
|
||||||
|
|
||||||
|
rule regen
|
||||||
|
generator = true
|
||||||
|
description = Regenrating build files
|
||||||
|
command = $
|
||||||
|
{{ generator }} $
|
||||||
|
--file $modulefile $
|
||||||
|
--dir $builddir $
|
||||||
|
generate
|
||||||
|
|
||||||
|
rule cp
|
||||||
|
description = Copying $name
|
||||||
|
command = cp $in $out
|
||||||
|
|
||||||
|
rule dump
|
||||||
|
description = Dumping decompiled $name
|
||||||
|
command = objdump -DSC -M intel $in > $out
|
||||||
|
|
||||||
|
rule makerd
|
||||||
|
description = Making init ramdisk
|
||||||
|
command = $builddir/native/makerd $in $out
|
||||||
|
|
||||||
|
rule makeefi
|
||||||
|
description = Converting $name
|
||||||
|
command = objcopy $
|
||||||
|
-j .text $
|
||||||
|
-j .sdata $
|
||||||
|
-j .data $
|
||||||
|
-j .dynamic $
|
||||||
|
-j .dynsym $
|
||||||
|
-j .rel $
|
||||||
|
-j .rela $
|
||||||
|
-j .reloc $
|
||||||
|
--target=efi-app-x86_64 $
|
||||||
|
$in $out
|
||||||
|
|
||||||
|
rule makefat
|
||||||
|
description = Creating $name
|
||||||
|
command = $
|
||||||
|
cp $srcroot/assets/diskbase.img $out; $
|
||||||
|
mcopy -s -D o -i $out@@1M $builddir/fatroot/* ::/
|
||||||
|
|
||||||
|
rule strip
|
||||||
|
description = Stripping $name
|
||||||
|
command = $
|
||||||
|
cp $in $out; $
|
||||||
|
objcopy --only-keep-debug $out $out.debug; $
|
||||||
|
strip -g $out; $
|
||||||
|
objcopy --add-gnu-debuglink=$out.debug $out
|
||||||
|
|
||||||
|
{% for target in targets %}
|
||||||
|
subninja {{ target }}/target.ninja
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
build $
|
||||||
|
{%- for buildfile in buildfiles %}
|
||||||
|
{{ buildfile }} $
|
||||||
|
{%- endfor %}
|
||||||
|
: regen | $
|
||||||
|
{%- for template in templates %}
|
||||||
|
{{ template }} $
|
||||||
|
{%- endfor %}
|
||||||
|
$modulefile $
|
||||||
|
{{ generator }}
|
||||||
|
|
||||||
|
build $builddir/ovmf_vars.fd : cp $srcroot/assets/ovmf/x64/ovmf_vars.fd
|
||||||
|
name = ovmf_vars.fd
|
||||||
|
|
||||||
|
build $builddir/ovmf_vars_d.fd : cp $srcroot/assets/ovmf/x64/ovmf_vars_d.fd
|
||||||
|
name = ovmf_vars_d.fd
|
||||||
|
|
||||||
|
build $builddir/jsix.elf | $builddir/jsix.elf.debug : strip $builddir/host/jsix.elf
|
||||||
|
name = kernel
|
||||||
|
|
||||||
|
build $builddir/jsix.dump : dump $builddir/host/jsix.elf
|
||||||
|
name = kernel
|
||||||
|
|
||||||
|
build $builddir/jsix.elf-gdb.py : cp ${srcroot}/assets/debugging/jsix.elf-gdb.py
|
||||||
|
name = kernel debug python scripts
|
||||||
|
|
||||||
|
build $builddir/fatroot/jsix.elf : cp $builddir/jsix.elf
|
||||||
|
name = kernel to FAT image
|
||||||
|
|
||||||
|
build $builddir/fatroot/efi/boot/bootx64.efi : cp $builddir/boot/boot.efi
|
||||||
|
name = bootloader to FAT image
|
||||||
|
|
||||||
|
build $builddir/fatroot/initrd.img : makerd ${srcroot}/assets/initrd.toml | $
|
||||||
|
${builddir}/host/libvdso.so $
|
||||||
|
${builddir}/native/makerd $
|
||||||
|
${builddir}/user/nulldrv
|
||||||
|
|
||||||
|
build $builddir/jsix.img : makefat | $
|
||||||
|
$builddir/fatroot/initrd.img $
|
||||||
|
$builddir/fatroot/jsix.elf $
|
||||||
|
$builddir/fatroot/efi/boot/bootx64.efi
|
||||||
|
name = jsix.img
|
||||||
|
|
||||||
|
default $
|
||||||
|
$builddir/ovmf_vars.fd $
|
||||||
|
$builddir/ovmf_vars_d.fd $
|
||||||
|
$builddir/jsix.dump $
|
||||||
|
$builddir/jsix.elf-gdb.py $
|
||||||
|
$builddir/jsix.img
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
27
scripts/templates/exe.boot.j2
Normal file
27
scripts/templates/exe.boot.j2
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{% extends "exe.default.j2" %}
|
||||||
|
{% block variables %}
|
||||||
|
{{ super() }}
|
||||||
|
|
||||||
|
ccflags = $ccflags $
|
||||||
|
-DKERNEL_FILENAME=L\"jsix.elf\" $
|
||||||
|
-DGNU_EFI_USE_MS_ABI $
|
||||||
|
-DHAVE_USE_MS_ABI $
|
||||||
|
-DEFI_DEBUG=0 $
|
||||||
|
-DEFI_DEBUG_CLEAR_MEMORY=0 $
|
||||||
|
-DBOOTLOADER_DEBUG
|
||||||
|
|
||||||
|
ldflags = $ldflags $
|
||||||
|
-T ${srcroot}/src/arch/x86_64/boot.ld $
|
||||||
|
-shared
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block extra %}
|
||||||
|
|
||||||
|
build $builddir/boot.efi : makeefi ${builddir}/{{ module.output }}
|
||||||
|
name = boot.efi
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
8
scripts/templates/exe.default.j2
Normal file
8
scripts/templates/exe.default.j2
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{% extends "module.base.j2" %}
|
||||||
|
{% block variables %}
|
||||||
|
{{ super() }}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
12
scripts/templates/exe.kernel.j2
Normal file
12
scripts/templates/exe.kernel.j2
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{% extends "exe.default.j2" %}
|
||||||
|
{% block variables %}
|
||||||
|
{{ super() }}
|
||||||
|
|
||||||
|
asflags = $asflags -I${srcroot}/src/kernel/
|
||||||
|
libs = $libs
|
||||||
|
ldflags = $ldflags -T ${srcroot}/src/arch/x86_64/kernel.ld
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
10
scripts/templates/exe.makerd.j2
Normal file
10
scripts/templates/exe.makerd.j2
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% extends "exe.default.j2" %}
|
||||||
|
{% block variables %}
|
||||||
|
{{ super() }}
|
||||||
|
|
||||||
|
ccflags = $ccflags -I${srcroot}/external/cpptoml
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
10
scripts/templates/exe.tests.j2
Normal file
10
scripts/templates/exe.tests.j2
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% extends "exe.default.j2" %}
|
||||||
|
{% block variables %}
|
||||||
|
{{ super() }}
|
||||||
|
|
||||||
|
ccflags = $ccflags -ggdb -I${srcroot}/external/catch
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
9
scripts/templates/exe.vdso.j2
Normal file
9
scripts/templates/exe.vdso.j2
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{% extends "exe.default.j2" %}
|
||||||
|
{% block variables %}
|
||||||
|
{{ super() }}
|
||||||
|
ccflags = $ccflags -fPIC -mcmodel=large
|
||||||
|
ldflags = $ldflags -shared -znotext -T ${srcroot}/src/arch/x86_64/vdso.ld
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
4
scripts/templates/lib.default.j2
Normal file
4
scripts/templates/lib.default.j2
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{% extends "module.base.j2" %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
45
scripts/templates/module.base.j2
Normal file
45
scripts/templates/module.base.j2
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
moddir = ${builddir}/{{ name }}.dir
|
||||||
|
|
||||||
|
{% block variables %}
|
||||||
|
ccflags = $ccflags $
|
||||||
|
{%- for dep in depmods %}
|
||||||
|
{%- for inc in dep.includes %}
|
||||||
|
-I${srcroot}/{{ inc }} $
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- for inc in module.includes %}
|
||||||
|
-I${srcroot}/{{ inc }} $
|
||||||
|
{%- endfor %}
|
||||||
|
{%- for define in module.defines %}
|
||||||
|
-D{{ define }} $
|
||||||
|
{%- endfor %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% for source in module.source %}
|
||||||
|
build ${moddir}/{{ source.output }} : {{ source.action }} ${srcroot}/{{ source.input }} || {{ buildfile }}
|
||||||
|
name = {{ source.name }}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
build ${builddir}/{{ module.output }} : {{ module.kind }} $
|
||||||
|
{%- for source in module.source %}
|
||||||
|
${moddir}/{{ source.output }} $
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- for dep in deplibs %}
|
||||||
|
${builddir}/{{ dep.output }} $
|
||||||
|
{%- endfor %}
|
||||||
|
| $
|
||||||
|
{%- for dep in depexes %}
|
||||||
|
${builddir}/{{ dep.output }} $
|
||||||
|
{%- endfor %}
|
||||||
|
{{ buildfile }}
|
||||||
|
name = {{ name }}
|
||||||
|
|
||||||
|
{% if module.default %}
|
||||||
|
default ${builddir}/{{ module.output }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% block extra %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
40
scripts/templates/target.boot.j2
Normal file
40
scripts/templates/target.boot.j2
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{% extends "target.default.j2" %}
|
||||||
|
|
||||||
|
{% block binaries %}
|
||||||
|
cc = clang
|
||||||
|
cxx = clang++
|
||||||
|
ld = ld
|
||||||
|
ar = ar
|
||||||
|
nasm = nasm
|
||||||
|
objcopy = objcopy
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block variables %}
|
||||||
|
|
||||||
|
ccflags = $ccflags $
|
||||||
|
-ggdb $
|
||||||
|
-nostdlib $
|
||||||
|
-ffreestanding $
|
||||||
|
-nodefaultlibs $
|
||||||
|
-fno-builtin $
|
||||||
|
-mno-sse $
|
||||||
|
-fno-omit-frame-pointer $
|
||||||
|
-mno-red-zone $
|
||||||
|
-fshort-wchar $
|
||||||
|
-D__ELF__ $
|
||||||
|
-fPIC
|
||||||
|
|
||||||
|
cxxflags = $cxxflags $
|
||||||
|
-fno-exceptions $
|
||||||
|
-fno-rtti $
|
||||||
|
|
||||||
|
ldflags = $ldflags $
|
||||||
|
-g $
|
||||||
|
-nostdlib $
|
||||||
|
-Bsymbolic $
|
||||||
|
-nostartfiles
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
26
scripts/templates/target.default.j2
Normal file
26
scripts/templates/target.default.j2
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
builddir = $builddir/{{ target }}
|
||||||
|
target = {{ target }}
|
||||||
|
|
||||||
|
{% block variables %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block binaries %}
|
||||||
|
cc = clang
|
||||||
|
cxx = clang++
|
||||||
|
ld = ld
|
||||||
|
ar = ar
|
||||||
|
nasm = nasm
|
||||||
|
objcopy = objcopy
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% for module in modules %}
|
||||||
|
subninja {{ module }}.ninja
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
build ${builddir}/c.defs : dump_c_defs | {{ buildfile }}
|
||||||
|
build ${builddir}/cpp.defs : dump_cpp_defs | {{ buildfile }}
|
||||||
|
build ${builddir}/c.run : dump_c_run | {{ buildfile }}
|
||||||
|
build ${builddir}/cpp.run : dump_cpp_run | {{ buildfile }}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
43
scripts/templates/target.host.j2
Normal file
43
scripts/templates/target.host.j2
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{% extends "target.default.j2" %}
|
||||||
|
|
||||||
|
{% block binaries %}
|
||||||
|
cc = ${srcroot}/sysroot/bin/clang
|
||||||
|
cxx = ${srcroot}/sysroot/bin/clang++
|
||||||
|
ld = ${srcroot}/sysroot/bin/ld.lld
|
||||||
|
ar = ${srcroot}/sysroot/bin/ar
|
||||||
|
nasm = nasm
|
||||||
|
objcopy = ${srcroot}/sysroot/bin/objcopy
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block variables %}
|
||||||
|
|
||||||
|
ccflags = $ccflags $
|
||||||
|
-nostdlib $
|
||||||
|
-ffreestanding $
|
||||||
|
-nodefaultlibs $
|
||||||
|
-fno-builtin $
|
||||||
|
-mno-sse $
|
||||||
|
-fno-omit-frame-pointer $
|
||||||
|
-mno-red-zone $
|
||||||
|
-g $
|
||||||
|
-mcmodel=large $
|
||||||
|
-D__ELF__ $
|
||||||
|
-D__JSIX__ $
|
||||||
|
-isystem${srcroot}/sysroot/include $
|
||||||
|
--sysroot="${srcroot}/sysroot"
|
||||||
|
|
||||||
|
cxxflags = $cxxflags $
|
||||||
|
-fno-exceptions $
|
||||||
|
-fno-rtti $
|
||||||
|
-isystem${srcroot}/sysroot/include/c++/v1
|
||||||
|
|
||||||
|
ldflags = $ldflags $
|
||||||
|
-g $
|
||||||
|
-nostdlib $
|
||||||
|
-Bsymbolic $
|
||||||
|
-Bstatic
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
15
scripts/templates/target.native.j2
Normal file
15
scripts/templates/target.native.j2
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{% extends "target.default.j2" %}
|
||||||
|
|
||||||
|
{% block binaries %}
|
||||||
|
{{ super() }}
|
||||||
|
ld = clang++
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block variables %}
|
||||||
|
|
||||||
|
ccflags = $ccflags -g -ggdb
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
47
scripts/templates/target.user.j2
Normal file
47
scripts/templates/target.user.j2
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{% extends "target.default.j2" %}
|
||||||
|
|
||||||
|
{% block binaries %}
|
||||||
|
cc = ${srcroot}/sysroot/bin/clang
|
||||||
|
cxx = ${srcroot}/sysroot/bin/clang++
|
||||||
|
ld = ${srcroot}/sysroot/bin/ld.lld
|
||||||
|
ar = ${srcroot}/sysroot/bin/ar
|
||||||
|
nasm = nasm
|
||||||
|
objcopy = ${srcroot}/sysroot/bin/objcopy
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block variables %}
|
||||||
|
|
||||||
|
ccflags = $ccflags $
|
||||||
|
-nostdlib $
|
||||||
|
-nodefaultlibs $
|
||||||
|
-fno-builtin $
|
||||||
|
-mno-sse $
|
||||||
|
-fno-omit-frame-pointer $
|
||||||
|
-mno-red-zone $
|
||||||
|
-g $
|
||||||
|
-mcmodel=large $
|
||||||
|
-D__ELF__ $
|
||||||
|
-D__JSIX__ $
|
||||||
|
-isystem${srcroot}/sysroot/include $
|
||||||
|
--sysroot="${srcroot}/sysroot"
|
||||||
|
|
||||||
|
cxxflags = $cxxflags $
|
||||||
|
-fno-exceptions $
|
||||||
|
-fno-rtti $
|
||||||
|
-isystem${srcroot}/sysroot/include/c++/v1
|
||||||
|
|
||||||
|
ldflags = $ldflags $
|
||||||
|
-g $
|
||||||
|
-nostdlib $
|
||||||
|
-Bsymbolic $
|
||||||
|
-Bstatic $
|
||||||
|
--sysroot="${srcroot}/sysroot" $
|
||||||
|
-L "${srcroot}/sysroot/lib" $
|
||||||
|
|
||||||
|
libs = $libs $
|
||||||
|
-lc
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
12
scripts/vmem_translate.py
Executable file
12
scripts/vmem_translate.py
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
def translate(i4 = 0, i3 = 0, i2 = 0, i1 = 0, offset = 0):
|
||||||
|
addr = (i4 << 39) + (i3 << 30) + (i2 << 21) + (i1 << 12) + offset
|
||||||
|
if addr & (1 << 47):
|
||||||
|
addr |= 0xffff000000000000
|
||||||
|
return addr
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
print("{:016x}".format(translate(*map(int, sys.argv[1:]))))
|
||||||
|
|
||||||
79
src/arch/x86_64/boot.ld
Normal file
79
src/arch/x86_64/boot.ld
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/* Linker script originally from GNU-EFI project
|
||||||
|
* https://sourceforge.net/p/gnu-efi/
|
||||||
|
*/
|
||||||
|
|
||||||
|
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
|
||||||
|
OUTPUT_ARCH(i386:x86-64)
|
||||||
|
ENTRY(_start)
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 0;
|
||||||
|
ImageBase = .;
|
||||||
|
/* .hash and/or .gnu.hash MUST come first! */
|
||||||
|
.hash : { *(.hash) }
|
||||||
|
.gnu.hash : { *(.gnu.hash) }
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.eh_frame :
|
||||||
|
{
|
||||||
|
*(.eh_frame)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
_text = .;
|
||||||
|
*(.text)
|
||||||
|
*(.text.*)
|
||||||
|
*(.gnu.linkonce.t.*)
|
||||||
|
. = ALIGN(16);
|
||||||
|
}
|
||||||
|
_etext = .;
|
||||||
|
_text_size = . - _text;
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.reloc :
|
||||||
|
{
|
||||||
|
*(.reloc)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
_data = .;
|
||||||
|
*(.rodata*)
|
||||||
|
*(.got.plt)
|
||||||
|
*(.got)
|
||||||
|
*(.data*)
|
||||||
|
*(.sdata)
|
||||||
|
/* the EFI loader doesn't seem to like a .bss section, so we stick
|
||||||
|
it all into .data: */
|
||||||
|
*(.sbss)
|
||||||
|
*(.scommon)
|
||||||
|
*(.dynbss)
|
||||||
|
*(.bss)
|
||||||
|
*(COMMON)
|
||||||
|
*(.rel.local)
|
||||||
|
}
|
||||||
|
.note.gnu.build-id : { *(.note.gnu.build-id) }
|
||||||
|
|
||||||
|
_edata = .;
|
||||||
|
_data_size = . - _etext;
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.dynamic : { *(.dynamic) }
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.rela :
|
||||||
|
{
|
||||||
|
*(.rela.data*)
|
||||||
|
*(.rela.got)
|
||||||
|
*(.rela.stab)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.dynsym : { *(.dynsym) }
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.dynstr : { *(.dynstr) }
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.ignored.reloc :
|
||||||
|
{
|
||||||
|
*(.rela.reloc)
|
||||||
|
*(.eh_frame)
|
||||||
|
*(.note.GNU-stack)
|
||||||
|
}
|
||||||
|
.comment 0 : { *(.comment) }
|
||||||
|
}
|
||||||
@@ -1,32 +1,47 @@
|
|||||||
ENTRY(_start)
|
ENTRY(_start)
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = 0x100000;
|
OFFSET = 0xFFFFFF0000000000;
|
||||||
|
. = OFFSET + 0x100000;
|
||||||
|
|
||||||
.header : {
|
.header : {
|
||||||
header = .;
|
__header_start = .;
|
||||||
KEEP(*(.header))
|
KEEP(*(.header))
|
||||||
|
__header_end = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text : {
|
.text ALIGN(4096) : {
|
||||||
code = .;
|
|
||||||
*(.text)
|
*(.text)
|
||||||
|
*(.isrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
.data ALIGN(0x1000) : {
|
.data ALIGN(4096) : {
|
||||||
data = .;
|
|
||||||
*(.data)
|
*(.data)
|
||||||
*(.rodata)
|
*(.rodata)
|
||||||
}
|
}
|
||||||
|
|
||||||
.bss ALIGN(0x1000) : {
|
.bss ALIGN(4096) : {
|
||||||
bss = .;
|
__bss_start = .;
|
||||||
*(.bss)
|
*(.bss)
|
||||||
|
__bss_end = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
.note ALIGN(0x1000) : {
|
.note : {
|
||||||
*(.note.*)
|
*(.note.*)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.eh_frame : {
|
||||||
|
__eh_frame_start = .;
|
||||||
|
KEEP(*(.eh_frame))
|
||||||
|
__eh_frame_end = .;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eh_frame_hdr : {
|
||||||
|
KEEP(*(.eh_frame_hdr))
|
||||||
|
}
|
||||||
|
|
||||||
|
__eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
|
||||||
|
__eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
|
||||||
|
|
||||||
kernel_end = ALIGN(4096);
|
kernel_end = ALIGN(4096);
|
||||||
}
|
}
|
||||||
|
|||||||
73
src/arch/x86_64/vdso.ld
Normal file
73
src/arch/x86_64/vdso.ld
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
PHDRS {
|
||||||
|
headers PT_PHDR FLAGS(4) FILEHDR PHDRS ;
|
||||||
|
rodata PT_LOAD FLAGS(4) ;
|
||||||
|
text PT_LOAD FLAGS(5) ;
|
||||||
|
dynamic PT_DYNAMIC FLAGS(4) ;
|
||||||
|
note PT_NOTE ;
|
||||||
|
eh_frame PT_GNU_EH_FRAME ;
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
. = SIZEOF_HEADERS;
|
||||||
|
|
||||||
|
/DISCARD/ : {
|
||||||
|
*(.got*)
|
||||||
|
*(.plt*)
|
||||||
|
*(.note.*)
|
||||||
|
*(.hash*)
|
||||||
|
*(.debug*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.illegal.relocations : {
|
||||||
|
*(.rel*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.illegal.writeable : {
|
||||||
|
*(.data*)
|
||||||
|
*(.bss*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.rodata : {
|
||||||
|
*(.rodata*)
|
||||||
|
} :rodata
|
||||||
|
|
||||||
|
.dynamic : {
|
||||||
|
*(.dynamic)
|
||||||
|
} :dynamic
|
||||||
|
|
||||||
|
.dynsym : {
|
||||||
|
*(.dynsym*)
|
||||||
|
} :rodata :dynamic
|
||||||
|
|
||||||
|
.dynstr : {
|
||||||
|
*(.dynstr*)
|
||||||
|
} :rodata :dynamic
|
||||||
|
|
||||||
|
.gnu.hash : {
|
||||||
|
*(.gnu.hash*)
|
||||||
|
} :rodata
|
||||||
|
|
||||||
|
.eh_frame_hdr : {
|
||||||
|
__eh_frame_start = .;
|
||||||
|
KEEP(*(.eh_frame))
|
||||||
|
__eh_frame_end = .;
|
||||||
|
|
||||||
|
KEEP(*(.eh_frame_hdr))
|
||||||
|
} :eh_frame
|
||||||
|
|
||||||
|
.shstrtab : {
|
||||||
|
*(.shstrtab)
|
||||||
|
}
|
||||||
|
|
||||||
|
.text ALIGN(0x1000) : {
|
||||||
|
*(.text*)
|
||||||
|
*(.init*)
|
||||||
|
*(.fini*)
|
||||||
|
. = ALIGN(0x1000);
|
||||||
|
} :text
|
||||||
|
|
||||||
|
ASSERT(SIZEOF(.illegal.relocations) == 0,
|
||||||
|
"Code has introduced relocations into the VDSO")
|
||||||
|
ASSERT(SIZEOF(.illegal.writeable) == 0,
|
||||||
|
"Code has introduced writeable data into the VDSO")
|
||||||
|
}
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
#include <efi.h>
|
|
||||||
#include <efilib.h>
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@@ -10,16 +8,55 @@
|
|||||||
size_t ROWS = 0;
|
size_t ROWS = 0;
|
||||||
size_t COLS = 0;
|
size_t COLS = 0;
|
||||||
|
|
||||||
static EFI_SIMPLE_TEXT_OUT_PROTOCOL *con_out = 0;
|
static EFI_SIMPLE_TEXT_OUT_PROTOCOL *m_out = 0;
|
||||||
|
|
||||||
const CHAR16 digits[] = {u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'a', u'b', u'c', u'd', u'e', u'f'};
|
static const wchar_t digits[] = {u'0', u'1', u'2', u'3', u'4', u'5',
|
||||||
|
u'6', u'7', u'8', u'9', u'a', u'b', u'c', u'd', u'e', u'f'};
|
||||||
|
|
||||||
|
console::console(EFI_SYSTEM_TABLE *system_table) :
|
||||||
|
m_rows(0),
|
||||||
|
m_cols(0),
|
||||||
|
m_out(nullptr)
|
||||||
|
{
|
||||||
|
s_console = this;
|
||||||
|
m_boot = system_table->BootServices;
|
||||||
|
m_out = system_table->ConOut;
|
||||||
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
con_pick_mode(EFI_BOOT_SERVICES *bootsvc)
|
console::initialize(const wchar_t *version)
|
||||||
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
|
||||||
|
// Might not find a video device at all, so ignore not found errors
|
||||||
|
status = pick_mode();
|
||||||
|
if (status != EFI_NOT_FOUND)
|
||||||
|
CHECK_EFI_STATUS_OR_FAIL(status);
|
||||||
|
|
||||||
|
status = m_out->QueryMode(m_out, m_out->Mode->Mode, &m_cols, &m_rows);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, "QueryMode");
|
||||||
|
|
||||||
|
status = m_out->ClearScreen(m_out);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, "ClearScreen");
|
||||||
|
|
||||||
|
m_out->SetAttribute(m_out, EFI_LIGHTCYAN);
|
||||||
|
m_out->OutputString(m_out, (wchar_t *)L"jsix loader ");
|
||||||
|
|
||||||
|
m_out->SetAttribute(m_out, EFI_LIGHTMAGENTA);
|
||||||
|
m_out->OutputString(m_out, (wchar_t *)version);
|
||||||
|
|
||||||
|
m_out->SetAttribute(m_out, EFI_LIGHTGRAY);
|
||||||
|
m_out->OutputString(m_out, (wchar_t *)L" booting...\r\n\n");
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
console::pick_mode()
|
||||||
{
|
{
|
||||||
EFI_STATUS status;
|
EFI_STATUS status;
|
||||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *gfx_out_proto;
|
EFI_GRAPHICS_OUTPUT_PROTOCOL *gfx_out_proto;
|
||||||
status = bootsvc->LocateProtocol(&guid_gfx_out, NULL, (void **)&gfx_out_proto);
|
status = m_boot->LocateProtocol(&guid_gfx_out, NULL, (void **)&gfx_out_proto);
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, "LocateProtocol gfx");
|
CHECK_EFI_STATUS_OR_RETURN(status, "LocateProtocol gfx");
|
||||||
|
|
||||||
const uint32_t modes = gfx_out_proto->Mode->MaxMode;
|
const uint32_t modes = gfx_out_proto->Mode->MaxMode;
|
||||||
@@ -54,106 +91,72 @@ con_pick_mode(EFI_BOOT_SERVICES *bootsvc)
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
con_initialize(EFI_SYSTEM_TABLE *system_table, const CHAR16 *version)
|
|
||||||
{
|
|
||||||
EFI_STATUS status;
|
|
||||||
|
|
||||||
EFI_BOOT_SERVICES *bootsvc = system_table->BootServices;
|
|
||||||
con_out = system_table->ConOut;
|
|
||||||
|
|
||||||
// Might not find a video device at all, so ignore not found errors
|
|
||||||
status = con_pick_mode(bootsvc);
|
|
||||||
if (status != EFI_NOT_FOUND)
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, "con_pick_mode");
|
|
||||||
|
|
||||||
status = con_out->QueryMode(con_out, con_out->Mode->Mode, &COLS, &ROWS);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, "QueryMode");
|
|
||||||
|
|
||||||
status = con_out->ClearScreen(con_out);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, "ClearScreen");
|
|
||||||
|
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTCYAN);
|
|
||||||
con_out->OutputString(con_out, (CHAR16 *)L"Popcorn loader ");
|
|
||||||
|
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTMAGENTA);
|
|
||||||
con_out->OutputString(con_out, (CHAR16 *)version);
|
|
||||||
|
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTGRAY);
|
|
||||||
con_out->OutputString(con_out, (CHAR16 *)L" booting...\r\n\n");
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
con_print_hex(uint32_t n)
|
console::print_hex(uint32_t n) const
|
||||||
{
|
{
|
||||||
CHAR16 buffer[9];
|
wchar_t buffer[9];
|
||||||
CHAR16 *p = buffer;
|
wchar_t *p = buffer;
|
||||||
for (int i = 7; i >= 0; --i) {
|
for (int i = 7; i >= 0; --i) {
|
||||||
uint8_t nibble = (n & (0xf << (i*4))) >> (i*4);
|
uint8_t nibble = (n & (0xf << (i*4))) >> (i*4);
|
||||||
*p++ = digits[nibble];
|
*p++ = digits[nibble];
|
||||||
}
|
}
|
||||||
*p = 0;
|
*p = 0;
|
||||||
con_out->OutputString(con_out, buffer);
|
m_out->OutputString(m_out, buffer);
|
||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
con_print_long_hex(uint64_t n)
|
console::print_long_hex(uint64_t n) const
|
||||||
{
|
{
|
||||||
CHAR16 buffer[17];
|
wchar_t buffer[17];
|
||||||
CHAR16 *p = buffer;
|
wchar_t *p = buffer;
|
||||||
for (int i = 15; i >= 0; --i) {
|
for (int i = 15; i >= 0; --i) {
|
||||||
uint8_t nibble = (n & (0xf << (i*4))) >> (i*4);
|
uint8_t nibble = (n & (0xf << (i*4))) >> (i*4);
|
||||||
*p++ = digits[nibble];
|
*p++ = digits[nibble];
|
||||||
}
|
}
|
||||||
*p = 0;
|
*p = 0;
|
||||||
con_out->OutputString(con_out, buffer);
|
m_out->OutputString(m_out, buffer);
|
||||||
return 16;
|
return 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
con_print_dec(uint32_t n)
|
console::print_dec(uint32_t n) const
|
||||||
{
|
{
|
||||||
CHAR16 buffer[11];
|
wchar_t buffer[11];
|
||||||
CHAR16 *p = buffer + 10;
|
wchar_t *p = buffer + 10;
|
||||||
*p-- = 0;
|
*p-- = 0;
|
||||||
do {
|
do {
|
||||||
*p-- = digits[n % 10];
|
*p-- = digits[n % 10];
|
||||||
n /= 10;
|
n /= 10;
|
||||||
} while (n != 0);
|
} while (n != 0);
|
||||||
|
|
||||||
con_out->OutputString(con_out, ++p);
|
m_out->OutputString(m_out, ++p);
|
||||||
return 10 - (p - buffer);
|
return 10 - (p - buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
con_print_long_dec(uint64_t n)
|
console::print_long_dec(uint64_t n) const
|
||||||
{
|
{
|
||||||
CHAR16 buffer[21];
|
wchar_t buffer[21];
|
||||||
CHAR16 *p = buffer + 20;
|
wchar_t *p = buffer + 20;
|
||||||
*p-- = 0;
|
*p-- = 0;
|
||||||
do {
|
do {
|
||||||
*p-- = digits[n % 10];
|
*p-- = digits[n % 10];
|
||||||
n /= 10;
|
n /= 10;
|
||||||
} while (n != 0);
|
} while (n != 0);
|
||||||
|
|
||||||
con_out->OutputString(con_out, ++p);
|
m_out->OutputString(m_out, ++p);
|
||||||
return 20 - (p - buffer);
|
return 20 - (p - buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
con_printf(const CHAR16 *fmt, ...)
|
console::vprintf(const wchar_t *fmt, va_list args) const
|
||||||
{
|
{
|
||||||
CHAR16 buffer[256];
|
wchar_t buffer[256];
|
||||||
const CHAR16 *r = fmt;
|
const wchar_t *r = fmt;
|
||||||
CHAR16 *w = buffer;
|
wchar_t *w = buffer;
|
||||||
va_list args;
|
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
|
||||||
va_start(args, fmt);
|
|
||||||
|
|
||||||
while (r && *r) {
|
while (r && *r) {
|
||||||
if (*r != L'%') {
|
if (*r != L'%') {
|
||||||
count++;
|
count++;
|
||||||
@@ -162,43 +165,43 @@ con_printf(const CHAR16 *fmt, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
*w = 0;
|
*w = 0;
|
||||||
con_out->OutputString(con_out, buffer);
|
m_out->OutputString(m_out, buffer);
|
||||||
w = buffer;
|
w = buffer;
|
||||||
|
|
||||||
r++; // chomp the %
|
r++; // chomp the %
|
||||||
|
|
||||||
switch (*r++) {
|
switch (*r++) {
|
||||||
case L'%':
|
case L'%':
|
||||||
con_out->OutputString(con_out, L"%");
|
m_out->OutputString(m_out, const_cast<wchar_t*>(L"%"));
|
||||||
count++;
|
count++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case L'x':
|
case L'x':
|
||||||
count += con_print_hex(va_arg(args, uint32_t));
|
count += print_hex(va_arg(args, uint32_t));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case L'd':
|
case L'd':
|
||||||
case L'u':
|
case L'u':
|
||||||
count += con_print_dec(va_arg(args, uint32_t));
|
count += print_dec(va_arg(args, uint32_t));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case L's':
|
case L's':
|
||||||
{
|
{
|
||||||
CHAR16 *s = va_arg(args, CHAR16*);
|
wchar_t *s = va_arg(args, wchar_t*);
|
||||||
count += wstrlen(s);
|
count += wstrlen(s);
|
||||||
con_out->OutputString(con_out, s);
|
m_out->OutputString(m_out, s);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case L'l':
|
case L'l':
|
||||||
switch (*r++) {
|
switch (*r++) {
|
||||||
case L'x':
|
case L'x':
|
||||||
count += con_print_long_hex(va_arg(args, uint64_t));
|
count += print_long_hex(va_arg(args, uint64_t));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case L'd':
|
case L'd':
|
||||||
case L'u':
|
case L'u':
|
||||||
count += con_print_long_dec(va_arg(args, uint64_t));
|
count += print_long_dec(va_arg(args, uint64_t));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -212,44 +215,66 @@ con_printf(const CHAR16 *fmt, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
*w = 0;
|
*w = 0;
|
||||||
con_out->OutputString(con_out, buffer);
|
m_out->OutputString(m_out, buffer);
|
||||||
|
|
||||||
va_end(args);
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
size_t
|
||||||
con_status_begin(const CHAR16 *message)
|
console::printf(const wchar_t *fmt, ...) const
|
||||||
{
|
{
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTGRAY);
|
va_list args;
|
||||||
con_out->OutputString(con_out, (CHAR16 *)message);
|
va_start(args, fmt);
|
||||||
|
|
||||||
|
size_t result = vprintf(fmt, args);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
console::print(const wchar_t *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
|
||||||
|
size_t result = get().vprintf(fmt, args);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
con_status_ok()
|
console::status_begin(const wchar_t *message) const
|
||||||
{
|
{
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTGRAY);
|
m_out->SetAttribute(m_out, EFI_LIGHTGRAY);
|
||||||
con_out->OutputString(con_out, (CHAR16 *)L"[");
|
m_out->OutputString(m_out, (wchar_t *)message);
|
||||||
con_out->SetAttribute(con_out, EFI_GREEN);
|
|
||||||
con_out->OutputString(con_out, (CHAR16 *)L" ok ");
|
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTGRAY);
|
|
||||||
con_out->OutputString(con_out, (CHAR16 *)L"]\r\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
con_status_fail(const CHAR16 *error)
|
console::status_ok() const
|
||||||
{
|
{
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTGRAY);
|
m_out->SetAttribute(m_out, EFI_LIGHTGRAY);
|
||||||
con_out->OutputString(con_out, (CHAR16 *)L"[");
|
m_out->OutputString(m_out, (wchar_t *)L"[");
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTRED);
|
m_out->SetAttribute(m_out, EFI_GREEN);
|
||||||
con_out->OutputString(con_out, (CHAR16 *)L"failed");
|
m_out->OutputString(m_out, (wchar_t *)L" ok ");
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTGRAY);
|
m_out->SetAttribute(m_out, EFI_LIGHTGRAY);
|
||||||
con_out->OutputString(con_out, (CHAR16 *)L"]\r\n");
|
m_out->OutputString(m_out, (wchar_t *)L"]\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
con_out->SetAttribute(con_out, EFI_RED);
|
void
|
||||||
con_out->OutputString(con_out, (CHAR16 *)error);
|
console::status_fail(const wchar_t *error) const
|
||||||
con_out->SetAttribute(con_out, EFI_LIGHTGRAY);
|
{
|
||||||
con_out->OutputString(con_out, (CHAR16 *)L"\r\n");
|
m_out->SetAttribute(m_out, EFI_LIGHTGRAY);
|
||||||
|
m_out->OutputString(m_out, (wchar_t *)L"[");
|
||||||
|
m_out->SetAttribute(m_out, EFI_LIGHTRED);
|
||||||
|
m_out->OutputString(m_out, (wchar_t *)L"failed");
|
||||||
|
m_out->SetAttribute(m_out, EFI_LIGHTGRAY);
|
||||||
|
m_out->OutputString(m_out, (wchar_t *)L"]\r\n");
|
||||||
|
|
||||||
|
m_out->SetAttribute(m_out, EFI_RED);
|
||||||
|
m_out->OutputString(m_out, (wchar_t *)error);
|
||||||
|
m_out->SetAttribute(m_out, EFI_LIGHTGRAY);
|
||||||
|
m_out->OutputString(m_out, (wchar_t *)L"\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@@ -1,12 +1,38 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <efi.h>
|
#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <efi/efi.h>
|
||||||
|
|
||||||
EFI_STATUS con_initialize(EFI_SYSTEM_TABLE *system_table, const CHAR16 *version);
|
class console
|
||||||
void con_status_begin(const CHAR16 *message);
|
{
|
||||||
void con_status_ok();
|
public:
|
||||||
void con_status_fail(const CHAR16 *error);
|
console(EFI_SYSTEM_TABLE *system_table);
|
||||||
size_t con_printf(const CHAR16 *fmt, ...);
|
|
||||||
|
EFI_STATUS initialize(const wchar_t *version);
|
||||||
|
|
||||||
|
void status_begin(const wchar_t *message) const;
|
||||||
|
void status_fail(const wchar_t *error) const;
|
||||||
|
void status_ok() const;
|
||||||
|
|
||||||
|
size_t print_hex(uint32_t n) const;
|
||||||
|
size_t print_dec(uint32_t n) const;
|
||||||
|
size_t print_long_hex(uint64_t n) const;
|
||||||
|
size_t print_long_dec(uint64_t n) const;
|
||||||
|
size_t printf(const wchar_t *fmt, ...) const;
|
||||||
|
|
||||||
|
static const console & get() { return *s_console; }
|
||||||
|
static size_t print(const wchar_t *fmt, ...);
|
||||||
|
|
||||||
|
private:
|
||||||
|
EFI_STATUS pick_mode();
|
||||||
|
size_t vprintf(const wchar_t *fmt, va_list args) const;
|
||||||
|
|
||||||
|
size_t m_rows, m_cols;
|
||||||
|
EFI_BOOT_SERVICES *m_boot;
|
||||||
|
EFI_SIMPLE_TEXT_OUT_PROTOCOL *m_out;
|
||||||
|
|
||||||
|
static console *s_console;
|
||||||
|
};
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
con_get_framebuffer(
|
con_get_framebuffer(
|
||||||
|
|||||||
85
src/boot/crt0.s
Normal file
85
src/boot/crt0.s
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
; crt0-efi-x86_64.S - x86_64 EFI startup code.
|
||||||
|
; Copyright (C) 1999 Hewlett-Packard Co.
|
||||||
|
; Contributed by David Mosberger <davidm@hpl.hp.com>.
|
||||||
|
; Copyright (C) 2005 Intel Co.
|
||||||
|
; Contributed by Fenghua Yu <fenghua.yu@intel.com>.
|
||||||
|
;
|
||||||
|
; All rights reserved.
|
||||||
|
;
|
||||||
|
; Redistribution and use in source and binary forms, with or without
|
||||||
|
; modification, are permitted provided that the following conditions
|
||||||
|
; are met:
|
||||||
|
;
|
||||||
|
; * Redistributions of source code must retain the above copyright
|
||||||
|
; notice, this list of conditions and the following disclaimer.
|
||||||
|
; * Redistributions in binary form must reproduce the above
|
||||||
|
; copyright notice, this list of conditions and the following
|
||||||
|
; disclaimer in the documentation and/or other materials
|
||||||
|
; provided with the distribution.
|
||||||
|
; * Neither the name of Hewlett-Packard Co. nor the names of its
|
||||||
|
; contributors may be used to endorse or promote products derived
|
||||||
|
; from this software without specific prior written permission.
|
||||||
|
;
|
||||||
|
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
; CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||||
|
; BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||||
|
; OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||||
|
; TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
; THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
; SUCH DAMAGE.
|
||||||
|
;
|
||||||
|
; 2018-05-05 Converted to NASM syntax by Justin C. Miller
|
||||||
|
|
||||||
|
extern ImageBase
|
||||||
|
extern _DYNAMIC
|
||||||
|
extern _relocate
|
||||||
|
extern efi_main
|
||||||
|
|
||||||
|
section .text
|
||||||
|
align 4
|
||||||
|
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
sub rsp, 8
|
||||||
|
push rcx
|
||||||
|
push rdx
|
||||||
|
|
||||||
|
; These are already in RDI/RSI from EFI calling us, right? -justin
|
||||||
|
;lea rdi, [ImageBase]
|
||||||
|
;lea rsi, [_DYNAMIC]
|
||||||
|
|
||||||
|
pop rcx
|
||||||
|
pop rdx
|
||||||
|
push rcx
|
||||||
|
push rdx
|
||||||
|
call _relocate
|
||||||
|
|
||||||
|
pop rdi
|
||||||
|
pop rsi
|
||||||
|
|
||||||
|
call efi_main
|
||||||
|
add rsp, 8
|
||||||
|
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
|
||||||
|
; hand-craft a dummy .reloc section so EFI knows it's a relocatable executable:
|
||||||
|
section .data
|
||||||
|
dummy:
|
||||||
|
dd 0
|
||||||
|
|
||||||
|
|
||||||
|
%define IMAGE_REL_ABSOLUTE 0
|
||||||
|
|
||||||
|
section .reloc
|
||||||
|
label1:
|
||||||
|
dd 0 ; Page RVA
|
||||||
|
dd 10 ; Block Size (2*4+2)
|
||||||
|
dw (IMAGE_REL_ABSOLUTE<<12) + 0 ; reloc for dummy
|
||||||
|
|
||||||
94
src/boot/elf.h
Normal file
94
src/boot/elf.h
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef ELF_VERSION
|
||||||
|
#define ELF_VERSION 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ELF_WORDSIZE
|
||||||
|
#define ELF_WORDSIZE 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ELF_ENDIAN
|
||||||
|
#define ELF_ENDIAN 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ELF_OSABI
|
||||||
|
#define ELF_OSABI 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ELF_MACHINE
|
||||||
|
#define ELF_MACHINE 0x3e
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const unsigned ELF_PT_LOAD = 1;
|
||||||
|
const unsigned ELF_ST_PROGBITS = 1;
|
||||||
|
const unsigned ELF_ST_NOBITS = 8;
|
||||||
|
const unsigned long ELF_SHF_ALLOC = 0x2;
|
||||||
|
|
||||||
|
struct elf_ident
|
||||||
|
{
|
||||||
|
char magic[4];
|
||||||
|
|
||||||
|
uint8_t word_size;
|
||||||
|
uint8_t endianness;
|
||||||
|
uint8_t version;
|
||||||
|
uint8_t os_abi;
|
||||||
|
|
||||||
|
uint64_t reserved;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct elf_header
|
||||||
|
{
|
||||||
|
struct elf_ident ident;
|
||||||
|
|
||||||
|
uint16_t type;
|
||||||
|
uint16_t machine;
|
||||||
|
|
||||||
|
uint32_t version;
|
||||||
|
|
||||||
|
uint64_t entrypoint;
|
||||||
|
uint64_t ph_offset;
|
||||||
|
uint64_t sh_offset;
|
||||||
|
|
||||||
|
uint32_t flags;
|
||||||
|
|
||||||
|
uint16_t eh_size;
|
||||||
|
|
||||||
|
uint16_t ph_entsize;
|
||||||
|
uint16_t ph_num;
|
||||||
|
|
||||||
|
uint16_t sh_entsize;
|
||||||
|
uint16_t sh_num;
|
||||||
|
|
||||||
|
uint16_t sh_str_idx;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct elf_program_header
|
||||||
|
{
|
||||||
|
uint32_t type;
|
||||||
|
uint32_t flags;
|
||||||
|
uint64_t offset;
|
||||||
|
|
||||||
|
uint64_t vaddr;
|
||||||
|
uint64_t paddr;
|
||||||
|
|
||||||
|
uint64_t file_size;
|
||||||
|
uint64_t mem_size;
|
||||||
|
|
||||||
|
uint64_t align;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct elf_section_header
|
||||||
|
{
|
||||||
|
uint32_t name;
|
||||||
|
uint32_t type;
|
||||||
|
uint64_t flags;
|
||||||
|
uint64_t addr;
|
||||||
|
uint64_t offset;
|
||||||
|
uint64_t size;
|
||||||
|
uint32_t link;
|
||||||
|
uint32_t info;
|
||||||
|
uint64_t align;
|
||||||
|
uint64_t entry_size;
|
||||||
|
} __attribute__ ((packed));
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <efi.h>
|
#include <efi/efi.h>
|
||||||
|
|
||||||
int is_guid(EFI_GUID *a, EFI_GUID *b);
|
int is_guid(EFI_GUID *a, EFI_GUID *b);
|
||||||
|
|
||||||
|
|||||||
@@ -3,5 +3,9 @@ GUID(0x8868e871,0xe4f1,0x11d3,0xbc,0x22,0x00,0x80,0xc7,0x3c,0x88,0x81, guid_acpi
|
|||||||
GUID(0x09576e92,0x6d3f,0x11d2,0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b, guid_file_info);
|
GUID(0x09576e92,0x6d3f,0x11d2,0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b, guid_file_info);
|
||||||
GUID(0x9042a9de,0x23dc,0x4a38,0x96,0xfb,0x7a,0xde,0xd0,0x80,0x51,0x6a, guid_gfx_out);
|
GUID(0x9042a9de,0x23dc,0x4a38,0x96,0xfb,0x7a,0xde,0xd0,0x80,0x51,0x6a, guid_gfx_out);
|
||||||
GUID(0x964e5b22,0x6459,0x11d2,0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b, guid_simple_filesystem);
|
GUID(0x964e5b22,0x6459,0x11d2,0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b, guid_simple_filesystem);
|
||||||
|
GUID(0x09576e91,0x6d3f,0x11d2,0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b, guid_device_path);
|
||||||
|
GUID(0x8b843e20,0x8132,0x4852,0x90,0xcc,0x55,0x1a,0x4e,0x4a,0x7f,0x1c, guid_device_path_to_text);
|
||||||
|
|
||||||
|
GUID(0x10d0669c,0x9ec6,0x4268,0xbc,0x48,0xff,0x74,0x75,0x21,0xfe,0x07, guid_jsix_vendor);
|
||||||
|
|
||||||
// vim: ft=c
|
// vim: ft=c
|
||||||
|
|||||||
@@ -1,160 +0,0 @@
|
|||||||
#include "guids.h"
|
|
||||||
#include "loader.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "utility.h"
|
|
||||||
|
|
||||||
#define PAGE_SIZE 0x1000
|
|
||||||
|
|
||||||
static CHAR16 kernel_name[] = KERNEL_FILENAME;
|
|
||||||
static CHAR16 font_name[] = KERNEL_FONT;
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
loader_alloc_pages(
|
|
||||||
EFI_BOOT_SERVICES *bootsvc,
|
|
||||||
EFI_MEMORY_TYPE mem_type,
|
|
||||||
size_t *length,
|
|
||||||
void **pages,
|
|
||||||
void **next)
|
|
||||||
{
|
|
||||||
EFI_STATUS status;
|
|
||||||
|
|
||||||
size_t page_count = ((*length - 1) / PAGE_SIZE) + 1;
|
|
||||||
EFI_PHYSICAL_ADDRESS addr = (EFI_PHYSICAL_ADDRESS)*pages;
|
|
||||||
|
|
||||||
status = bootsvc->AllocatePages(AllocateAddress, mem_type, page_count, &addr);
|
|
||||||
if (status == EFI_NOT_FOUND || status == EFI_OUT_OF_RESOURCES) {
|
|
||||||
// couldn't get the address we wanted, try loading the kernel anywhere
|
|
||||||
status =
|
|
||||||
bootsvc->AllocatePages(AllocateAnyPages, mem_type, page_count, &addr);
|
|
||||||
}
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status,
|
|
||||||
L"Allocating %d kernel pages type %x",
|
|
||||||
page_count, mem_type);
|
|
||||||
|
|
||||||
*length = page_count * PAGE_SIZE;
|
|
||||||
*pages = (void *)addr;
|
|
||||||
*next = (void*)(addr + *length);
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
loader_load_file(
|
|
||||||
EFI_BOOT_SERVICES *bootsvc,
|
|
||||||
EFI_FILE_PROTOCOL *root,
|
|
||||||
const CHAR16 *filename,
|
|
||||||
EFI_MEMORY_TYPE mem_type,
|
|
||||||
void **data,
|
|
||||||
size_t *length,
|
|
||||||
void **next)
|
|
||||||
{
|
|
||||||
EFI_STATUS status;
|
|
||||||
|
|
||||||
EFI_FILE_PROTOCOL *file = NULL;
|
|
||||||
status = root->Open(root, &file, (CHAR16 *)filename, EFI_FILE_MODE_READ,
|
|
||||||
EFI_FILE_READ_ONLY | EFI_FILE_HIDDEN | EFI_FILE_SYSTEM);
|
|
||||||
|
|
||||||
if (status == EFI_NOT_FOUND)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"Opening file %s", filename);
|
|
||||||
|
|
||||||
char info[sizeof(EFI_FILE_INFO) + 100];
|
|
||||||
size_t info_length = sizeof(info);
|
|
||||||
|
|
||||||
status = file->GetInfo(file, &guid_file_info, &info_length, info);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"Getting file info");
|
|
||||||
|
|
||||||
*length = ((EFI_FILE_INFO *)info)->FileSize;
|
|
||||||
|
|
||||||
status = loader_alloc_pages(bootsvc, mem_type, length, data, next);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"Allocating pages");
|
|
||||||
|
|
||||||
status = file->Read(file, length, *data);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"Reading file");
|
|
||||||
|
|
||||||
status = file->Close(file);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"Closing file handle");
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
loader_load_kernel(
|
|
||||||
EFI_BOOT_SERVICES *bootsvc,
|
|
||||||
struct loader_data *data)
|
|
||||||
{
|
|
||||||
if (data == NULL)
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(EFI_INVALID_PARAMETER, L"NULL loader_data");
|
|
||||||
|
|
||||||
EFI_STATUS status;
|
|
||||||
EFI_HANDLE *handles = NULL;
|
|
||||||
size_t handleCount = 0;
|
|
||||||
|
|
||||||
status = bootsvc->LocateHandleBuffer(ByProtocol, &guid_simple_filesystem, NULL, &handleCount, &handles);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"LocateHandleBuffer");
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < handleCount; ++i) {
|
|
||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *fileSystem = NULL;
|
|
||||||
|
|
||||||
status = bootsvc->HandleProtocol(handles[i], &guid_simple_filesystem, (void **)&fileSystem);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"HandleProtocol");
|
|
||||||
|
|
||||||
EFI_FILE_PROTOCOL *root = NULL;
|
|
||||||
status = fileSystem->OpenVolume(fileSystem, &root);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"OpenVolume");
|
|
||||||
|
|
||||||
void *next = NULL;
|
|
||||||
|
|
||||||
data->kernel = (void *)KERNEL_PHYS_ADDRESS;
|
|
||||||
status = loader_load_file(
|
|
||||||
bootsvc,
|
|
||||||
root,
|
|
||||||
kernel_name,
|
|
||||||
KERNEL_MEMTYPE,
|
|
||||||
&data->kernel,
|
|
||||||
&data->kernel_length,
|
|
||||||
&next);
|
|
||||||
if (status == EFI_NOT_FOUND)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"loader_load_file: %s", kernel_name);
|
|
||||||
|
|
||||||
data->font = next;
|
|
||||||
status = loader_load_file(
|
|
||||||
bootsvc,
|
|
||||||
root,
|
|
||||||
font_name,
|
|
||||||
KERNEL_FONT_MEMTYPE,
|
|
||||||
&data->font,
|
|
||||||
&data->font_length,
|
|
||||||
&next);
|
|
||||||
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"loader_load_file: %s", font_name);
|
|
||||||
|
|
||||||
data->data = next;
|
|
||||||
data->data_length += PAGE_SIZE; // extra page for map growth
|
|
||||||
status = loader_alloc_pages(
|
|
||||||
bootsvc,
|
|
||||||
KERNEL_DATA_MEMTYPE,
|
|
||||||
&data->data_length,
|
|
||||||
&data->data,
|
|
||||||
&next);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"loader_alloc_pages: kernel data");
|
|
||||||
|
|
||||||
data->log = next;
|
|
||||||
data->log_length = KERNEL_LOG_PAGES * PAGE_SIZE;
|
|
||||||
status = loader_alloc_pages(
|
|
||||||
bootsvc,
|
|
||||||
KERNEL_LOG_MEMTYPE,
|
|
||||||
&data->log_length,
|
|
||||||
&data->log,
|
|
||||||
&next);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, L"loader_alloc_pages: kernel log");
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
|
||||||
}
|
|
||||||
298
src/boot/loader.cpp
Normal file
298
src/boot/loader.cpp
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
#include "elf.h"
|
||||||
|
#include "guids.h"
|
||||||
|
#include "loader.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
|
#define PAGE_SIZE 0x1000
|
||||||
|
|
||||||
|
static wchar_t kernel_name[] = KERNEL_FILENAME;
|
||||||
|
static wchar_t initrd_name[] = INITRD_FILENAME;
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
loader_alloc_aligned(
|
||||||
|
EFI_BOOT_SERVICES *bootsvc,
|
||||||
|
EFI_MEMORY_TYPE mem_type,
|
||||||
|
size_t *length,
|
||||||
|
void **pages)
|
||||||
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
EFI_PHYSICAL_ADDRESS addr;
|
||||||
|
|
||||||
|
size_t alignment = PAGE_SIZE;
|
||||||
|
while (alignment < *length)
|
||||||
|
alignment *= 2;
|
||||||
|
|
||||||
|
size_t page_count = alignment / PAGE_SIZE;
|
||||||
|
*length = alignment;
|
||||||
|
|
||||||
|
con_debug(L"Trying to find %d aligned pages for %x", page_count, mem_type);
|
||||||
|
|
||||||
|
status = bootsvc->AllocatePages(AllocateAnyPages, mem_type, page_count * 2, &addr);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Allocating %d pages for alignment", page_count * 2);
|
||||||
|
con_debug(L" Found %d pages at %lx", page_count * 2, addr);
|
||||||
|
|
||||||
|
EFI_PHYSICAL_ADDRESS aligned = addr;
|
||||||
|
aligned = ((aligned - 1) & ~(alignment - 1)) + alignment;
|
||||||
|
con_debug(L" Aligning %lx to %lx", addr, aligned);
|
||||||
|
|
||||||
|
size_t before =
|
||||||
|
(reinterpret_cast<uint64_t>(aligned) -
|
||||||
|
reinterpret_cast<uint64_t>(addr)) /
|
||||||
|
PAGE_SIZE;
|
||||||
|
|
||||||
|
if (before) {
|
||||||
|
con_debug(L" Freeing %d initial pages", before);
|
||||||
|
bootsvc->FreePages(addr, before);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t after = page_count - before;
|
||||||
|
if (after) {
|
||||||
|
EFI_PHYSICAL_ADDRESS end =
|
||||||
|
reinterpret_cast<EFI_PHYSICAL_ADDRESS>(
|
||||||
|
reinterpret_cast<uint64_t>(aligned) +
|
||||||
|
page_count * PAGE_SIZE);
|
||||||
|
con_debug(L" Freeing %d remaining pages", after);
|
||||||
|
bootsvc->FreePages(end, after);
|
||||||
|
}
|
||||||
|
|
||||||
|
*pages = (void *)aligned;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
loader_alloc_pages(
|
||||||
|
EFI_BOOT_SERVICES *bootsvc,
|
||||||
|
EFI_MEMORY_TYPE mem_type,
|
||||||
|
size_t *length,
|
||||||
|
void **pages)
|
||||||
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
|
||||||
|
size_t page_count = ((*length - 1) / PAGE_SIZE) + 1;
|
||||||
|
EFI_PHYSICAL_ADDRESS addr = (EFI_PHYSICAL_ADDRESS)*pages;
|
||||||
|
|
||||||
|
con_debug(L"Trying to find %d non-aligned pages for %x at %lx",
|
||||||
|
page_count, mem_type, addr);
|
||||||
|
|
||||||
|
status = bootsvc->AllocatePages(AllocateAddress, mem_type, page_count, &addr);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status,
|
||||||
|
L"Allocating %d kernel pages type %x",
|
||||||
|
page_count, mem_type);
|
||||||
|
|
||||||
|
*length = page_count * PAGE_SIZE;
|
||||||
|
*pages = (void *)addr;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
loader_load_initrd(
|
||||||
|
EFI_BOOT_SERVICES *bootsvc,
|
||||||
|
EFI_FILE_PROTOCOL *root,
|
||||||
|
struct loader_data *data)
|
||||||
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
|
||||||
|
EFI_FILE_PROTOCOL *file = NULL;
|
||||||
|
status = root->Open(root, &file, (wchar_t *)initrd_name, EFI_FILE_MODE_READ,
|
||||||
|
EFI_FILE_READ_ONLY | EFI_FILE_HIDDEN | EFI_FILE_SYSTEM);
|
||||||
|
|
||||||
|
if (status == EFI_NOT_FOUND)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Opening file %s", initrd_name);
|
||||||
|
|
||||||
|
char info[sizeof(EFI_FILE_INFO) + 100];
|
||||||
|
size_t info_length = sizeof(info);
|
||||||
|
|
||||||
|
status = file->GetInfo(file, &guid_file_info, &info_length, info);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Getting file info");
|
||||||
|
|
||||||
|
data->initrd_length = ((EFI_FILE_INFO *)info)->FileSize;
|
||||||
|
|
||||||
|
status = loader_alloc_aligned(
|
||||||
|
bootsvc,
|
||||||
|
memtype_initrd,
|
||||||
|
&data->initrd_length,
|
||||||
|
&data->initrd);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Allocating pages");
|
||||||
|
|
||||||
|
status = file->Read(file, &data->initrd_length, data->initrd);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Reading file");
|
||||||
|
|
||||||
|
status = file->Close(file);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Closing file handle");
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
loader_load_elf(
|
||||||
|
EFI_BOOT_SERVICES *bootsvc,
|
||||||
|
EFI_FILE_PROTOCOL *root,
|
||||||
|
struct loader_data *data)
|
||||||
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
|
||||||
|
con_debug(L"Opening kernel file %s", (wchar_t *)kernel_name);
|
||||||
|
|
||||||
|
EFI_FILE_PROTOCOL *file = NULL;
|
||||||
|
status = root->Open(root, &file, (wchar_t *)kernel_name, EFI_FILE_MODE_READ,
|
||||||
|
EFI_FILE_READ_ONLY | EFI_FILE_HIDDEN | EFI_FILE_SYSTEM);
|
||||||
|
|
||||||
|
if (status == EFI_NOT_FOUND)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
uint64_t length = 0;
|
||||||
|
data->kernel = 0;
|
||||||
|
data->kernel_entry = 0;
|
||||||
|
data->kernel_length = 0;
|
||||||
|
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Opening file %s", kernel_name);
|
||||||
|
|
||||||
|
struct elf_header header;
|
||||||
|
|
||||||
|
length = sizeof(struct elf_header);
|
||||||
|
status = file->Read(file, &length, &header);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Reading ELF header");
|
||||||
|
|
||||||
|
con_debug(L"Read %u bytes of ELF header", length);
|
||||||
|
|
||||||
|
if (length < sizeof(struct elf_header))
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(EFI_LOAD_ERROR, L"Incomplete read of ELF header");
|
||||||
|
|
||||||
|
static const char expected[] = {0x7f, 'E', 'L', 'F'};
|
||||||
|
for (int i = 0; i < sizeof(expected); ++i) {
|
||||||
|
if (header.ident.magic[i] != expected[i])
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(EFI_LOAD_ERROR, L"Bad ELF magic number");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header.ident.word_size != ELF_WORDSIZE)
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(EFI_LOAD_ERROR, L"ELF load error: 32 bit ELF not supported");
|
||||||
|
|
||||||
|
if (header.ph_entsize != sizeof(struct elf_program_header))
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(EFI_LOAD_ERROR, L"ELF load error: program header size mismatch");
|
||||||
|
|
||||||
|
if (header.ident.version != ELF_VERSION ||
|
||||||
|
header.version != ELF_VERSION)
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(EFI_LOAD_ERROR, L"ELF load error: wrong ELF version");
|
||||||
|
|
||||||
|
if (header.ident.endianness != 1 ||
|
||||||
|
header.ident.os_abi != 0 ||
|
||||||
|
header.machine != 0x3e)
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(EFI_LOAD_ERROR, L"ELF load error: wrong machine architecture");
|
||||||
|
|
||||||
|
con_debug(L"ELF is valid, entrypoint %lx", header.entrypoint);
|
||||||
|
|
||||||
|
data->kernel_entry = (void *)header.entrypoint;
|
||||||
|
|
||||||
|
struct elf_program_header prog_header;
|
||||||
|
for (int i = 0; i < header.ph_num; ++i) {
|
||||||
|
|
||||||
|
status = file->SetPosition(file, header.ph_offset + i * header.ph_entsize);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Setting ELF file position");
|
||||||
|
|
||||||
|
length = header.ph_entsize;
|
||||||
|
status = file->Read(file, &length, &prog_header);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Reading ELF program header");
|
||||||
|
|
||||||
|
if (prog_header.type != ELF_PT_LOAD) continue;
|
||||||
|
|
||||||
|
length = prog_header.mem_size;
|
||||||
|
void *addr = (void *)(prog_header.vaddr - KERNEL_VIRT_ADDRESS);
|
||||||
|
status = loader_alloc_pages(bootsvc, memtype_kernel, &length, &addr);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Allocating kernel pages");
|
||||||
|
|
||||||
|
if (data->kernel == 0)
|
||||||
|
data->kernel = addr;
|
||||||
|
data->kernel_length = (uint64_t)addr + length - (uint64_t)data->kernel;
|
||||||
|
}
|
||||||
|
con_debug(L"Read %d ELF program headers", header.ph_num);
|
||||||
|
|
||||||
|
struct elf_section_header sec_header;
|
||||||
|
for (int i = 0; i < header.sh_num; ++i) {
|
||||||
|
status = file->SetPosition(file, header.sh_offset + i * header.sh_entsize);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Setting ELF file position");
|
||||||
|
|
||||||
|
length = header.sh_entsize;
|
||||||
|
status = file->Read(file, &length, &sec_header);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Reading ELF section header");
|
||||||
|
|
||||||
|
if ((sec_header.flags & ELF_SHF_ALLOC) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *addr = (void *)(sec_header.addr - KERNEL_VIRT_ADDRESS);
|
||||||
|
|
||||||
|
if (sec_header.type == ELF_ST_PROGBITS) {
|
||||||
|
status = file->SetPosition(file, sec_header.offset);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Setting ELF file position");
|
||||||
|
|
||||||
|
length = sec_header.size;
|
||||||
|
status = file->Read(file, &length, addr);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Reading file");
|
||||||
|
} else if (sec_header.type == ELF_ST_NOBITS) {
|
||||||
|
bootsvc->SetMem(addr, sec_header.size, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
con_debug(L"Read %d ELF section headers", header.ph_num);
|
||||||
|
|
||||||
|
status = file->Close(file);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"Closing file handle");
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
loader_load_kernel(
|
||||||
|
EFI_BOOT_SERVICES *bootsvc,
|
||||||
|
struct loader_data *data)
|
||||||
|
{
|
||||||
|
if (data == NULL)
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(EFI_INVALID_PARAMETER, L"NULL loader_data");
|
||||||
|
|
||||||
|
EFI_STATUS status;
|
||||||
|
EFI_HANDLE *handles = NULL;
|
||||||
|
size_t handleCount = 0;
|
||||||
|
|
||||||
|
status = bootsvc->LocateHandleBuffer(ByProtocol, &guid_simple_filesystem, NULL, &handleCount, &handles);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"LocateHandleBuffer");
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < handleCount; ++i) {
|
||||||
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *fileSystem = NULL;
|
||||||
|
|
||||||
|
status = bootsvc->HandleProtocol(handles[i], &guid_simple_filesystem, (void **)&fileSystem);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"HandleProtocol");
|
||||||
|
|
||||||
|
EFI_FILE_PROTOCOL *root = NULL;
|
||||||
|
status = fileSystem->OpenVolume(fileSystem, &root);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"OpenVolume");
|
||||||
|
|
||||||
|
status = loader_load_elf(bootsvc, root, data);
|
||||||
|
if (status == EFI_NOT_FOUND)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"loader_load_elf: %s", kernel_name);
|
||||||
|
|
||||||
|
data->data = (void *)((uint64_t)data->kernel + data->kernel_length);
|
||||||
|
data->data_length += PAGE_SIZE; // extra page for map growth
|
||||||
|
|
||||||
|
status = loader_alloc_aligned(
|
||||||
|
bootsvc,
|
||||||
|
memtype_data,
|
||||||
|
&data->data_length,
|
||||||
|
&data->data);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"loader_alloc_aligned: kernel data");
|
||||||
|
|
||||||
|
data->initrd = (void *)((uint64_t)data->data + data->data_length);
|
||||||
|
status = loader_load_initrd(bootsvc, root, data);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, L"loader_load_file: %s", initrd_name);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <efi.h>
|
#include <efi/efi.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#define PAGE_SIZE 0x1000
|
#define PAGE_SIZE 0x1000
|
||||||
@@ -8,50 +8,28 @@
|
|||||||
#define KERNEL_PHYS_ADDRESS 0x100000
|
#define KERNEL_PHYS_ADDRESS 0x100000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef VIRTUAL_OFFSET
|
#ifndef KERNEL_VIRT_ADDRESS
|
||||||
#define VIRTUAL_OFFSET 0xf00000000
|
#define KERNEL_VIRT_ADDRESS 0xFFFFFF0000000000
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef KERNEL_MEMTYPE
|
|
||||||
#define KERNEL_MEMTYPE 0x80000000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef KERNEL_FONT_MEMTYPE
|
|
||||||
#define KERNEL_FONT_MEMTYPE 0x80000001
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef KERNEL_DATA_MEMTYPE
|
|
||||||
#define KERNEL_DATA_MEMTYPE 0x80000002
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef KERNEL_LOG_MEMTYPE
|
|
||||||
#define KERNEL_LOG_MEMTYPE 0x80000003
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef KERNEL_LOG_PAGES
|
|
||||||
#define KERNEL_LOG_PAGES 4
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef KERNEL_FILENAME
|
#ifndef KERNEL_FILENAME
|
||||||
#define KERNEL_FILENAME L"kernel.bin"
|
#define KERNEL_FILENAME L"kernel.elf"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef KERNEL_FONT
|
#ifndef INITRD_FILENAME
|
||||||
#define KERNEL_FONT L"screenfont.psf"
|
#define INITRD_FILENAME L"initrd.img"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct loader_data {
|
struct loader_data {
|
||||||
void *kernel;
|
void *kernel;
|
||||||
|
void *kernel_entry;
|
||||||
size_t kernel_length;
|
size_t kernel_length;
|
||||||
|
|
||||||
void *font;
|
void *initrd;
|
||||||
size_t font_length;
|
size_t initrd_length;
|
||||||
|
|
||||||
void *data;
|
void *data;
|
||||||
size_t data_length;
|
size_t data_length;
|
||||||
|
|
||||||
void *log;
|
|
||||||
size_t log_length;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_STATUS loader_load_kernel(EFI_BOOT_SERVICES *bootsvc, struct loader_data *data);
|
EFI_STATUS loader_load_kernel(EFI_BOOT_SERVICES *bootsvc, struct loader_data *data);
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
#include <efi.h>
|
|
||||||
#include <efilib.h>
|
|
||||||
#include <stdalign.h>
|
#include <stdalign.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include <efi/efi.h>
|
||||||
|
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
#include "guids.h"
|
#include "guids.h"
|
||||||
#include "kernel_data.h"
|
#include "kernel_args.h"
|
||||||
#include "loader.h"
|
#include "loader.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
|
|
||||||
|
#ifndef SCRATCH_PAGES
|
||||||
|
#define SCRATCH_PAGES 64
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef GIT_VERSION_WIDE
|
#ifndef GIT_VERSION_WIDE
|
||||||
#define GIT_VERSION_WIDE L"no version"
|
#define GIT_VERSION_WIDE L"no version"
|
||||||
#endif
|
#endif
|
||||||
@@ -27,23 +31,72 @@ struct kernel_header {
|
|||||||
uint8_t minor;
|
uint8_t minor;
|
||||||
uint16_t patch;
|
uint16_t patch;
|
||||||
uint32_t gitsha;
|
uint32_t gitsha;
|
||||||
|
|
||||||
void *entrypoint;
|
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
using kernel_entry = void (*)(kernel_args *);
|
||||||
|
|
||||||
|
static void
|
||||||
|
type_to_wchar(wchar_t *into, uint32_t type)
|
||||||
|
{
|
||||||
|
for (int j=0; j<4; ++j)
|
||||||
|
into[j] = static_cast<wchar_t>(reinterpret_cast<char *>(&type)[j]);
|
||||||
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
|
detect_debug_mode(EFI_RUNTIME_SERVICES *run, kernel_args *header) {
|
||||||
|
wchar_t var_name[] = L"debug";
|
||||||
|
|
||||||
|
EFI_STATUS status;
|
||||||
|
uint8_t debug = 0;
|
||||||
|
UINTN var_size = sizeof(debug);
|
||||||
|
|
||||||
|
#ifdef __JSIX_SET_DEBUG_UEFI_VAR__
|
||||||
|
debug = __JSIX_SET_DEBUG_UEFI_VAR__;
|
||||||
|
uint32_t attrs =
|
||||||
|
EFI_VARIABLE_NON_VOLATILE |
|
||||||
|
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||||
|
EFI_VARIABLE_RUNTIME_ACCESS;
|
||||||
|
status = run->SetVariable(
|
||||||
|
var_name,
|
||||||
|
&guid_jsix_vendor,
|
||||||
|
attrs,
|
||||||
|
var_size,
|
||||||
|
&debug);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, "detect_debug_mode::SetVariable");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
status = run->GetVariable(
|
||||||
|
var_name,
|
||||||
|
&guid_jsix_vendor,
|
||||||
|
nullptr,
|
||||||
|
&var_size,
|
||||||
|
&debug);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, "detect_debug_mode::GetVariable");
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
header->flags |= JSIX_FLAG_DEBUG;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" EFI_STATUS
|
||||||
efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
|
efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
|
||||||
{
|
{
|
||||||
EFI_STATUS status;
|
EFI_STATUS status;
|
||||||
EFI_BOOT_SERVICES *bootsvc = system_table->BootServices;
|
EFI_BOOT_SERVICES *bootsvc = system_table->BootServices;
|
||||||
|
EFI_RUNTIME_SERVICES *runsvc = system_table->RuntimeServices;
|
||||||
|
|
||||||
|
console con(system_table);
|
||||||
|
|
||||||
// When checking console initialization, use CHECK_EFI_STATUS_OR_RETURN
|
// When checking console initialization, use CHECK_EFI_STATUS_OR_RETURN
|
||||||
// because we can't be sure if the console was fully set up
|
// because we can't be sure if the console was fully set up
|
||||||
status = con_initialize(system_table, GIT_VERSION_WIDE);
|
status = con.initialize(GIT_VERSION_WIDE);
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, "con_initialize");
|
CHECK_EFI_STATUS_OR_RETURN(status, "console::initialize");
|
||||||
// From here on out, we can use CHECK_EFI_STATUS_OR_FAIL instead
|
// From here on out, we can use CHECK_EFI_STATUS_OR_FAIL instead
|
||||||
|
|
||||||
|
memory_init_pointer_fixup(bootsvc, runsvc, SCRATCH_PAGES);
|
||||||
|
|
||||||
// Find ACPI tables. Ignore ACPI 1.0 if a 2.0 table is found.
|
// Find ACPI tables. Ignore ACPI 1.0 if a 2.0 table is found.
|
||||||
//
|
//
|
||||||
void *acpi_table = NULL;
|
void *acpi_table = NULL;
|
||||||
@@ -64,65 +117,69 @@ efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
|
|||||||
status = memory_get_map_length(bootsvc, &data_length);
|
status = memory_get_map_length(bootsvc, &data_length);
|
||||||
CHECK_EFI_STATUS_OR_FAIL(status);
|
CHECK_EFI_STATUS_OR_FAIL(status);
|
||||||
|
|
||||||
size_t header_size = sizeof(struct popcorn_data);
|
size_t header_size = sizeof(kernel_args);
|
||||||
const size_t header_align = alignof(struct popcorn_data);
|
const size_t header_align = alignof(kernel_args);
|
||||||
if (header_size % header_align)
|
if (header_size % header_align)
|
||||||
header_size += header_align - (header_size % header_align);
|
header_size += header_align - (header_size % header_align);
|
||||||
|
|
||||||
data_length += header_size;
|
data_length += header_size;
|
||||||
|
|
||||||
|
|
||||||
// Load the kernel image from disk and check it
|
// Load the kernel image from disk and check it
|
||||||
//
|
//
|
||||||
void *kernel_image = NULL, *kernel_data = NULL;
|
console::print(L"Loading kernel into memory...\r\n");
|
||||||
uint64_t kernel_length = 0;
|
|
||||||
con_printf(L"Loading kernel into memory...\r\n");
|
|
||||||
|
|
||||||
struct loader_data load;
|
struct loader_data load;
|
||||||
load.data_length = data_length;
|
load.data_length = data_length;
|
||||||
status = loader_load_kernel(bootsvc, &load);
|
status = loader_load_kernel(bootsvc, &load);
|
||||||
CHECK_EFI_STATUS_OR_FAIL(status);
|
CHECK_EFI_STATUS_OR_FAIL(status);
|
||||||
|
|
||||||
con_printf(L" %u image bytes at 0x%x\r\n", load.kernel_length, load.kernel);
|
console::print(L" %x image bytes at 0x%x\r\n", load.kernel_length, load.kernel);
|
||||||
con_printf(L" %u font bytes at 0x%x\r\n", load.font_length, load.font);
|
console::print(L" %x data bytes at 0x%x\r\n", load.data_length, load.data);
|
||||||
con_printf(L" %u data bytes at 0x%x\r\n", load.data_length, load.data);
|
console::print(L" %x initrd bytes at 0x%x\r\n", load.initrd_length, load.initrd);
|
||||||
con_printf(L" %u log bytes at 0x%x\r\n", load.log_length, load.log);
|
|
||||||
|
|
||||||
struct kernel_header *version = (struct kernel_header *)load.kernel;
|
struct kernel_header *version = (struct kernel_header *)load.kernel;
|
||||||
if (version->magic != KERNEL_HEADER_MAGIC) {
|
if (version->magic != KERNEL_HEADER_MAGIC) {
|
||||||
con_printf(L" bad magic %x\r\n", version->magic);
|
console::print(L" bad magic %x\r\n", version->magic);
|
||||||
CHECK_EFI_STATUS_OR_FAIL(EFI_CRC_ERROR);
|
CHECK_EFI_STATUS_OR_FAIL(EFI_CRC_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
con_printf(L" Kernel version %d.%d.%d %x%s\r\n",
|
console::print(L" Kernel version %d.%d.%d %x%s\r\n",
|
||||||
version->major, version->minor, version->patch, version->gitsha & 0x0fffffff,
|
version->major, version->minor, version->patch, version->gitsha & 0x0fffffff,
|
||||||
version->gitsha & 0xf0000000 ? "*" : "");
|
version->gitsha & 0xf0000000 ? L"*" : L"");
|
||||||
con_printf(L" Entrypoint 0x%x\r\n", version->entrypoint);
|
console::print(L" Entrypoint 0x%x\r\n", load.kernel_entry);
|
||||||
|
|
||||||
void (*kernel_main)() = version->entrypoint;
|
kernel_entry kernel_main =
|
||||||
|
reinterpret_cast<kernel_entry>(load.kernel_entry);
|
||||||
|
memory_mark_pointer_fixup((void **)&kernel_main);
|
||||||
|
|
||||||
// Set up the kernel data pages to pass to the kernel
|
// Set up the kernel data pages to pass to the kernel
|
||||||
//
|
//
|
||||||
struct popcorn_data *data_header = (struct popcorn_data *)load.data;
|
struct kernel_args *data_header = (struct kernel_args *)load.data;
|
||||||
|
memory_mark_pointer_fixup((void **)&data_header);
|
||||||
|
|
||||||
data_header->magic = DATA_HEADER_MAGIC;
|
data_header->magic = DATA_HEADER_MAGIC;
|
||||||
data_header->version = DATA_HEADER_VERSION;
|
data_header->version = DATA_HEADER_VERSION;
|
||||||
data_header->length = sizeof(struct popcorn_data);
|
data_header->length = sizeof(struct kernel_args);
|
||||||
|
|
||||||
|
data_header->scratch_pages = SCRATCH_PAGES;
|
||||||
data_header->flags = 0;
|
data_header->flags = 0;
|
||||||
|
|
||||||
data_header->font = load.font;
|
data_header->initrd = load.initrd;
|
||||||
data_header->font_length = load.font_length;
|
data_header->initrd_length = load.initrd_length;
|
||||||
|
memory_mark_pointer_fixup((void **)&data_header->initrd);
|
||||||
|
|
||||||
data_header->data = load.data;
|
data_header->data = load.data;
|
||||||
data_header->data_length = load.data_length;
|
data_header->data_length = load.data_length;
|
||||||
|
memory_mark_pointer_fixup((void **)&data_header->data);
|
||||||
data_header->log = load.log;
|
|
||||||
data_header->log_length = load.log_length;
|
|
||||||
|
|
||||||
data_header->memory_map = (EFI_MEMORY_DESCRIPTOR *)(data_header + 1);
|
data_header->memory_map = (EFI_MEMORY_DESCRIPTOR *)(data_header + 1);
|
||||||
data_header->runtime = system_table->RuntimeServices;
|
memory_mark_pointer_fixup((void **)&data_header->memory_map);
|
||||||
|
|
||||||
|
data_header->runtime = runsvc;
|
||||||
|
memory_mark_pointer_fixup((void **)&data_header->runtime);
|
||||||
|
|
||||||
data_header->acpi_table = acpi_table;
|
data_header->acpi_table = acpi_table;
|
||||||
|
memory_mark_pointer_fixup((void **)&data_header->acpi_table);
|
||||||
|
|
||||||
data_header->_reserved0 = 0;
|
data_header->_reserved0 = 0;
|
||||||
data_header->_reserved1 = 0;
|
data_header->_reserved1 = 0;
|
||||||
@@ -132,28 +189,37 @@ efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
|
|||||||
status = con_get_framebuffer(
|
status = con_get_framebuffer(
|
||||||
bootsvc,
|
bootsvc,
|
||||||
&data_header->frame_buffer,
|
&data_header->frame_buffer,
|
||||||
&data_header->frame_buffer_size,
|
&data_header->frame_buffer_length,
|
||||||
&data_header->hres,
|
&data_header->hres,
|
||||||
&data_header->vres,
|
&data_header->vres,
|
||||||
&data_header->rmask,
|
&data_header->rmask,
|
||||||
&data_header->gmask,
|
&data_header->gmask,
|
||||||
&data_header->bmask);
|
&data_header->bmask);
|
||||||
CHECK_EFI_STATUS_OR_FAIL(status);
|
CHECK_EFI_STATUS_OR_FAIL(status);
|
||||||
|
memory_mark_pointer_fixup((void **)&data_header->frame_buffer);
|
||||||
|
|
||||||
// Save the memory map and tell the firmware we're taking control.
|
// Save the memory map and tell the firmware we're taking control.
|
||||||
//
|
//
|
||||||
struct memory_map map;
|
struct memory_map map;
|
||||||
map.entries = data_header->memory_map;
|
|
||||||
map.length = (load.data_length - header_size);
|
map.length = (load.data_length - header_size);
|
||||||
|
map.entries =
|
||||||
|
reinterpret_cast<EFI_MEMORY_DESCRIPTOR *>(data_header->memory_map);
|
||||||
|
|
||||||
status = memory_get_map(bootsvc, &map);
|
status = memory_get_map(bootsvc, &map);
|
||||||
CHECK_EFI_STATUS_OR_FAIL(status);
|
CHECK_EFI_STATUS_OR_FAIL(status);
|
||||||
|
|
||||||
|
data_header->memory_map_length = map.length;
|
||||||
|
data_header->memory_map_desc_size = map.size;
|
||||||
|
|
||||||
|
detect_debug_mode(runsvc, data_header);
|
||||||
|
|
||||||
// bootsvc->Stall(5000000);
|
// bootsvc->Stall(5000000);
|
||||||
|
|
||||||
status = bootsvc->ExitBootServices(image_handle, map.key);
|
status = bootsvc->ExitBootServices(image_handle, map.key);
|
||||||
CHECK_EFI_STATUS_OR_ASSERT(status, 0);
|
CHECK_EFI_STATUS_OR_ASSERT(status, 0);
|
||||||
|
|
||||||
|
memory_virtualize(runsvc, &map);
|
||||||
|
|
||||||
// Hand control to the kernel
|
// Hand control to the kernel
|
||||||
//
|
//
|
||||||
kernel_main(data_header);
|
kernel_main(data_header);
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
#include <efi.h>
|
|
||||||
#include <efilib.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "loader.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "utility.h"
|
|
||||||
|
|
||||||
#define INCREMENT_DESC(p, b) (EFI_MEMORY_DESCRIPTOR*)(((uint8_t*)(p))+(b))
|
|
||||||
|
|
||||||
const CHAR16 *memory_type_names[] = {
|
|
||||||
L"EfiReservedMemoryType",
|
|
||||||
L"EfiLoaderCode",
|
|
||||||
L"EfiLoaderData",
|
|
||||||
L"EfiBootServicesCode",
|
|
||||||
L"EfiBootServicesData",
|
|
||||||
L"EfiRuntimeServicesCode",
|
|
||||||
L"EfiRuntimeServicesData",
|
|
||||||
L"EfiConventionalMemory",
|
|
||||||
L"EfiUnusableMemory",
|
|
||||||
L"EfiACPIReclaimMemory",
|
|
||||||
L"EfiACPIMemoryNVS",
|
|
||||||
L"EfiMemoryMappedIO",
|
|
||||||
L"EfiMemoryMappedIOPortSpace",
|
|
||||||
L"EfiPalCode",
|
|
||||||
L"EfiPersistentMemory",
|
|
||||||
};
|
|
||||||
|
|
||||||
static const CHAR16 *
|
|
||||||
memory_type_name(UINT32 value)
|
|
||||||
{
|
|
||||||
if (value >= (sizeof(memory_type_names) / sizeof(CHAR16 *))) {
|
|
||||||
if (value == KERNEL_DATA_MEMTYPE) return L"Kernel Data";
|
|
||||||
else if (value == KERNEL_MEMTYPE) return L"Kernel Image";
|
|
||||||
else return L"Bad Type Value";
|
|
||||||
}
|
|
||||||
return memory_type_names[value];
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
copy_desc(EFI_MEMORY_DESCRIPTOR *src, EFI_MEMORY_DESCRIPTOR *dst, size_t len)
|
|
||||||
{
|
|
||||||
uint8_t *srcb = (uint8_t *)src;
|
|
||||||
uint8_t *dstb = (uint8_t *)dst;
|
|
||||||
uint8_t *endb = srcb + len;
|
|
||||||
while (srcb < endb)
|
|
||||||
*dstb++ = *srcb++;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
memory_get_map_length(EFI_BOOT_SERVICES *bootsvc, size_t *size)
|
|
||||||
{
|
|
||||||
if (size == NULL)
|
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
|
|
||||||
EFI_STATUS status;
|
|
||||||
size_t key, desc_size;
|
|
||||||
uint32_t desc_version;
|
|
||||||
*size = 0;
|
|
||||||
status = bootsvc->GetMemoryMap(size, 0, &key, &desc_size, &desc_version);
|
|
||||||
if (status != EFI_BUFFER_TOO_SMALL) {
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, "Failed to get memory map size");
|
|
||||||
}
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
memory_get_map(EFI_BOOT_SERVICES *bootsvc, struct memory_map *map)
|
|
||||||
{
|
|
||||||
EFI_STATUS status;
|
|
||||||
|
|
||||||
if (map == NULL)
|
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
|
|
||||||
size_t needs_size = 0;
|
|
||||||
status = memory_get_map_length(bootsvc, &needs_size);
|
|
||||||
if (EFI_ERROR(status)) return status;
|
|
||||||
|
|
||||||
if (map->length < needs_size)
|
|
||||||
return EFI_BUFFER_TOO_SMALL;
|
|
||||||
|
|
||||||
status = bootsvc->GetMemoryMap(&map->length, map->entries, &map->key, &map->size, &map->version);
|
|
||||||
CHECK_EFI_STATUS_OR_RETURN(status, "Failed to load memory map");
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
memory_dump_map(struct memory_map *map)
|
|
||||||
{
|
|
||||||
if (map == NULL)
|
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
|
|
||||||
const size_t count = map->length / map->size;
|
|
||||||
|
|
||||||
con_printf(L"Memory map:\n");
|
|
||||||
con_printf(L"\t Descriptor Count: %d (%d bytes)\n", count, map->length);
|
|
||||||
con_printf(L"\t Descriptor Size: %d bytes\n", map->size);
|
|
||||||
con_printf(L"\t Type offset: %d\n\n", offsetof(EFI_MEMORY_DESCRIPTOR, Type));
|
|
||||||
|
|
||||||
EFI_MEMORY_DESCRIPTOR *end = INCREMENT_DESC(map->entries, map->length);
|
|
||||||
EFI_MEMORY_DESCRIPTOR *d = map->entries;
|
|
||||||
while (d < end) {
|
|
||||||
int runtime = (d->Attribute & EFI_MEMORY_RUNTIME) == EFI_MEMORY_RUNTIME;
|
|
||||||
con_printf(L"%s%s ", memory_type_name(d->Type), runtime ? L"*" : L" ");
|
|
||||||
con_printf(L"%lx ", d->PhysicalStart);
|
|
||||||
con_printf(L"%lx ", d->VirtualStart);
|
|
||||||
con_printf(L"[%4d]\n", d->NumberOfPages);
|
|
||||||
|
|
||||||
d = INCREMENT_DESC(d, map->size);
|
|
||||||
}
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
215
src/boot/memory.cpp
Normal file
215
src/boot/memory.cpp
Normal file
@@ -0,0 +1,215 @@
|
|||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "loader.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
|
const EFI_MEMORY_TYPE memtype_kernel = static_cast<EFI_MEMORY_TYPE>(0x80000000);
|
||||||
|
const EFI_MEMORY_TYPE memtype_data = static_cast<EFI_MEMORY_TYPE>(0x80000001);
|
||||||
|
const EFI_MEMORY_TYPE memtype_initrd = static_cast<EFI_MEMORY_TYPE>(0x80000002);
|
||||||
|
const EFI_MEMORY_TYPE memtype_scratch = static_cast<EFI_MEMORY_TYPE>(0x80000003);
|
||||||
|
|
||||||
|
#define INCREMENT_DESC(p, b) (EFI_MEMORY_DESCRIPTOR*)(((uint8_t*)(p))+(b))
|
||||||
|
|
||||||
|
size_t fixup_pointer_index = 0;
|
||||||
|
void **fixup_pointers[64];
|
||||||
|
uint64_t *new_pml4 = 0;
|
||||||
|
|
||||||
|
const wchar_t *memory_type_names[] = {
|
||||||
|
L"EfiReservedMemoryType",
|
||||||
|
L"EfiLoaderCode",
|
||||||
|
L"EfiLoaderData",
|
||||||
|
L"EfiBootServicesCode",
|
||||||
|
L"EfiBootServicesData",
|
||||||
|
L"EfiRuntimeServicesCode",
|
||||||
|
L"EfiRuntimeServicesData",
|
||||||
|
L"EfiConventionalMemory",
|
||||||
|
L"EfiUnusableMemory",
|
||||||
|
L"EfiACPIReclaimMemory",
|
||||||
|
L"EfiACPIMemoryNVS",
|
||||||
|
L"EfiMemoryMappedIO",
|
||||||
|
L"EfiMemoryMappedIOPortSpace",
|
||||||
|
L"EfiPalCode",
|
||||||
|
L"EfiPersistentMemory",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const wchar_t *
|
||||||
|
memory_type_name(UINT32 value)
|
||||||
|
{
|
||||||
|
if (value >= (sizeof(memory_type_names) / sizeof(wchar_t *))) {
|
||||||
|
switch (value) {
|
||||||
|
case memtype_kernel: return L"Kernel Data";
|
||||||
|
case memtype_data: return L"Kernel Data";
|
||||||
|
case memtype_initrd: return L"Initial Ramdisk";
|
||||||
|
case memtype_scratch: return L"Kernel Scratch Space";
|
||||||
|
default: return L"Bad Type Value";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return memory_type_names[value];
|
||||||
|
}
|
||||||
|
|
||||||
|
void EFIAPI
|
||||||
|
memory_update_marked_addresses(EFI_EVENT UNUSED *event, void *context)
|
||||||
|
{
|
||||||
|
EFI_RUNTIME_SERVICES *runsvc = (EFI_RUNTIME_SERVICES*)context;
|
||||||
|
for (size_t i = 0; i < fixup_pointer_index; ++i) {
|
||||||
|
if (fixup_pointers[i])
|
||||||
|
runsvc->ConvertPointer(0, fixup_pointers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
memory_init_pointer_fixup(EFI_BOOT_SERVICES *bootsvc, EFI_RUNTIME_SERVICES *runsvc, unsigned scratch_pages)
|
||||||
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
EFI_EVENT event;
|
||||||
|
|
||||||
|
status = bootsvc->CreateEvent(
|
||||||
|
EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE,
|
||||||
|
TPL_CALLBACK,
|
||||||
|
(EFI_EVENT_NOTIFY)&memory_update_marked_addresses,
|
||||||
|
runsvc,
|
||||||
|
&event);
|
||||||
|
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, "Failed to initialize pointer update event.");
|
||||||
|
|
||||||
|
// Reserve a page for our replacement PML4, plus some pages for the kernel to use
|
||||||
|
// as page tables while it gets started.
|
||||||
|
EFI_PHYSICAL_ADDRESS addr = 0;
|
||||||
|
status = bootsvc->AllocatePages(AllocateAnyPages, memtype_scratch, scratch_pages, &addr);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, "Failed to allocate page table pages.");
|
||||||
|
|
||||||
|
new_pml4 = (uint64_t *)addr;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
memory_mark_pointer_fixup(void **p)
|
||||||
|
{
|
||||||
|
if (fixup_pointer_index == 0) {
|
||||||
|
const size_t count = sizeof(fixup_pointers) / sizeof(void*);
|
||||||
|
for (size_t i = 0; i < count; ++i) fixup_pointers[i] = 0;
|
||||||
|
}
|
||||||
|
fixup_pointers[fixup_pointer_index++] = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
copy_desc(EFI_MEMORY_DESCRIPTOR *src, EFI_MEMORY_DESCRIPTOR *dst, size_t len)
|
||||||
|
{
|
||||||
|
uint8_t *srcb = (uint8_t *)src;
|
||||||
|
uint8_t *dstb = (uint8_t *)dst;
|
||||||
|
uint8_t *endb = srcb + len;
|
||||||
|
while (srcb < endb)
|
||||||
|
*dstb++ = *srcb++;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
memory_get_map_length(EFI_BOOT_SERVICES *bootsvc, size_t *size)
|
||||||
|
{
|
||||||
|
if (size == NULL)
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
EFI_STATUS status;
|
||||||
|
size_t key, desc_size;
|
||||||
|
uint32_t desc_version;
|
||||||
|
*size = 0;
|
||||||
|
status = bootsvc->GetMemoryMap(size, 0, &key, &desc_size, &desc_version);
|
||||||
|
if (status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, "Failed to get memory map size");
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
memory_get_map(EFI_BOOT_SERVICES *bootsvc, struct memory_map *map)
|
||||||
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
|
||||||
|
if (map == NULL)
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
size_t needs_size = 0;
|
||||||
|
status = memory_get_map_length(bootsvc, &needs_size);
|
||||||
|
if (EFI_ERROR(status)) return status;
|
||||||
|
|
||||||
|
if (map->length < needs_size)
|
||||||
|
return EFI_BUFFER_TOO_SMALL;
|
||||||
|
|
||||||
|
status = bootsvc->GetMemoryMap(&map->length, map->entries, &map->key, &map->size, &map->version);
|
||||||
|
CHECK_EFI_STATUS_OR_RETURN(status, "Failed to load memory map");
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
memory_dump_map(struct memory_map *map)
|
||||||
|
{
|
||||||
|
if (map == NULL)
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
const size_t count = map->length / map->size;
|
||||||
|
|
||||||
|
console::print(L"Memory map:\n");
|
||||||
|
console::print(L"\t Descriptor Count: %d (%d bytes)\n", count, map->length);
|
||||||
|
console::print(L"\t Descriptor Size: %d bytes\n", map->size);
|
||||||
|
console::print(L"\t Type offset: %d\n\n", offsetof(EFI_MEMORY_DESCRIPTOR, Type));
|
||||||
|
|
||||||
|
EFI_MEMORY_DESCRIPTOR *end = INCREMENT_DESC(map->entries, map->length);
|
||||||
|
EFI_MEMORY_DESCRIPTOR *d = map->entries;
|
||||||
|
while (d < end) {
|
||||||
|
int runtime = (d->Attribute & EFI_MEMORY_RUNTIME) == EFI_MEMORY_RUNTIME;
|
||||||
|
console::print(L"%s%s ", memory_type_name(d->Type), runtime ? L"*" : L" ");
|
||||||
|
console::print(L"%lx ", d->PhysicalStart);
|
||||||
|
console::print(L"%lx ", d->VirtualStart);
|
||||||
|
console::print(L"[%4d]\n", d->NumberOfPages);
|
||||||
|
|
||||||
|
d = INCREMENT_DESC(d, map->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
memory_virtualize(EFI_RUNTIME_SERVICES *runsvc, struct memory_map *map)
|
||||||
|
{
|
||||||
|
memory_mark_pointer_fixup((void **)&runsvc);
|
||||||
|
memory_mark_pointer_fixup((void **)&map);
|
||||||
|
|
||||||
|
// Get the pointer to the start of PML4
|
||||||
|
uint64_t* cr3 = 0;
|
||||||
|
__asm__ __volatile__ ( "mov %%cr3, %0" : "=r" (cr3) );
|
||||||
|
|
||||||
|
// PML4 is indexed with bits 39:47 of the virtual address
|
||||||
|
uint64_t offset = (KERNEL_VIRT_ADDRESS >> 39) & 0x1ff;
|
||||||
|
|
||||||
|
// Double map the lower half pages that are present into the higher half
|
||||||
|
for (unsigned i = 0; i < offset; ++i) {
|
||||||
|
if (cr3[i] & 0x1)
|
||||||
|
new_pml4[i] = new_pml4[offset+i] = cr3[i];
|
||||||
|
else
|
||||||
|
new_pml4[i] = new_pml4[offset+i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write our new PML4 pointer back to CR3
|
||||||
|
__asm__ __volatile__ ( "mov %0, %%cr3" :: "r" (new_pml4) );
|
||||||
|
|
||||||
|
EFI_MEMORY_DESCRIPTOR *end = INCREMENT_DESC(map->entries, map->length);
|
||||||
|
EFI_MEMORY_DESCRIPTOR *d = map->entries;
|
||||||
|
while (d < end) {
|
||||||
|
switch (d->Type) {
|
||||||
|
case memtype_kernel:
|
||||||
|
case memtype_data:
|
||||||
|
case memtype_initrd:
|
||||||
|
case memtype_scratch:
|
||||||
|
d->Attribute |= EFI_MEMORY_RUNTIME;
|
||||||
|
d->VirtualStart = d->PhysicalStart + KERNEL_VIRT_ADDRESS;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (d->Attribute & EFI_MEMORY_RUNTIME) {
|
||||||
|
d->VirtualStart = d->PhysicalStart + KERNEL_VIRT_ADDRESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d = INCREMENT_DESC(d, map->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
runsvc->SetVirtualAddressMap(map->length, map->size, map->version, map->entries);
|
||||||
|
}
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <efi.h>
|
#include <efi/efi.h>
|
||||||
|
|
||||||
|
extern const EFI_MEMORY_TYPE memtype_kernel;
|
||||||
|
extern const EFI_MEMORY_TYPE memtype_data;
|
||||||
|
extern const EFI_MEMORY_TYPE memtype_initrd;
|
||||||
|
extern const EFI_MEMORY_TYPE memtype_scratch;
|
||||||
|
|
||||||
struct memory_map {
|
struct memory_map {
|
||||||
size_t length;
|
size_t length;
|
||||||
@@ -9,6 +14,14 @@ struct memory_map {
|
|||||||
EFI_MEMORY_DESCRIPTOR *entries;
|
EFI_MEMORY_DESCRIPTOR *entries;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EFI_STATUS memory_init_pointer_fixup(
|
||||||
|
EFI_BOOT_SERVICES *bootsvc,
|
||||||
|
EFI_RUNTIME_SERVICES *runsvc,
|
||||||
|
unsigned scratch_pages);
|
||||||
|
void memory_mark_pointer_fixup(void **p);
|
||||||
|
|
||||||
EFI_STATUS memory_get_map_length(EFI_BOOT_SERVICES *bootsvc, size_t *size);
|
EFI_STATUS memory_get_map_length(EFI_BOOT_SERVICES *bootsvc, size_t *size);
|
||||||
EFI_STATUS memory_get_map(EFI_BOOT_SERVICES *bootsvc, struct memory_map *map);
|
EFI_STATUS memory_get_map(EFI_BOOT_SERVICES *bootsvc, struct memory_map *map);
|
||||||
EFI_STATUS memory_dump_map(struct memory_map *map);
|
EFI_STATUS memory_dump_map(struct memory_map *map);
|
||||||
|
|
||||||
|
void memory_virtualize(EFI_RUNTIME_SERVICES *runsvc, struct memory_map *map);
|
||||||
|
|||||||
97
src/boot/reloc.cpp
Normal file
97
src/boot/reloc.cpp
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/* reloc_x86_64.c - position independent x86_64 ELF shared object relocator
|
||||||
|
Copyright (C) 1999 Hewlett-Packard Co.
|
||||||
|
Contributed by David Mosberger <davidm@hpl.hp.com>.
|
||||||
|
Copyright (C) 2005 Intel Co.
|
||||||
|
Contributed by Fenghua Yu <fenghua.yu@intel.com>.
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer in the documentation and/or other materials
|
||||||
|
provided with the distribution.
|
||||||
|
* Neither the name of Hewlett-Packard Co. nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||||
|
BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||||
|
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||||
|
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <efi/efi.h>
|
||||||
|
#include <elf.h>
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
EFI_STATUS _relocate (long ldbase, Elf64_Dyn *dyn,
|
||||||
|
EFI_HANDLE image EFI_UNUSED,
|
||||||
|
EFI_SYSTEM_TABLE *systab EFI_UNUSED)
|
||||||
|
{
|
||||||
|
long relsz = 0, relent = 0;
|
||||||
|
Elf64_Rel *rel = 0;
|
||||||
|
unsigned long *addr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; dyn[i].d_tag != DT_NULL; ++i) {
|
||||||
|
switch (dyn[i].d_tag) {
|
||||||
|
case DT_RELA:
|
||||||
|
rel = (Elf64_Rel*)
|
||||||
|
((unsigned long)dyn[i].d_un.d_ptr
|
||||||
|
+ ldbase);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DT_RELASZ:
|
||||||
|
relsz = dyn[i].d_un.d_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DT_RELAENT:
|
||||||
|
relent = dyn[i].d_un.d_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rel && relent == 0)
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
|
if (!rel || relent == 0)
|
||||||
|
return EFI_LOAD_ERROR;
|
||||||
|
|
||||||
|
while (relsz > 0) {
|
||||||
|
/* apply the relocs */
|
||||||
|
switch (ELF64_R_TYPE (rel->r_info)) {
|
||||||
|
case R_X86_64_NONE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_X86_64_RELATIVE:
|
||||||
|
addr = (unsigned long *)
|
||||||
|
(ldbase + rel->r_offset);
|
||||||
|
*addr += ldbase;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rel = (Elf64_Rel*) ((char *) rel + relent);
|
||||||
|
relsz -= relent;
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
struct error_code_desc {
|
struct error_code_desc {
|
||||||
EFI_STATUS code;
|
EFI_STATUS code;
|
||||||
CHAR16 *name;
|
const wchar_t *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Based off the gnu-efi table
|
// Based off the gnu-efi table
|
||||||
@@ -47,7 +47,7 @@ struct error_code_desc error_table[] = {
|
|||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
const CHAR16 *
|
const wchar_t *
|
||||||
util_error_message(EFI_STATUS status)
|
util_error_message(EFI_STATUS status)
|
||||||
{
|
{
|
||||||
int32_t i = -1;
|
int32_t i = -1;
|
||||||
@@ -62,7 +62,7 @@ util_error_message(EFI_STATUS status)
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
wstrlen(const CHAR16 *s)
|
wstrlen(const wchar_t *s)
|
||||||
{
|
{
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
while (s && *s++) count++;
|
while (s && *s++) count++;
|
||||||
@@ -1,22 +1,22 @@
|
|||||||
#include "console.h"
|
|
||||||
#include <efi.h>
|
|
||||||
#include <efilib.h>
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <efi/efi.h>
|
||||||
|
|
||||||
|
#include "console.h"
|
||||||
|
|
||||||
#define UNUSED __attribute__((unused))
|
#define UNUSED __attribute__((unused))
|
||||||
|
|
||||||
size_t wstrlen(const CHAR16 *s);
|
size_t wstrlen(const wchar_t *s);
|
||||||
const CHAR16 *util_error_message(EFI_STATUS status);
|
const wchar_t *util_error_message(EFI_STATUS status);
|
||||||
|
|
||||||
#define CHECK_EFI_STATUS_OR_RETURN(s, msg, ...) \
|
#define CHECK_EFI_STATUS_OR_RETURN(s, msg, ...) \
|
||||||
if (EFI_ERROR((s))) { \
|
if (EFI_ERROR((s))) { \
|
||||||
con_printf(L"ERROR: " msg L": %s\r\n", ##__VA_ARGS__, util_error_message(s)); \
|
console::print(L"ERROR: " msg L": %s\r\n", ##__VA_ARGS__, util_error_message(s)); \
|
||||||
return (s); \
|
return (s); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CHECK_EFI_STATUS_OR_FAIL(s) \
|
#define CHECK_EFI_STATUS_OR_FAIL(s) \
|
||||||
if (EFI_ERROR((s))) { \
|
if (EFI_ERROR((s))) { \
|
||||||
con_status_fail(util_error_message(s)); \
|
console::get().status_fail(util_error_message(s)); \
|
||||||
while (1) __asm__("hlt"); \
|
while (1) __asm__("hlt"); \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,3 +32,9 @@ const CHAR16 *util_error_message(EFI_STATUS status);
|
|||||||
: "r"((uint64_t)s), "r"((uint64_t)d), "r"((uint64_t)__LINE__) \
|
: "r"((uint64_t)s), "r"((uint64_t)d), "r"((uint64_t)__LINE__) \
|
||||||
: "rax", "rdx", "r8", "r9", "r10"); \
|
: "rax", "rdx", "r8", "r9", "r10"); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BOOTLOADER_DEBUG
|
||||||
|
#define con_debug(msg, ...) console::print(L"DEBUG: " msg L"\r\n", __VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define con_debug(msg, ...)
|
||||||
|
#endif
|
||||||
|
|||||||
67
src/drivers/ahci/ata.h
Normal file
67
src/drivers/ahci/ata.h
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#pragma once
|
||||||
|
/// \file ata.h
|
||||||
|
/// Definitions for ATA codes
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "kutil/enum_bitfields.h"
|
||||||
|
|
||||||
|
namespace ahci {
|
||||||
|
|
||||||
|
|
||||||
|
enum class ata_status : uint8_t
|
||||||
|
{
|
||||||
|
error = 0x01,
|
||||||
|
index = 0x02,
|
||||||
|
corrected = 0x04,
|
||||||
|
data_ready = 0x08,
|
||||||
|
seek_done = 0x10,
|
||||||
|
fault = 0x20,
|
||||||
|
ready = 0x40,
|
||||||
|
busy = 0x80
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum class ata_error : uint8_t
|
||||||
|
{
|
||||||
|
amnf = 0x01, // Address mark not found
|
||||||
|
tkznf = 0x02, // Track 0 not found
|
||||||
|
abort = 0x04, // Command abort
|
||||||
|
mcr = 0x08, // No media
|
||||||
|
idnf = 0x10, // Id not found
|
||||||
|
mc = 0x20, // No media
|
||||||
|
unc = 0x40, // Uncorrectable
|
||||||
|
bbk = 0x80, // Bad sector
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum class ata_cmd : uint8_t
|
||||||
|
{
|
||||||
|
read_pio = 0x20,
|
||||||
|
read_pio_ext = 0x24,
|
||||||
|
read_dma = 0xC8,
|
||||||
|
read_dma_ext = 0x25,
|
||||||
|
write_pio = 0x30,
|
||||||
|
write_pio_ext = 0x34,
|
||||||
|
write_dma = 0xCA,
|
||||||
|
write_dma_ext = 0x35,
|
||||||
|
cache_flush = 0xE7,
|
||||||
|
cache_flush_ext = 0xEA,
|
||||||
|
packet = 0xA0,
|
||||||
|
identify_packet = 0xA1,
|
||||||
|
identify = 0xEC
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum class sata_signature : uint32_t
|
||||||
|
{
|
||||||
|
none = 0x00000000,
|
||||||
|
|
||||||
|
sata_drive = 0x00000101,
|
||||||
|
satapi_drive = 0xeb140101,
|
||||||
|
enclosure = 0xc33c0101,
|
||||||
|
port_muxer = 0x96690101
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ahci
|
||||||
|
|
||||||
|
IS_BITFIELD(ahci::ata_status);
|
||||||
|
IS_BITFIELD(ahci::ata_error);
|
||||||
22
src/drivers/ahci/driver.cpp
Normal file
22
src/drivers/ahci/driver.cpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#include "kutil/enum_bitfields.h"
|
||||||
|
#include "ahci/driver.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "pci.h"
|
||||||
|
|
||||||
|
namespace ahci {
|
||||||
|
|
||||||
|
|
||||||
|
driver::driver()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
driver::register_device(pci_device *device)
|
||||||
|
{
|
||||||
|
log::info(logs::driver, "AHCI registering device %d:%d:%d:",
|
||||||
|
device->bus(), device->device(), device->function());
|
||||||
|
|
||||||
|
ahci::hba &hba = m_devices.emplace(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
31
src/drivers/ahci/driver.h
Normal file
31
src/drivers/ahci/driver.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#pragma once
|
||||||
|
/// \file ahci.h
|
||||||
|
/// AHCI driver and related definitions
|
||||||
|
#include "kutil/vector.h"
|
||||||
|
#include "ahci/hba.h"
|
||||||
|
|
||||||
|
class pci_device;
|
||||||
|
|
||||||
|
namespace ahci {
|
||||||
|
|
||||||
|
|
||||||
|
/// Basic AHCI driver
|
||||||
|
class driver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Constructor.
|
||||||
|
driver();
|
||||||
|
|
||||||
|
/// Register a device with the driver
|
||||||
|
/// \arg device The PCI device to handle
|
||||||
|
void register_device(pci_device *device);
|
||||||
|
|
||||||
|
/// Unregister a device from the driver
|
||||||
|
/// \arg device The PCI device to remove
|
||||||
|
void unregister_device(pci_device *device);
|
||||||
|
|
||||||
|
private:
|
||||||
|
kutil::vector<ahci::hba> m_devices;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
49
src/drivers/ahci/fis.h
Normal file
49
src/drivers/ahci/fis.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#pragma once
|
||||||
|
/// \file fis.h
|
||||||
|
/// Definitions for Frame Information Structure types. (Not for pescatarians.)
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace ahci {
|
||||||
|
|
||||||
|
enum class ata_cmd : uint8_t;
|
||||||
|
|
||||||
|
enum class fis_type : uint8_t
|
||||||
|
{
|
||||||
|
register_h2d = 0x27,
|
||||||
|
register_d2h = 0x34,
|
||||||
|
dma_activate = 0x39,
|
||||||
|
dma_setup = 0x41,
|
||||||
|
data = 0x46,
|
||||||
|
bist = 0x58,
|
||||||
|
pio_setup = 0x5f,
|
||||||
|
device_bits = 0xa1
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct fis_register_h2d
|
||||||
|
{
|
||||||
|
fis_type type;
|
||||||
|
uint8_t pm_port; // high bit (0x80) is set for the command register flag
|
||||||
|
ata_cmd command;
|
||||||
|
uint8_t features;
|
||||||
|
|
||||||
|
uint8_t lba0;
|
||||||
|
uint8_t lba1;
|
||||||
|
uint8_t lba2;
|
||||||
|
uint8_t device;
|
||||||
|
|
||||||
|
uint8_t lba3;
|
||||||
|
uint8_t lba4;
|
||||||
|
uint8_t lba5;
|
||||||
|
uint8_t features2;
|
||||||
|
|
||||||
|
uint8_t count0;
|
||||||
|
uint8_t count1;
|
||||||
|
uint8_t icc;
|
||||||
|
uint8_t control;
|
||||||
|
|
||||||
|
uint32_t reserved;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ahci
|
||||||
143
src/drivers/ahci/hba.cpp
Normal file
143
src/drivers/ahci/hba.cpp
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include "ahci/ata.h"
|
||||||
|
#include "ahci/hba.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "device_manager.h"
|
||||||
|
#include "fs/gpt.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "page_manager.h"
|
||||||
|
#include "pci.h"
|
||||||
|
|
||||||
|
|
||||||
|
IS_BITFIELD(ahci::hba_cap);
|
||||||
|
IS_BITFIELD(ahci::hba_cap2);
|
||||||
|
|
||||||
|
namespace ahci {
|
||||||
|
|
||||||
|
|
||||||
|
enum class hba_cap : uint32_t
|
||||||
|
{
|
||||||
|
ccc = 0x00000080, // Command completion coalescing
|
||||||
|
ahci_only = 0x00040000, // ACHI-only mode
|
||||||
|
clo = 0x01000000, // Command list override
|
||||||
|
snotify = 0x40000000, // SNotification register
|
||||||
|
ncq = 0x40000000, // Native command queuing
|
||||||
|
addr64 = 0x80000000 // 64bit addressing
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum class hba_cap2 : uint32_t
|
||||||
|
{
|
||||||
|
handoff = 0x00000001 // BIOS OS hand-off
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct hba_data
|
||||||
|
{
|
||||||
|
hba_cap cap;
|
||||||
|
uint32_t host_control;
|
||||||
|
uint32_t int_status;
|
||||||
|
uint32_t port_impl;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t ccc_control;
|
||||||
|
uint32_t ccc_ports;
|
||||||
|
uint32_t em_location;
|
||||||
|
uint32_t em_control;
|
||||||
|
hba_cap2 cap2;
|
||||||
|
uint32_t handoff_control;
|
||||||
|
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
|
||||||
|
void irq_cb(void *data)
|
||||||
|
{
|
||||||
|
hba *h = reinterpret_cast<hba *>(data);
|
||||||
|
h->handle_interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
hba::hba(pci_device *device)
|
||||||
|
{
|
||||||
|
page_manager *pm = page_manager::get();
|
||||||
|
device_manager &dm = device_manager::get();
|
||||||
|
|
||||||
|
uint32_t bar5 = device->get_bar(5);
|
||||||
|
log::debug(logs::driver, "HBA raw BAR5 is %08lx", bar5);
|
||||||
|
|
||||||
|
void *data = reinterpret_cast<void *>(bar5 & ~0xfffull);
|
||||||
|
pm->map_offset_pointer(&data, 0x2000);
|
||||||
|
m_data = reinterpret_cast<hba_data volatile *>(data);
|
||||||
|
|
||||||
|
if (! bitfield_has(m_data->cap, hba_cap::ahci_only))
|
||||||
|
m_data->host_control |= 0x80000000; // Enable AHCI mode
|
||||||
|
|
||||||
|
uint32_t icap = static_cast<uint32_t>(m_data->cap);
|
||||||
|
|
||||||
|
unsigned ports = (icap & 0xf) + 1;
|
||||||
|
unsigned slots = ((icap >> 8) & 0x1f) + 1;
|
||||||
|
|
||||||
|
log::debug(logs::driver, " %d ports: %08x", ports, m_data->port_impl);
|
||||||
|
log::debug(logs::driver, " %d command slots", slots);
|
||||||
|
|
||||||
|
auto *pd = reinterpret_cast<port_data volatile *>(
|
||||||
|
kutil::offset_pointer(m_data, 0x100));
|
||||||
|
|
||||||
|
bool needs_interrupt = false;
|
||||||
|
m_ports.ensure_capacity(ports);
|
||||||
|
for (unsigned i = 0; i < ports; ++i) {
|
||||||
|
bool impl = ((m_data->port_impl & (1 << i)) != 0);
|
||||||
|
port &p = m_ports.emplace(this, i, kutil::offset_pointer(pd, 0x80 * i), impl);
|
||||||
|
if (p.get_state() == port::state::active)
|
||||||
|
needs_interrupt = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needs_interrupt) {
|
||||||
|
device_manager::get().allocate_msi("AHCI Device", *device, irq_cb, this);
|
||||||
|
m_data->host_control |= 0x02; // enable interrupts
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &p : m_ports) {
|
||||||
|
if (!p.active()) continue;
|
||||||
|
|
||||||
|
if (p.get_type() == sata_signature::sata_drive) {
|
||||||
|
p.sata_reconnect();
|
||||||
|
/*
|
||||||
|
if (fs::partition::load(&p) == 0)
|
||||||
|
dm.register_block_device(&p);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hba::handle_interrupt()
|
||||||
|
{
|
||||||
|
uint32_t status = m_data->int_status;
|
||||||
|
for (auto &port : m_ports) {
|
||||||
|
if (status & (1 << port.index())) {
|
||||||
|
port.handle_interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Write 1 to the handled interrupts
|
||||||
|
m_data->int_status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hba::dump()
|
||||||
|
{
|
||||||
|
console *cons = console::get();
|
||||||
|
static const char *regs[] = {
|
||||||
|
" CAP", " GHC", " IS", " PI", " VS", " C3C",
|
||||||
|
" C3P", " EML", " EMC", "CAP2", "BOHC"
|
||||||
|
};
|
||||||
|
|
||||||
|
cons->printf("HBA Registers:\n");
|
||||||
|
auto *data = reinterpret_cast<uint32_t volatile *>(m_data);
|
||||||
|
for (int i = 0; i < 11; ++i) {
|
||||||
|
cons->printf(" %s: %08x\n", regs[i], data[i]);
|
||||||
|
}
|
||||||
|
cons->putc('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ahci
|
||||||
|
|
||||||
37
src/drivers/ahci/hba.h
Normal file
37
src/drivers/ahci/hba.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#pragma once
|
||||||
|
/// \file hba.h
|
||||||
|
/// Definition for AHCI host bus adapters
|
||||||
|
#include "kutil/vector.h"
|
||||||
|
#include "ahci/port.h"
|
||||||
|
|
||||||
|
class pci_device;
|
||||||
|
|
||||||
|
|
||||||
|
namespace ahci {
|
||||||
|
|
||||||
|
enum class hba_cap : uint32_t;
|
||||||
|
enum class hba_cap2 : uint32_t;
|
||||||
|
struct hba_data;
|
||||||
|
|
||||||
|
|
||||||
|
/// An AHCI host bus adapter
|
||||||
|
class hba
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Constructor.
|
||||||
|
/// \arg device The PCI device for this HBA
|
||||||
|
hba(pci_device *device);
|
||||||
|
|
||||||
|
/// Interrupt handler.
|
||||||
|
void handle_interrupt();
|
||||||
|
|
||||||
|
/// Dump the HBA registers to the console
|
||||||
|
void dump();
|
||||||
|
|
||||||
|
private:
|
||||||
|
pci_device *m_device;
|
||||||
|
hba_data volatile *m_data;
|
||||||
|
kutil::vector<port> m_ports;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ahci
|
||||||
623
src/drivers/ahci/port.cpp
Normal file
623
src/drivers/ahci/port.cpp
Normal file
@@ -0,0 +1,623 @@
|
|||||||
|
#include <algorithm>
|
||||||
|
#include "kutil/assert.h"
|
||||||
|
#include "kutil/enum_bitfields.h"
|
||||||
|
#include "ahci/ata.h"
|
||||||
|
#include "ahci/hba.h"
|
||||||
|
#include "ahci/fis.h"
|
||||||
|
#include "ahci/port.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "io.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "page_manager.h"
|
||||||
|
|
||||||
|
namespace ahci {
|
||||||
|
enum class cmd_list_flags : uint16_t;
|
||||||
|
}
|
||||||
|
|
||||||
|
IS_BITFIELD(ahci::port_cmd);
|
||||||
|
IS_BITFIELD(volatile ahci::port_cmd);
|
||||||
|
IS_BITFIELD(ahci::cmd_list_flags);
|
||||||
|
|
||||||
|
namespace ahci {
|
||||||
|
|
||||||
|
const unsigned max_prd_count = 16;
|
||||||
|
|
||||||
|
|
||||||
|
enum class cmd_list_flags : uint16_t
|
||||||
|
{
|
||||||
|
atapi = 0x0020,
|
||||||
|
write = 0x0040,
|
||||||
|
prefetch = 0x0080,
|
||||||
|
reset = 0x0100,
|
||||||
|
bist = 0x0200,
|
||||||
|
clear_busy = 0x0400
|
||||||
|
};
|
||||||
|
|
||||||
|
inline cmd_list_flags
|
||||||
|
cmd_list_fis_size(uint8_t size)
|
||||||
|
{
|
||||||
|
return static_cast<cmd_list_flags>((size/4) & 0x1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct cmd_list_entry
|
||||||
|
{
|
||||||
|
cmd_list_flags flags;
|
||||||
|
uint16_t prd_table_length;
|
||||||
|
uint32_t prd_byte_count;
|
||||||
|
uint32_t cmd_table_base_low;
|
||||||
|
uint32_t cmd_table_base_high;
|
||||||
|
uint32_t reserved[4];
|
||||||
|
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
|
||||||
|
struct prdt_entry
|
||||||
|
{
|
||||||
|
uint32_t data_base_low;
|
||||||
|
uint32_t data_base_high;
|
||||||
|
uint32_t reserved;
|
||||||
|
uint32_t byte_count;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
|
||||||
|
struct cmd_table
|
||||||
|
{
|
||||||
|
uint8_t cmd_fis[64];
|
||||||
|
uint8_t atapi_cmd[16];
|
||||||
|
uint8_t reserved[48];
|
||||||
|
prdt_entry entries[0];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
|
||||||
|
enum class port_cmd : uint32_t
|
||||||
|
{
|
||||||
|
start = 0x00000001,
|
||||||
|
spinup = 0x00000002,
|
||||||
|
poweron = 0x00000004,
|
||||||
|
clo = 0x00000008,
|
||||||
|
fis_recv = 0x00000010,
|
||||||
|
fisr_running = 0x00004000,
|
||||||
|
cmds_running = 0x00008000,
|
||||||
|
|
||||||
|
none = 0x00000000
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct port_data
|
||||||
|
{
|
||||||
|
uint32_t cmd_base_low;
|
||||||
|
uint32_t cmd_base_high;
|
||||||
|
uint32_t fis_base_low;
|
||||||
|
uint32_t fis_base_high;
|
||||||
|
|
||||||
|
uint32_t interrupt_status;
|
||||||
|
uint32_t interrupt_enable;
|
||||||
|
|
||||||
|
port_cmd command;
|
||||||
|
|
||||||
|
uint32_t reserved0;
|
||||||
|
|
||||||
|
uint8_t task_file_status;
|
||||||
|
uint8_t task_file_error;
|
||||||
|
uint16_t reserved1;
|
||||||
|
|
||||||
|
sata_signature signature;
|
||||||
|
|
||||||
|
uint32_t serial_status;
|
||||||
|
uint32_t serial_control;
|
||||||
|
uint32_t serial_error;
|
||||||
|
uint32_t serial_active;
|
||||||
|
uint32_t cmd_issue;
|
||||||
|
uint32_t serial_notify;
|
||||||
|
uint32_t fis_switching;
|
||||||
|
uint32_t dev_sleep;
|
||||||
|
|
||||||
|
uint8_t reserved2[40];
|
||||||
|
uint8_t vendor[16];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
|
||||||
|
port::port(hba *device, uint8_t index, port_data volatile *data, bool impl) :
|
||||||
|
m_index(index),
|
||||||
|
m_type(sata_signature::none),
|
||||||
|
m_state(state::unimpl),
|
||||||
|
m_hba(device),
|
||||||
|
m_data(data),
|
||||||
|
m_fis(nullptr),
|
||||||
|
m_cmd_list(nullptr),
|
||||||
|
m_cmd_table(nullptr)
|
||||||
|
{
|
||||||
|
if (impl) {
|
||||||
|
m_state = state::inactive;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
port::~port()
|
||||||
|
{
|
||||||
|
if (m_cmd_list) {
|
||||||
|
page_manager *pm = page_manager::get();
|
||||||
|
pm->unmap_pages(m_cmd_list, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::update()
|
||||||
|
{
|
||||||
|
if (m_state == state::unimpl) return;
|
||||||
|
|
||||||
|
uint32_t detected = m_data->serial_status & 0x0f;
|
||||||
|
uint32_t power = (m_data->serial_status >> 8) & 0x0f;
|
||||||
|
|
||||||
|
if (detected == 0x3 && power == 0x1) {
|
||||||
|
m_state = state::active;
|
||||||
|
m_type = m_data->signature;
|
||||||
|
|
||||||
|
const char *name =
|
||||||
|
m_type == sata_signature::sata_drive ? "SATA" :
|
||||||
|
m_type == sata_signature::satapi_drive ? "SATAPI" :
|
||||||
|
"Other";
|
||||||
|
|
||||||
|
log::info(logs::driver, "Found device type %s at port %d", name, m_index);
|
||||||
|
|
||||||
|
rebase();
|
||||||
|
m_pending.set_size(32);
|
||||||
|
for (auto &pend : m_pending) {
|
||||||
|
pend.type = command_type::none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any old pending interrupts and enable interrupts
|
||||||
|
m_data->interrupt_status = m_data->interrupt_status;
|
||||||
|
m_data->interrupt_enable = 0xffffffff;
|
||||||
|
} else {
|
||||||
|
m_state = state::inactive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
port::busy()
|
||||||
|
{
|
||||||
|
return (m_data->task_file_status & 0x88) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::start_commands()
|
||||||
|
{
|
||||||
|
while (bitfield_has(m_data->command, port_cmd::cmds_running))
|
||||||
|
io_wait();
|
||||||
|
|
||||||
|
m_data->command |= port_cmd::fis_recv;
|
||||||
|
m_data->command |= port_cmd::start;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::stop_commands()
|
||||||
|
{
|
||||||
|
m_data->command &= ~port_cmd::start;
|
||||||
|
|
||||||
|
while (
|
||||||
|
bitfield_has(m_data->command, port_cmd::cmds_running) ||
|
||||||
|
bitfield_has(m_data->command, port_cmd::fisr_running))
|
||||||
|
io_wait();
|
||||||
|
|
||||||
|
m_data->command &= ~port_cmd::fis_recv;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
port::make_command(size_t length, fis_register_h2d **fis)
|
||||||
|
{
|
||||||
|
int slot = -1;
|
||||||
|
uint32_t used_slots =
|
||||||
|
m_data->serial_active |
|
||||||
|
m_data->cmd_issue |
|
||||||
|
m_data->interrupt_status;
|
||||||
|
|
||||||
|
for (int i = 0; i < 32; ++i) {
|
||||||
|
if (used_slots & (1 << i)) continue;
|
||||||
|
|
||||||
|
if (m_pending[i].type == command_type::none) {
|
||||||
|
slot = i;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
log::debug(logs::driver, "Type is %d", m_pending[i].type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slot < 0) {
|
||||||
|
log::error(logs::driver, "AHCI could not get a free command slot.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
page_manager *pm = page_manager::get();
|
||||||
|
|
||||||
|
cmd_list_entry &ent = m_cmd_list[slot];
|
||||||
|
cmd_table &cmdt = m_cmd_table[slot];
|
||||||
|
|
||||||
|
kutil::memset(&cmdt, 0, sizeof(cmd_table) +
|
||||||
|
max_prd_count * sizeof(prdt_entry));
|
||||||
|
|
||||||
|
ent.flags = cmd_list_fis_size(sizeof(fis_register_h2d));
|
||||||
|
|
||||||
|
fis_register_h2d *cfis = reinterpret_cast<fis_register_h2d *>(&cmdt.cmd_fis);
|
||||||
|
kutil::memset(cfis, 0, sizeof(fis_register_h2d));
|
||||||
|
cfis->type = fis_type::register_h2d;
|
||||||
|
cfis->pm_port = 0x80; // set command register flag
|
||||||
|
*fis = cfis;
|
||||||
|
|
||||||
|
size_t remaining = length;
|
||||||
|
for (int i = 0; i < max_prd_count; ++i) {
|
||||||
|
size_t prd_len = std::min(remaining, 0x200000ul);
|
||||||
|
remaining -= prd_len;
|
||||||
|
|
||||||
|
void *mem = pm->map_offset_pages(page_count(prd_len));
|
||||||
|
kutil::memset(mem, 0xaf, prd_len);
|
||||||
|
|
||||||
|
uintptr_t phys = pm->offset_phys(mem);
|
||||||
|
cmdt.entries[i].data_base_low = phys & 0xffffffff;
|
||||||
|
cmdt.entries[i].data_base_high = phys >> 32;
|
||||||
|
cmdt.entries[i].byte_count = prd_len - 1;
|
||||||
|
if (remaining == 0 || i == max_prd_count - 1) {
|
||||||
|
// If this is the last one, set the interrupt flag
|
||||||
|
cmdt.entries[i].byte_count |= 0x80000000;
|
||||||
|
ent.prd_table_length = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
log::debug(logs::driver, "Created command, slot %d, %d PRD entries.",
|
||||||
|
slot, ent.prd_table_length);
|
||||||
|
return slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
port::read_async(uint64_t offset, size_t length, void *dest)
|
||||||
|
{
|
||||||
|
fis_register_h2d *fis;
|
||||||
|
int slot = make_command(length, &fis);
|
||||||
|
if (slot < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cmd_table &cmdt = m_cmd_table[slot];
|
||||||
|
|
||||||
|
fis->command = ata_cmd::read_dma_ext;
|
||||||
|
fis->device = 0x40; // ATA8-ACS p.175
|
||||||
|
|
||||||
|
uint64_t sector = offset >> 9;
|
||||||
|
fis->lba0 = (sector ) & 0xff;
|
||||||
|
fis->lba1 = (sector >> 8) & 0xff;
|
||||||
|
fis->lba2 = (sector >> 16) & 0xff;
|
||||||
|
fis->lba3 = (sector >> 24) & 0xff;
|
||||||
|
fis->lba4 = (sector >> 32) & 0xff;
|
||||||
|
fis->lba5 = (sector >> 40) & 0xff;
|
||||||
|
|
||||||
|
size_t count = ((length - 1) >> 9) + 1; // count is in sectors
|
||||||
|
fis->count0 = (count ) & 0xff;
|
||||||
|
fis->count1 = (count >> 8) & 0xff;
|
||||||
|
|
||||||
|
log::debug(logs::driver, "Reading %d sectors, starting from %d (0x%lx)",
|
||||||
|
count, sector, sector*512);
|
||||||
|
|
||||||
|
m_pending[slot].type = command_type::read;
|
||||||
|
m_pending[slot].offset = offset % 512;
|
||||||
|
m_pending[slot].count = 0;
|
||||||
|
m_pending[slot].data = dest;
|
||||||
|
if(issue_command(slot))
|
||||||
|
return slot;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
port::read(uint64_t offset, size_t length, void *dest)
|
||||||
|
{
|
||||||
|
int slot = read_async(offset, length, dest);
|
||||||
|
|
||||||
|
int timeout = 0;
|
||||||
|
while (m_pending[slot].type == command_type::read) {
|
||||||
|
if (timeout++ > 5) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
asm("hlt");
|
||||||
|
}
|
||||||
|
kassert(m_pending[slot].type == command_type::finished,
|
||||||
|
"Read got unexpected command type");
|
||||||
|
|
||||||
|
size_t count = m_pending[slot].count;
|
||||||
|
m_pending[slot].type = command_type::none;
|
||||||
|
m_pending[slot].count = 0;
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
port::identify_async()
|
||||||
|
{
|
||||||
|
fis_register_h2d *fis;
|
||||||
|
int slot = make_command(512, &fis);
|
||||||
|
if (slot < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fis->command = ata_cmd::identify;
|
||||||
|
|
||||||
|
m_pending[slot].type = command_type::identify;
|
||||||
|
m_pending[slot].offset = 0;
|
||||||
|
m_pending[slot].count = 0;
|
||||||
|
m_pending[slot].data = 0;
|
||||||
|
|
||||||
|
if(issue_command(slot))
|
||||||
|
return slot;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::sata_reconnect()
|
||||||
|
{
|
||||||
|
m_data->serial_control |= 1;
|
||||||
|
io_wait(1000); // About 1ms
|
||||||
|
m_data->serial_control &= ~1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
port::issue_command(int slot)
|
||||||
|
{
|
||||||
|
const int max_tries = 10;
|
||||||
|
int tries = 0;
|
||||||
|
while (busy()) {
|
||||||
|
if (++tries == max_tries) {
|
||||||
|
log::warn(logs::driver, "AHCI port was busy too long");
|
||||||
|
free_command(slot);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
io_wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set bit in CI. Note that only new bits should be written, not
|
||||||
|
// previous state.
|
||||||
|
m_data->cmd_issue = (1 << slot);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::handle_interrupt()
|
||||||
|
{
|
||||||
|
log::debug(logs::driver, "AHCI port %d got an interrupt", m_index);
|
||||||
|
|
||||||
|
// TODO: handle other states in interrupt_status
|
||||||
|
|
||||||
|
uint32_t is = m_data->interrupt_status;
|
||||||
|
|
||||||
|
if (is & 0x00000040) {
|
||||||
|
// Port connect status change: For now clear the "exchange"
|
||||||
|
// bit in SERR, this should probably kick off diagnostics.
|
||||||
|
m_data->serial_error = 0x04000000;
|
||||||
|
identify_async();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is & 0x40000000) {
|
||||||
|
log::error(logs::driver, "AHCI task file error");
|
||||||
|
dump();
|
||||||
|
kassert(0, "Task file error");
|
||||||
|
}
|
||||||
|
|
||||||
|
log::debug(logs::driver, "AHCI interrupt status: %08lx %08lx",
|
||||||
|
m_data->interrupt_status, m_data->serial_error);
|
||||||
|
|
||||||
|
uint32_t ci = m_data->cmd_issue;
|
||||||
|
for (int i = 0; i < 32; ++i) {
|
||||||
|
// Skip commands still listed as "issued"
|
||||||
|
if (ci & (1 << i)) continue;
|
||||||
|
|
||||||
|
// Any commands not still listed as "issued" that are still pending for
|
||||||
|
// the driver are now finished, so handle them.
|
||||||
|
pending &p = m_pending[i];
|
||||||
|
switch (p.type) {
|
||||||
|
case command_type::read:
|
||||||
|
finish_read(i);
|
||||||
|
break;
|
||||||
|
case command_type::identify:
|
||||||
|
finish_identify(i);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear the whole status register to mark it as handled
|
||||||
|
m_data->interrupt_status = m_data->interrupt_status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::finish_read(int slot)
|
||||||
|
{
|
||||||
|
page_manager *pm = page_manager::get();
|
||||||
|
cmd_table &cmdt = m_cmd_table[slot];
|
||||||
|
cmd_list_entry &ent = m_cmd_list[slot];
|
||||||
|
|
||||||
|
size_t count = 0;
|
||||||
|
void *p = m_pending[slot].data;
|
||||||
|
uint8_t offset = m_pending[slot].offset;
|
||||||
|
for (int i = 0; i < ent.prd_table_length; ++i) {
|
||||||
|
size_t prd_len = (cmdt.entries[i].byte_count & 0x7fffffff) + 1;
|
||||||
|
|
||||||
|
uintptr_t phys =
|
||||||
|
static_cast<uintptr_t>(cmdt.entries[i].data_base_low) |
|
||||||
|
static_cast<uintptr_t>(cmdt.entries[i].data_base_high) << 32;
|
||||||
|
|
||||||
|
void *mem = kutil::offset_pointer(pm->offset_virt(phys), offset);
|
||||||
|
|
||||||
|
log::debug(logs::driver, "Reading PRD %2d: %016lx->%016lx [%lxb]", i, mem, p, prd_len);
|
||||||
|
|
||||||
|
kutil::memcpy(p, mem, prd_len);
|
||||||
|
p = kutil::offset_pointer(p, prd_len - offset);
|
||||||
|
count += (prd_len - offset);
|
||||||
|
offset = 0;
|
||||||
|
|
||||||
|
pm->unmap_pages(mem, page_count(prd_len));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pending[slot].count = count;
|
||||||
|
m_pending[slot].type = command_type::finished;
|
||||||
|
m_pending[slot].data = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ident_strcpy(uint16_t *from, int words, char *dest)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < words; ++i) {
|
||||||
|
*dest++ = *from >> 8;
|
||||||
|
*dest++ = *from & 0xff;
|
||||||
|
from++;
|
||||||
|
}
|
||||||
|
*dest = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::finish_identify(int slot)
|
||||||
|
{
|
||||||
|
page_manager *pm = page_manager::get();
|
||||||
|
cmd_table &cmdt = m_cmd_table[slot];
|
||||||
|
cmd_list_entry &ent = m_cmd_list[slot];
|
||||||
|
|
||||||
|
kassert(ent.prd_table_length == 1, "AHCI identify used multiple PRDs");
|
||||||
|
|
||||||
|
size_t prd_len = (cmdt.entries[0].byte_count & 0x7fffffff) + 1;
|
||||||
|
|
||||||
|
uintptr_t phys =
|
||||||
|
static_cast<uintptr_t>(cmdt.entries[0].data_base_low) |
|
||||||
|
static_cast<uintptr_t>(cmdt.entries[0].data_base_high) << 32;
|
||||||
|
|
||||||
|
log::debug(logs::driver, "Reading ident PRD:");
|
||||||
|
|
||||||
|
uint16_t *mem = reinterpret_cast<uint16_t *>(pm->offset_virt(phys));
|
||||||
|
char string[41];
|
||||||
|
|
||||||
|
ident_strcpy(&mem[10], 10, &string[0]);
|
||||||
|
log::debug(logs::driver, " Device serial: %s", string);
|
||||||
|
|
||||||
|
ident_strcpy(&mem[23], 4, &string[0]);
|
||||||
|
log::debug(logs::driver, " Device version: %s", string);
|
||||||
|
|
||||||
|
ident_strcpy(&mem[27], 20, &string[0]);
|
||||||
|
log::debug(logs::driver, " Device model: %s", string);
|
||||||
|
|
||||||
|
uint32_t sectors = mem[60] | (mem[61] << 16);
|
||||||
|
log::debug(logs::driver, " Max sectors: %xh", sectors);
|
||||||
|
|
||||||
|
uint16_t lb_size = mem[106];
|
||||||
|
log::debug(logs::driver, " lsects per psect: %d %s %s", 1 << (lb_size & 0xf),
|
||||||
|
lb_size & 0x20 ? "multiple logical per physical" : "",
|
||||||
|
lb_size & 0x10 ? "physical > 512b" : "");
|
||||||
|
|
||||||
|
uint32_t b_per_ls = 2 * (mem[117] | (mem[118] << 16));
|
||||||
|
log::debug(logs::driver, " b per lsect: %d", b_per_ls);
|
||||||
|
|
||||||
|
/*
|
||||||
|
for (int i=0; i<256; i += 4)
|
||||||
|
log::debug(logs::driver, " %3d: %04x %3d: %04x %3d: %04x %3d: %04x",
|
||||||
|
i, mem[i], i+1, mem[i+1], i+2, mem[i+2], i+3, mem[i+3]);
|
||||||
|
*/
|
||||||
|
|
||||||
|
pm->unmap_pages(mem, page_count(prd_len));
|
||||||
|
m_pending[slot].type = command_type::none;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::free_command(int slot)
|
||||||
|
{
|
||||||
|
page_manager *pm = page_manager::get();
|
||||||
|
|
||||||
|
cmd_table &cmdt = m_cmd_table[slot];
|
||||||
|
cmd_list_entry &ent = m_cmd_list[slot];
|
||||||
|
|
||||||
|
for (int i = 0; i < ent.prd_table_length; ++i) {
|
||||||
|
size_t prd_len = (cmdt.entries[i].byte_count & 0x7fffffff) + 1;
|
||||||
|
|
||||||
|
uintptr_t phys =
|
||||||
|
static_cast<uintptr_t>(cmdt.entries[i].data_base_low) |
|
||||||
|
static_cast<uintptr_t>(cmdt.entries[i].data_base_high) << 32;
|
||||||
|
void *mem = pm->offset_virt(phys);
|
||||||
|
pm->unmap_pages(mem, page_count(prd_len));
|
||||||
|
}
|
||||||
|
|
||||||
|
ent.prd_table_length = max_prd_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::rebase()
|
||||||
|
{
|
||||||
|
kassert(!m_cmd_list, "AHCI port called rebase() twice");
|
||||||
|
|
||||||
|
page_manager *pm = page_manager::get();
|
||||||
|
size_t prd_size = sizeof(cmd_table) + (max_prd_count * sizeof(prdt_entry));
|
||||||
|
|
||||||
|
// 1 for FIS + command list, N for PRD
|
||||||
|
size_t pages = 1 + page_count(prd_size * 32);
|
||||||
|
|
||||||
|
void *mem = pm->map_offset_pages(pages);
|
||||||
|
uintptr_t phys = pm->offset_phys(mem);
|
||||||
|
|
||||||
|
log::debug(logs::driver, "Rebasing address for AHCI port %d to %lx [%d]", m_index, mem, pages);
|
||||||
|
|
||||||
|
stop_commands();
|
||||||
|
|
||||||
|
// Command list
|
||||||
|
m_cmd_list = reinterpret_cast<cmd_list_entry *>(mem);
|
||||||
|
m_data->cmd_base_low = phys & 0xffffffff;
|
||||||
|
m_data->cmd_base_high = phys >> 32;
|
||||||
|
kutil::memset(mem, 0, 1024);
|
||||||
|
|
||||||
|
mem = kutil::offset_pointer(mem, 32 * sizeof(cmd_list_entry));
|
||||||
|
phys = pm->offset_phys(mem);
|
||||||
|
|
||||||
|
// FIS
|
||||||
|
m_fis = mem;
|
||||||
|
m_data->fis_base_low = phys & 0xffffffff;
|
||||||
|
m_data->fis_base_high = phys >> 32;
|
||||||
|
kutil::memset(mem, 0, 256);
|
||||||
|
|
||||||
|
mem = page_align(kutil::offset_pointer(mem, 256));
|
||||||
|
phys = pm->offset_phys(mem);
|
||||||
|
|
||||||
|
// Command table
|
||||||
|
m_cmd_table = reinterpret_cast<cmd_table *>(mem);
|
||||||
|
size_t cmdt_len = sizeof(cmd_table) +
|
||||||
|
max_prd_count * sizeof(prdt_entry);
|
||||||
|
|
||||||
|
kutil::memset(m_cmd_table, 0, cmdt_len * 32);
|
||||||
|
|
||||||
|
// set up each entry in the command list to point to the
|
||||||
|
// corresponding command table
|
||||||
|
for (int i = 0; i < 32; ++i) {
|
||||||
|
m_cmd_list[i].prd_table_length = max_prd_count;
|
||||||
|
m_cmd_list[i].cmd_table_base_low = phys & 0xffffffff;
|
||||||
|
m_cmd_list[i].cmd_table_base_high = phys >> 32;
|
||||||
|
|
||||||
|
mem = kutil::offset_pointer(mem, cmdt_len);
|
||||||
|
phys = pm->offset_phys(mem);
|
||||||
|
}
|
||||||
|
|
||||||
|
start_commands();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
port::dump()
|
||||||
|
{
|
||||||
|
console *cons = console::get();
|
||||||
|
static const char *regs[] = {
|
||||||
|
" CLB", "+CLB", " FB", " +FB", " IS", " IE",
|
||||||
|
" CMD", nullptr, " TFD", " SIG", "SSTS", "SCTL", "SERR",
|
||||||
|
"SACT", " CI", "SNTF", " FBS", "DEVS"
|
||||||
|
};
|
||||||
|
|
||||||
|
cons->printf("Port Registers:\n");
|
||||||
|
auto *data = reinterpret_cast<volatile uint32_t *>(m_data);
|
||||||
|
for (int i = 0; i < 18; ++i) {
|
||||||
|
if (regs[i]) cons->printf(" %s: %08x\n", regs[i], data[i]);
|
||||||
|
}
|
||||||
|
cons->putc('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ahci
|
||||||
148
src/drivers/ahci/port.h
Normal file
148
src/drivers/ahci/port.h
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
#pragma once
|
||||||
|
/// \file port.h
|
||||||
|
/// Definition for AHCI ports
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "kutil/vector.h"
|
||||||
|
#include "block_device.h"
|
||||||
|
|
||||||
|
namespace ahci {
|
||||||
|
|
||||||
|
struct cmd_list_entry;
|
||||||
|
struct cmd_table;
|
||||||
|
struct fis_register_h2d;
|
||||||
|
class hba;
|
||||||
|
enum class sata_signature : uint32_t;
|
||||||
|
enum class port_cmd : uint32_t;
|
||||||
|
struct port_data;
|
||||||
|
|
||||||
|
|
||||||
|
/// A port on an AHCI HBA
|
||||||
|
class port :
|
||||||
|
public block_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Constructor.
|
||||||
|
/// \arg device The HBA device this port belongs to
|
||||||
|
/// \arg index Index of the port on its HBA
|
||||||
|
/// \arg data Pointer to the device's registers for this port
|
||||||
|
/// \arg impl Whether this port is marked as implemented in the HBA
|
||||||
|
port(hba *device, uint8_t index, port_data volatile *data, bool impl);
|
||||||
|
|
||||||
|
/// Destructor
|
||||||
|
~port();
|
||||||
|
|
||||||
|
/// Get the index of this port on the HBA
|
||||||
|
/// \returns The port index
|
||||||
|
inline uint8_t index() const { return m_index; }
|
||||||
|
|
||||||
|
enum class state : uint8_t { unimpl, inactive, active };
|
||||||
|
|
||||||
|
/// Get the current state of this device
|
||||||
|
/// \returns An enum representing the state
|
||||||
|
inline state get_state() const { return m_state; }
|
||||||
|
|
||||||
|
/// Check if this device is active
|
||||||
|
/// \returns True if the device state is active
|
||||||
|
inline bool active() const { return m_state == state::active; }
|
||||||
|
|
||||||
|
/// Get the type signature of this device
|
||||||
|
/// \returns An enum representing the type of device
|
||||||
|
inline sata_signature get_type() const { return m_type; }
|
||||||
|
|
||||||
|
/// Update the state of this object from the register data
|
||||||
|
void update();
|
||||||
|
|
||||||
|
/// Return whether the port is currently busy
|
||||||
|
bool busy();
|
||||||
|
|
||||||
|
/// Start command processing from this port
|
||||||
|
void start_commands();
|
||||||
|
|
||||||
|
/// Stop command processing from this port
|
||||||
|
void stop_commands();
|
||||||
|
|
||||||
|
/// Start a read operation from the drive.
|
||||||
|
/// \arg offset Offset to start from
|
||||||
|
/// \arg length Number of bytes to read
|
||||||
|
/// \arg dest A buffer where the data will be placed
|
||||||
|
/// \returns A handle to the read operation, or -1 on error
|
||||||
|
int read_async(uint64_t offset, size_t length, void *dest);
|
||||||
|
|
||||||
|
/// Read from the drive, blocking until finished.
|
||||||
|
/// \arg offset Offset to start from
|
||||||
|
/// \arg length Number of bytes to read
|
||||||
|
/// \arg dest A buffer where the data will be placed
|
||||||
|
/// \returns The number of bytes read
|
||||||
|
virtual size_t read(uint64_t offset, size_t length, void *dest);
|
||||||
|
|
||||||
|
/// Start an identify operation for the drive.
|
||||||
|
/// \returns A handle to the read operation, or -1 on error
|
||||||
|
int identify_async();
|
||||||
|
|
||||||
|
/// Tell the HBA to reconnect to the SATA device. A successful
|
||||||
|
/// reconnect will kick off an identify command.
|
||||||
|
void sata_reconnect();
|
||||||
|
|
||||||
|
/// Handle an incoming interrupt
|
||||||
|
void handle_interrupt();
|
||||||
|
|
||||||
|
/// Dump the port registers to the console
|
||||||
|
void dump();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// Rebase the port command structures to a new location in system
|
||||||
|
/// memory, to be allocated from the page manager.
|
||||||
|
void rebase();
|
||||||
|
|
||||||
|
/// Initialize a command structure
|
||||||
|
/// \arg length The number of bytes of data needed in the PRDs
|
||||||
|
/// \arg fis [out] The FIS for this command
|
||||||
|
/// \returns The index of the command slot, or -1 if none available
|
||||||
|
int make_command(size_t length, fis_register_h2d **fis);
|
||||||
|
|
||||||
|
/// Send a constructed command to the hardware
|
||||||
|
/// \arg slot The index of the command slot used
|
||||||
|
/// \returns True if the command was successfully sent
|
||||||
|
bool issue_command(int slot);
|
||||||
|
|
||||||
|
/// Free the data structures allocated by command creation
|
||||||
|
/// \arg slot The index of the command slot used
|
||||||
|
void free_command(int slot);
|
||||||
|
|
||||||
|
/// Finish a read command started by `read()`. This will
|
||||||
|
/// free the structures allocated, so `free_command()` is
|
||||||
|
/// not necessary.
|
||||||
|
/// \arg slot The command slot that the read command used
|
||||||
|
void finish_read(int slot);
|
||||||
|
|
||||||
|
/// Finish an identify command started by `identify_async()`.
|
||||||
|
/// This will free the structures allocated, so `free_command()` is
|
||||||
|
/// not necessary.
|
||||||
|
/// \arg slot The command slot that the read command used
|
||||||
|
void finish_identify(int slot);
|
||||||
|
|
||||||
|
sata_signature m_type;
|
||||||
|
uint8_t m_index;
|
||||||
|
state m_state;
|
||||||
|
|
||||||
|
hba *m_hba;
|
||||||
|
port_data volatile *m_data;
|
||||||
|
void *m_fis;
|
||||||
|
cmd_list_entry *m_cmd_list;
|
||||||
|
cmd_table *m_cmd_table;
|
||||||
|
|
||||||
|
enum class command_type : uint8_t { none, read, write, identify, finished };
|
||||||
|
|
||||||
|
struct pending
|
||||||
|
{
|
||||||
|
command_type type;
|
||||||
|
uint8_t offset;
|
||||||
|
size_t count;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
kutil::vector<pending> m_pending;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ahci
|
||||||
38
src/drivers/nulldrv/main.cpp
Normal file
38
src/drivers/nulldrv/main.cpp
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "j6/types.h"
|
||||||
|
#include "j6/errors.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
j6_status_t getpid(uint64_t *);
|
||||||
|
j6_status_t fork(uint64_t *);
|
||||||
|
j6_status_t sleep(uint64_t til);
|
||||||
|
j6_status_t debug();
|
||||||
|
j6_status_t message(const char *msg);
|
||||||
|
|
||||||
|
int main(int, const char **);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
uint64_t pid = 0;
|
||||||
|
uint64_t child = 0;
|
||||||
|
|
||||||
|
j6_status_t result = fork(&child);
|
||||||
|
if (result != j6_status_ok)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
message("hello from nulldrv!");
|
||||||
|
|
||||||
|
result = getpid(&pid);
|
||||||
|
if (result != j6_status_ok)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
for (int i = 1; i < 5; ++i)
|
||||||
|
sleep(i*10);
|
||||||
|
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
81
src/drivers/nulldrv/main.s
Normal file
81
src/drivers/nulldrv/main.s
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
section .bss
|
||||||
|
mymessage:
|
||||||
|
resq 1024
|
||||||
|
|
||||||
|
extern main
|
||||||
|
extern exit
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global getpid
|
||||||
|
getpid:
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
|
||||||
|
; address of out var should already be in rdi
|
||||||
|
mov rax, 0x13 ; getpid syscall
|
||||||
|
syscall ; result is now already in rax, so just return
|
||||||
|
|
||||||
|
pop rbp
|
||||||
|
ret
|
||||||
|
|
||||||
|
global debug
|
||||||
|
debug:
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
|
||||||
|
mov rax, 0x00 ; debug syscall
|
||||||
|
syscall
|
||||||
|
|
||||||
|
pop rbp
|
||||||
|
ret
|
||||||
|
|
||||||
|
global sleep
|
||||||
|
sleep:
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
|
||||||
|
mov rax, 0x16 ; sleep syscall
|
||||||
|
syscall
|
||||||
|
|
||||||
|
pop rbp
|
||||||
|
ret
|
||||||
|
|
||||||
|
global fork
|
||||||
|
fork:
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
|
||||||
|
; address of out var should already be in rdi
|
||||||
|
mov rax, 0x12
|
||||||
|
syscall ; result left in rax
|
||||||
|
|
||||||
|
pop rbp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
global message
|
||||||
|
message:
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
|
||||||
|
; message should already be in rdi
|
||||||
|
mov rax, 0x14
|
||||||
|
syscall
|
||||||
|
|
||||||
|
pop rbp
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
xor rbp, rbp ; Sentinel rbp
|
||||||
|
push rbp
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
|
||||||
|
mov rdi, 0
|
||||||
|
mov rsi, 0
|
||||||
|
call main
|
||||||
|
|
||||||
|
mov rdi, rax
|
||||||
|
call exit
|
||||||
62
src/include/efi/efi.h
Normal file
62
src/include/efi/efi.h
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efi.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Public EFI header files
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
|
||||||
|
// Add a predefined macro to detect usage of the library
|
||||||
|
#ifndef _GNU_EFI
|
||||||
|
#define _GNU_EFI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// Build flags on input
|
||||||
|
// EFI32
|
||||||
|
// EFI_DEBUG - Enable debugging code
|
||||||
|
// EFI_NT_EMULATOR - Building for running under NT
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _EFI_INCLUDE_
|
||||||
|
#define _EFI_INCLUDE_
|
||||||
|
|
||||||
|
#define EFI_FIRMWARE_VENDOR L"INTEL"
|
||||||
|
#define EFI_FIRMWARE_MAJOR_REVISION 12
|
||||||
|
#define EFI_FIRMWARE_MINOR_REVISION 33
|
||||||
|
#define EFI_FIRMWARE_REVISION ((EFI_FIRMWARE_MAJOR_REVISION <<16) | (EFI_FIRMWARE_MINOR_REVISION))
|
||||||
|
|
||||||
|
#include <efi/efibind.h>
|
||||||
|
#include <efi/eficompiler.h>
|
||||||
|
#include <efi/efidef.h>
|
||||||
|
#include <efi/efidevp.h>
|
||||||
|
#include <efi/efipciio.h>
|
||||||
|
#include <efi/efiprot.h>
|
||||||
|
#include <efi/eficon.h>
|
||||||
|
#include <efi/efiser.h>
|
||||||
|
#include <efi/efi_nii.h>
|
||||||
|
#include <efi/efipxebc.h>
|
||||||
|
#include <efi/efinet.h>
|
||||||
|
#include <efi/efiapi.h>
|
||||||
|
#include <efi/efifs.h>
|
||||||
|
#include <efi/efierr.h>
|
||||||
|
#include <efi/efiui.h>
|
||||||
|
#include <efi/efiip.h>
|
||||||
|
#include <efi/efiudp.h>
|
||||||
|
#include <efi/efitcp.h>
|
||||||
|
#include <efi/efipoint.h>
|
||||||
|
#include <efi/efisetjmp.h>
|
||||||
|
|
||||||
|
#endif
|
||||||
78
src/include/efi/efi_nii.h
Normal file
78
src/include/efi/efi_nii.h
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#ifndef _EFI_NII_H
|
||||||
|
#define _EFI_NII_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2000 Intel Corporation
|
||||||
|
|
||||||
|
Module name:
|
||||||
|
efi_nii.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Revision history:
|
||||||
|
2000-Feb-18 M(f)J GUID updated.
|
||||||
|
Structure order changed for machine word alignment.
|
||||||
|
Added StringId[4] to structure.
|
||||||
|
|
||||||
|
2000-Feb-14 M(f)J Genesis.
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID \
|
||||||
|
{ 0xE18541CD, 0xF755, 0x4f73, {0x92, 0x8D, 0x64, 0x3C, 0x8A, 0x79, 0xB2, 0x29} }
|
||||||
|
|
||||||
|
#define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION 0x00010000
|
||||||
|
#define EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE_REVISION EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiNetworkInterfaceUndi = 1
|
||||||
|
} EFI_NETWORK_INTERFACE_TYPE;
|
||||||
|
|
||||||
|
typedef struct _EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL {
|
||||||
|
|
||||||
|
UINT64 Revision;
|
||||||
|
// Revision of the network interface identifier protocol interface.
|
||||||
|
|
||||||
|
UINT64 ID;
|
||||||
|
// Address of the first byte of the identifying structure for this
|
||||||
|
// network interface. This is set to zero if there is no structure.
|
||||||
|
//
|
||||||
|
// For PXE/UNDI this is the first byte of the !PXE structure.
|
||||||
|
|
||||||
|
UINT64 ImageAddr;
|
||||||
|
// Address of the UNrelocated driver/ROM image. This is set
|
||||||
|
// to zero if there is no driver/ROM image.
|
||||||
|
//
|
||||||
|
// For 16-bit UNDI, this is the first byte of the option ROM in
|
||||||
|
// upper memory.
|
||||||
|
//
|
||||||
|
// For 32/64-bit S/W UNDI, this is the first byte of the EFI ROM
|
||||||
|
// image.
|
||||||
|
//
|
||||||
|
// For H/W UNDI, this is set to zero.
|
||||||
|
|
||||||
|
UINT32 ImageSize;
|
||||||
|
// Size of the UNrelocated driver/ROM image of this network interface.
|
||||||
|
// This is set to zero if there is no driver/ROM image.
|
||||||
|
|
||||||
|
CHAR8 StringId[4];
|
||||||
|
// 4 char ASCII string to go in class identifier (option 60) in DHCP
|
||||||
|
// and Boot Server discover packets.
|
||||||
|
// For EfiNetworkInterfaceUndi this field is "UNDI".
|
||||||
|
// For EfiNetworkInterfaceSnp this field is "SNPN".
|
||||||
|
|
||||||
|
UINT8 Type;
|
||||||
|
UINT8 MajorVer;
|
||||||
|
UINT8 MinorVer;
|
||||||
|
// Information to be placed into the PXE DHCP and Discover packets.
|
||||||
|
// This is the network interface type and version number that will
|
||||||
|
// be placed into DHCP option 94 (client network interface identifier).
|
||||||
|
BOOLEAN Ipv6Supported;
|
||||||
|
UINT8 IfNum; // interface number to be used with pxeid structure
|
||||||
|
} EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL, EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE;
|
||||||
|
|
||||||
|
// Note: Because it conflicted with the EDK2 struct name, the
|
||||||
|
// 'EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL' GUID definition,
|
||||||
|
// from older versions of gnu-efi, is now obsoleted.
|
||||||
|
// Use 'EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID' instead.
|
||||||
|
|
||||||
|
#endif // _EFI_NII_H
|
||||||
1743
src/include/efi/efi_pxe.h
Normal file
1743
src/include/efi/efi_pxe.h
Normal file
File diff suppressed because it is too large
Load Diff
967
src/include/efi/efiapi.h
Normal file
967
src/include/efi/efiapi.h
Normal file
@@ -0,0 +1,967 @@
|
|||||||
|
#ifndef _EFI_API_H
|
||||||
|
#define _EFI_API_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efiapi.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Global EFI runtime & boot service interfaces
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Specification Revision
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_SPECIFICATION_MAJOR_REVISION 1
|
||||||
|
#define EFI_SPECIFICATION_MINOR_REVISION 02
|
||||||
|
|
||||||
|
//
|
||||||
|
// Declare forward referenced data structures
|
||||||
|
//
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_SYSTEM_TABLE);
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Memory
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_ALLOCATE_PAGES) (
|
||||||
|
IN EFI_ALLOCATE_TYPE Type,
|
||||||
|
IN EFI_MEMORY_TYPE MemoryType,
|
||||||
|
IN UINTN NoPages,
|
||||||
|
OUT EFI_PHYSICAL_ADDRESS *Memory
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_FREE_PAGES) (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
|
IN UINTN NoPages
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_GET_MEMORY_MAP) (
|
||||||
|
IN OUT UINTN *MemoryMapSize,
|
||||||
|
IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
|
||||||
|
OUT UINTN *MapKey,
|
||||||
|
OUT UINTN *DescriptorSize,
|
||||||
|
OUT UINT32 *DescriptorVersion
|
||||||
|
);
|
||||||
|
|
||||||
|
#define NextMemoryDescriptor(Ptr,Size) ((EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
|
||||||
|
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_ALLOCATE_POOL) (
|
||||||
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
|
IN UINTN Size,
|
||||||
|
OUT VOID **Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_FREE_POOL) (
|
||||||
|
IN VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP) (
|
||||||
|
IN UINTN MemoryMapSize,
|
||||||
|
IN UINTN DescriptorSize,
|
||||||
|
IN UINT32 DescriptorVersion,
|
||||||
|
IN EFI_MEMORY_DESCRIPTOR *VirtualMap
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#define EFI_OPTIONAL_PTR 0x00000001
|
||||||
|
#define EFI_INTERNAL_FNC 0x00000002 // Pointer to internal runtime fnc
|
||||||
|
#define EFI_INTERNAL_PTR 0x00000004 // Pointer to internal runtime data
|
||||||
|
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_CONVERT_POINTER) (
|
||||||
|
IN UINTN DebugDisposition,
|
||||||
|
IN OUT VOID **Address
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Events
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EVT_TIMER 0x80000000
|
||||||
|
#define EVT_RUNTIME 0x40000000
|
||||||
|
#define EVT_RUNTIME_CONTEXT 0x20000000
|
||||||
|
|
||||||
|
#define EVT_NOTIFY_WAIT 0x00000100
|
||||||
|
#define EVT_NOTIFY_SIGNAL 0x00000200
|
||||||
|
|
||||||
|
#define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201
|
||||||
|
#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202
|
||||||
|
|
||||||
|
#define EVT_EFI_SIGNAL_MASK 0x000000FF
|
||||||
|
#define EVT_EFI_SIGNAL_MAX 4
|
||||||
|
|
||||||
|
#define EFI_EVENT_TIMER EVT_TIMER
|
||||||
|
#define EFI_EVENT_RUNTIME EVT_RUNTIME
|
||||||
|
#define EFI_EVENT_RUNTIME_CONTEXT EVT_RUNTIME_CONTEXT
|
||||||
|
#define EFI_EVENT_NOTIFY_WAIT EVT_NOTIFY_WAIT
|
||||||
|
#define EFI_EVENT_NOTIFY_SIGNAL EVT_NOTIFY_SIGNAL
|
||||||
|
#define EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES EVT_SIGNAL_EXIT_BOOT_SERVICES
|
||||||
|
#define EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE
|
||||||
|
#define EFI_EVENT_EFI_SIGNAL_MASK EVT_EFI_SIGNAL_MASK
|
||||||
|
#define EFI_EVENT_EFI_SIGNAL_MAX EVT_EFI_SIGNAL_MAX
|
||||||
|
|
||||||
|
|
||||||
|
typedef
|
||||||
|
VOID
|
||||||
|
(EFIAPI *EFI_EVENT_NOTIFY) (
|
||||||
|
IN EFI_EVENT Event,
|
||||||
|
IN VOID *Context
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_CREATE_EVENT) (
|
||||||
|
IN UINT32 Type,
|
||||||
|
IN EFI_TPL NotifyTpl,
|
||||||
|
IN EFI_EVENT_NOTIFY NotifyFunction,
|
||||||
|
IN VOID *NotifyContext,
|
||||||
|
OUT EFI_EVENT *Event
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TimerCancel,
|
||||||
|
TimerPeriodic,
|
||||||
|
TimerRelative,
|
||||||
|
TimerTypeMax
|
||||||
|
} EFI_TIMER_DELAY;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SET_TIMER) (
|
||||||
|
IN EFI_EVENT Event,
|
||||||
|
IN EFI_TIMER_DELAY Type,
|
||||||
|
IN UINT64 TriggerTime
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIGNAL_EVENT) (
|
||||||
|
IN EFI_EVENT Event
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_WAIT_FOR_EVENT) (
|
||||||
|
IN UINTN NumberOfEvents,
|
||||||
|
IN EFI_EVENT *Event,
|
||||||
|
OUT UINTN *Index
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_CLOSE_EVENT) (
|
||||||
|
IN EFI_EVENT Event
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_CHECK_EVENT) (
|
||||||
|
IN EFI_EVENT Event
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Task priority level
|
||||||
|
//
|
||||||
|
|
||||||
|
#define TPL_APPLICATION 4
|
||||||
|
#define TPL_CALLBACK 8
|
||||||
|
#define TPL_NOTIFY 16
|
||||||
|
#define TPL_HIGH_LEVEL 31
|
||||||
|
#define EFI_TPL_APPLICATION TPL_APPLICATION
|
||||||
|
#define EFI_TPL_CALLBACK TPL_CALLBACK
|
||||||
|
#define EFI_TPL_NOTIFY TPL_NOTIFY
|
||||||
|
#define EFI_TPL_HIGH_LEVEL TPL_HIGH_LEVEL
|
||||||
|
typedef
|
||||||
|
EFI_TPL
|
||||||
|
(EFIAPI *EFI_RAISE_TPL) (
|
||||||
|
IN EFI_TPL NewTpl
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
VOID
|
||||||
|
(EFIAPI *EFI_RESTORE_TPL) (
|
||||||
|
IN EFI_TPL OldTpl
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI platform varibles
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_GLOBAL_VARIABLE \
|
||||||
|
{ 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} }
|
||||||
|
|
||||||
|
// Variable attributes
|
||||||
|
#define EFI_VARIABLE_NON_VOLATILE 0x00000001
|
||||||
|
#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002
|
||||||
|
#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004
|
||||||
|
#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x00000008
|
||||||
|
#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010
|
||||||
|
#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020
|
||||||
|
#define EFI_VARIABLE_APPEND_WRITE 0x00000040
|
||||||
|
|
||||||
|
// Variable size limitation
|
||||||
|
#define EFI_MAXIMUM_VARIABLE_SIZE 1024
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_GET_VARIABLE) (
|
||||||
|
IN CHAR16 *VariableName,
|
||||||
|
IN EFI_GUID *VendorGuid,
|
||||||
|
OUT UINT32 *Attributes OPTIONAL,
|
||||||
|
IN OUT UINTN *DataSize,
|
||||||
|
OUT VOID *Data
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_GET_NEXT_VARIABLE_NAME) (
|
||||||
|
IN OUT UINTN *VariableNameSize,
|
||||||
|
IN OUT CHAR16 *VariableName,
|
||||||
|
IN OUT EFI_GUID *VendorGuid
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SET_VARIABLE) (
|
||||||
|
IN CHAR16 *VariableName,
|
||||||
|
IN EFI_GUID *VendorGuid,
|
||||||
|
IN UINT32 Attributes,
|
||||||
|
IN UINTN DataSize,
|
||||||
|
IN VOID *Data
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Time
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 Resolution; // 1e-6 parts per million
|
||||||
|
UINT32 Accuracy; // hertz
|
||||||
|
BOOLEAN SetsToZero; // Set clears sub-second time
|
||||||
|
} EFI_TIME_CAPABILITIES;
|
||||||
|
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_GET_TIME) (
|
||||||
|
OUT EFI_TIME *Time,
|
||||||
|
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SET_TIME) (
|
||||||
|
IN EFI_TIME *Time
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_GET_WAKEUP_TIME) (
|
||||||
|
OUT BOOLEAN *Enabled,
|
||||||
|
OUT BOOLEAN *Pending,
|
||||||
|
OUT EFI_TIME *Time
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SET_WAKEUP_TIME) (
|
||||||
|
IN BOOLEAN Enable,
|
||||||
|
IN EFI_TIME *Time OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Image functions
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
// PE32+ Subsystem type for EFI images
|
||||||
|
|
||||||
|
#if !defined(IMAGE_SUBSYSTEM_EFI_APPLICATION)
|
||||||
|
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
|
||||||
|
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
|
||||||
|
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// PE32+ Machine type for EFI images
|
||||||
|
|
||||||
|
#if !defined(EFI_IMAGE_MACHINE_IA32)
|
||||||
|
#define EFI_IMAGE_MACHINE_IA32 0x014c
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(EFI_IMAGE_MACHINE_IA64)
|
||||||
|
#define EFI_IMAGE_MACHINE_IA64 0x0200
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(EFI_IMAGE_MACHINE_EBC)
|
||||||
|
#define EFI_IMAGE_MACHINE_EBC 0x0EBC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(EFI_IMAGE_MACHINE_X64)
|
||||||
|
#define EFI_IMAGE_MACHINE_X64 0x8664
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(EFI_IMAGE_MACHINE_ARMTHUMB_MIXED)
|
||||||
|
#define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED 0x01C2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(EFI_IMAGE_MACHINE_AARCH64)
|
||||||
|
#define EFI_IMAGE_MACHINE_AARCH64 0xAA64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Image Entry prototype
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IMAGE_ENTRY_POINT) (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN struct _EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IMAGE_LOAD) (
|
||||||
|
IN BOOLEAN BootPolicy,
|
||||||
|
IN EFI_HANDLE ParentImageHandle,
|
||||||
|
IN EFI_DEVICE_PATH *FilePath,
|
||||||
|
IN VOID *SourceBuffer OPTIONAL,
|
||||||
|
IN UINTN SourceSize,
|
||||||
|
OUT EFI_HANDLE *ImageHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IMAGE_START) (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
OUT UINTN *ExitDataSize,
|
||||||
|
OUT CHAR16 **ExitData OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_EXIT) (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_STATUS ExitStatus,
|
||||||
|
IN UINTN ExitDataSize,
|
||||||
|
IN CHAR16 *ExitData OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Image handle
|
||||||
|
/*#define LOADED_IMAGE_PROTOCOL \
|
||||||
|
{ 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
|
||||||
|
|
||||||
|
#define EFI_IMAGE_INFORMATION_REVISION 0x1000
|
||||||
|
typedef struct {
|
||||||
|
UINT32 Revision;
|
||||||
|
EFI_HANDLE ParentHandle;
|
||||||
|
struct _EFI_SYSTEM_TABLE *SystemTable;
|
||||||
|
|
||||||
|
// Source location of image
|
||||||
|
EFI_HANDLE DeviceHandle;
|
||||||
|
EFI_DEVICE_PATH *FilePath;
|
||||||
|
VOID *Reserved;
|
||||||
|
|
||||||
|
// Images load options
|
||||||
|
UINT32 LoadOptionsSize;
|
||||||
|
VOID *LoadOptions;
|
||||||
|
|
||||||
|
// Location of where image was loaded
|
||||||
|
VOID *ImageBase;
|
||||||
|
UINT64 ImageSize;
|
||||||
|
EFI_MEMORY_TYPE ImageCodeType;
|
||||||
|
EFI_MEMORY_TYPE ImageDataType;
|
||||||
|
|
||||||
|
// If the driver image supports a dynamic unload request
|
||||||
|
EFI_IMAGE_UNLOAD Unload;
|
||||||
|
|
||||||
|
} EFI_LOADED_IMAGE;*/
|
||||||
|
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_EXIT_BOOT_SERVICES) (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN UINTN MapKey
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Misc
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_STALL) (
|
||||||
|
IN UINTN Microseconds
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SET_WATCHDOG_TIMER) (
|
||||||
|
IN UINTN Timeout,
|
||||||
|
IN UINT64 WatchdogCode,
|
||||||
|
IN UINTN DataSize,
|
||||||
|
IN CHAR16 *WatchdogData OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_CONNECT_CONTROLLER) (
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_HANDLE *DriverImageHandle OPTIONAL,
|
||||||
|
IN EFI_DEVICE_PATH *RemainingDevicePath OPTIONAL,
|
||||||
|
IN BOOLEAN Recursive
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_DISCONNECT_CONTROLLER) (
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_HANDLE DriverImageHandle OPTIONAL,
|
||||||
|
IN EFI_HANDLE ChildHandle OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001
|
||||||
|
#define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002
|
||||||
|
#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004
|
||||||
|
#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
|
||||||
|
#define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
|
||||||
|
#define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_OPEN_PROTOCOL) (
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
OUT VOID **Interface OPTIONAL,
|
||||||
|
IN EFI_HANDLE AgentHandle,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN UINT32 Attributes
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_CLOSE_PROTOCOL) (
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
IN EFI_HANDLE AgentHandle,
|
||||||
|
IN EFI_HANDLE ControllerHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_HANDLE AgentHandle;
|
||||||
|
EFI_HANDLE ControllerHandle;
|
||||||
|
UINT32 Attributes;
|
||||||
|
UINT32 OpenCount;
|
||||||
|
} EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_OPEN_PROTOCOL_INFORMATION) (
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
OUT EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
|
||||||
|
OUT UINTN *EntryCount
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PROTOCOLS_PER_HANDLE) (
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
OUT EFI_GUID ***ProtocolBuffer,
|
||||||
|
OUT UINTN *ProtocolBufferCount
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AllHandles,
|
||||||
|
ByRegisterNotify,
|
||||||
|
ByProtocol
|
||||||
|
} EFI_LOCATE_SEARCH_TYPE;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_LOCATE_HANDLE_BUFFER) (
|
||||||
|
IN EFI_LOCATE_SEARCH_TYPE SearchType,
|
||||||
|
IN EFI_GUID *Protocol OPTIONAL,
|
||||||
|
IN VOID *SearchKey OPTIONAL,
|
||||||
|
IN OUT UINTN *NoHandles,
|
||||||
|
OUT EFI_HANDLE **Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_LOCATE_PROTOCOL) (
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
IN VOID *Registration OPTIONAL,
|
||||||
|
OUT VOID **Interface
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
|
||||||
|
IN OUT EFI_HANDLE *Handle,
|
||||||
|
...
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
|
||||||
|
IN OUT EFI_HANDLE Handle,
|
||||||
|
...
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_CALCULATE_CRC32) (
|
||||||
|
IN VOID *Data,
|
||||||
|
IN UINTN DataSize,
|
||||||
|
OUT UINT32 *Crc32
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
VOID
|
||||||
|
(EFIAPI *EFI_COPY_MEM) (
|
||||||
|
IN VOID *Destination,
|
||||||
|
IN VOID *Source,
|
||||||
|
IN UINTN Length
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
VOID
|
||||||
|
(EFIAPI *EFI_SET_MEM) (
|
||||||
|
IN VOID *Buffer,
|
||||||
|
IN UINTN Size,
|
||||||
|
IN UINT8 Value
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_CREATE_EVENT_EX) (
|
||||||
|
IN UINT32 Type,
|
||||||
|
IN EFI_TPL NotifyTpl,
|
||||||
|
IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL,
|
||||||
|
IN const VOID *NotifyContext OPTIONAL,
|
||||||
|
IN const EFI_GUID EventGroup OPTIONAL,
|
||||||
|
OUT EFI_EVENT *Event
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiResetCold,
|
||||||
|
EfiResetWarm,
|
||||||
|
EfiResetShutdown
|
||||||
|
} EFI_RESET_TYPE;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_RESET_SYSTEM) (
|
||||||
|
IN EFI_RESET_TYPE ResetType,
|
||||||
|
IN EFI_STATUS ResetStatus,
|
||||||
|
IN UINTN DataSize,
|
||||||
|
IN CHAR16 *ResetData OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) (
|
||||||
|
OUT UINT64 *Count
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) (
|
||||||
|
OUT UINT32 *HighCount
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 Length;
|
||||||
|
union {
|
||||||
|
EFI_PHYSICAL_ADDRESS DataBlock;
|
||||||
|
EFI_PHYSICAL_ADDRESS ContinuationPointer;
|
||||||
|
} Union;
|
||||||
|
} EFI_CAPSULE_BLOCK_DESCRIPTOR;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_GUID CapsuleGuid;
|
||||||
|
UINT32 HeaderSize;
|
||||||
|
UINT32 Flags;
|
||||||
|
UINT32 CapsuleImageSize;
|
||||||
|
} EFI_CAPSULE_HEADER;
|
||||||
|
|
||||||
|
#define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000
|
||||||
|
#define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000
|
||||||
|
#define CAPSULE_FLAGS_INITIATE_RESET 0x00040000
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_UPDATE_CAPSULE) (
|
||||||
|
IN EFI_CAPSULE_HEADER **CapsuleHeaderArray,
|
||||||
|
IN UINTN CapsuleCount,
|
||||||
|
IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_QUERY_CAPSULE_CAPABILITIES) (
|
||||||
|
IN EFI_CAPSULE_HEADER **CapsuleHeaderArray,
|
||||||
|
IN UINTN CapsuleCount,
|
||||||
|
OUT UINT64 *MaximumCapsuleSize,
|
||||||
|
OUT EFI_RESET_TYPE *ResetType
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_QUERY_VARIABLE_INFO) (
|
||||||
|
IN UINT32 Attributes,
|
||||||
|
OUT UINT64 *MaximumVariableStorageSize,
|
||||||
|
OUT UINT64 *RemainingVariableStorageSize,
|
||||||
|
OUT UINT64 *MaximumVariableSize
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Protocol handler functions
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EFI_NATIVE_INTERFACE,
|
||||||
|
EFI_PCODE_INTERFACE
|
||||||
|
} EFI_INTERFACE_TYPE;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) (
|
||||||
|
IN OUT EFI_HANDLE *Handle,
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
IN EFI_INTERFACE_TYPE InterfaceType,
|
||||||
|
IN VOID *Interface
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) (
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
IN VOID *OldInterface,
|
||||||
|
IN VOID *NewInterface
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) (
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
IN VOID *Interface
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_HANDLE_PROTOCOL) (
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
OUT VOID **Interface
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
IN EFI_EVENT Event,
|
||||||
|
OUT VOID **Registration
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_LOCATE_HANDLE) (
|
||||||
|
IN EFI_LOCATE_SEARCH_TYPE SearchType,
|
||||||
|
IN EFI_GUID *Protocol OPTIONAL,
|
||||||
|
IN VOID *SearchKey OPTIONAL,
|
||||||
|
IN OUT UINTN *BufferSize,
|
||||||
|
OUT EFI_HANDLE *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_LOCATE_DEVICE_PATH) (
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
IN OUT EFI_DEVICE_PATH **DevicePath,
|
||||||
|
OUT EFI_HANDLE *Device
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) (
|
||||||
|
IN EFI_GUID *Guid,
|
||||||
|
IN VOID *Table
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_RESERVED_SERVICE) (
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Standard EFI table header
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct _EFI_TABLE_HEADER {
|
||||||
|
UINT64 Signature;
|
||||||
|
UINT32 Revision;
|
||||||
|
UINT32 HeaderSize;
|
||||||
|
UINT32 CRC32;
|
||||||
|
UINT32 Reserved;
|
||||||
|
} EFI_TABLE_HEADER;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Runtime Serivces Table
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552
|
||||||
|
#define EFI_RUNTIME_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_TABLE_HEADER Hdr;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Time services
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_GET_TIME GetTime;
|
||||||
|
EFI_SET_TIME SetTime;
|
||||||
|
EFI_GET_WAKEUP_TIME GetWakeupTime;
|
||||||
|
EFI_SET_WAKEUP_TIME SetWakeupTime;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Virtual memory services
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_SET_VIRTUAL_ADDRESS_MAP SetVirtualAddressMap;
|
||||||
|
EFI_CONVERT_POINTER ConvertPointer;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Variable serviers
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_GET_VARIABLE GetVariable;
|
||||||
|
EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName;
|
||||||
|
EFI_SET_VARIABLE SetVariable;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Misc
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_GET_NEXT_HIGH_MONO_COUNT GetNextHighMonotonicCount;
|
||||||
|
EFI_RESET_SYSTEM ResetSystem;
|
||||||
|
|
||||||
|
EFI_UPDATE_CAPSULE UpdateCapsule;
|
||||||
|
EFI_QUERY_CAPSULE_CAPABILITIES QueryCapsuleCapabilities;
|
||||||
|
EFI_QUERY_VARIABLE_INFO QueryVariableInfo;
|
||||||
|
} EFI_RUNTIME_SERVICES;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Boot Services Table
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
|
||||||
|
#define EFI_BOOT_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
|
||||||
|
|
||||||
|
typedef struct _EFI_BOOT_SERVICES {
|
||||||
|
|
||||||
|
EFI_TABLE_HEADER Hdr;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Task priority functions
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_RAISE_TPL RaiseTPL;
|
||||||
|
EFI_RESTORE_TPL RestoreTPL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Memory functions
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_ALLOCATE_PAGES AllocatePages;
|
||||||
|
EFI_FREE_PAGES FreePages;
|
||||||
|
EFI_GET_MEMORY_MAP GetMemoryMap;
|
||||||
|
EFI_ALLOCATE_POOL AllocatePool;
|
||||||
|
EFI_FREE_POOL FreePool;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Event & timer functions
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_CREATE_EVENT CreateEvent;
|
||||||
|
EFI_SET_TIMER SetTimer;
|
||||||
|
EFI_WAIT_FOR_EVENT WaitForEvent;
|
||||||
|
EFI_SIGNAL_EVENT SignalEvent;
|
||||||
|
EFI_CLOSE_EVENT CloseEvent;
|
||||||
|
EFI_CHECK_EVENT CheckEvent;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Protocol handler functions
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface;
|
||||||
|
EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
|
||||||
|
EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
|
||||||
|
EFI_HANDLE_PROTOCOL HandleProtocol;
|
||||||
|
EFI_HANDLE_PROTOCOL PCHandleProtocol;
|
||||||
|
EFI_REGISTER_PROTOCOL_NOTIFY RegisterProtocolNotify;
|
||||||
|
EFI_LOCATE_HANDLE LocateHandle;
|
||||||
|
EFI_LOCATE_DEVICE_PATH LocateDevicePath;
|
||||||
|
EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Image functions
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_IMAGE_LOAD LoadImage;
|
||||||
|
EFI_IMAGE_START StartImage;
|
||||||
|
EFI_EXIT Exit;
|
||||||
|
EFI_IMAGE_UNLOAD UnloadImage;
|
||||||
|
EFI_EXIT_BOOT_SERVICES ExitBootServices;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Misc functions
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_GET_NEXT_MONOTONIC_COUNT GetNextMonotonicCount;
|
||||||
|
EFI_STALL Stall;
|
||||||
|
EFI_SET_WATCHDOG_TIMER SetWatchdogTimer;
|
||||||
|
|
||||||
|
//
|
||||||
|
// DriverSupport Services
|
||||||
|
//
|
||||||
|
|
||||||
|
EFI_CONNECT_CONTROLLER ConnectController;
|
||||||
|
EFI_DISCONNECT_CONTROLLER DisconnectController;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open and Close Protocol Services
|
||||||
|
//
|
||||||
|
EFI_OPEN_PROTOCOL OpenProtocol;
|
||||||
|
EFI_CLOSE_PROTOCOL CloseProtocol;
|
||||||
|
EFI_OPEN_PROTOCOL_INFORMATION OpenProtocolInformation;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Library Services
|
||||||
|
//
|
||||||
|
EFI_PROTOCOLS_PER_HANDLE ProtocolsPerHandle;
|
||||||
|
EFI_LOCATE_HANDLE_BUFFER LocateHandleBuffer;
|
||||||
|
EFI_LOCATE_PROTOCOL LocateProtocol;
|
||||||
|
EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
|
||||||
|
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
|
||||||
|
|
||||||
|
//
|
||||||
|
// 32-bit CRC Services
|
||||||
|
//
|
||||||
|
EFI_CALCULATE_CRC32 CalculateCrc32;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Misc Services
|
||||||
|
//
|
||||||
|
EFI_COPY_MEM CopyMem;
|
||||||
|
EFI_SET_MEM SetMem;
|
||||||
|
EFI_CREATE_EVENT_EX CreateEventEx;
|
||||||
|
} EFI_BOOT_SERVICES;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Configuration Table and GUID definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
#define MPS_TABLE_GUID \
|
||||||
|
{ 0xeb9d2d2f, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||||||
|
|
||||||
|
#define ACPI_TABLE_GUID \
|
||||||
|
{ 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||||||
|
|
||||||
|
#define ACPI_20_TABLE_GUID \
|
||||||
|
{ 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} }
|
||||||
|
|
||||||
|
#define SMBIOS_TABLE_GUID \
|
||||||
|
{ 0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||||||
|
|
||||||
|
#define SMBIOS3_TABLE_GUID \
|
||||||
|
{ 0xf2fd1544, 0x9794, 0x4a2c, {0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94} }
|
||||||
|
|
||||||
|
#define SAL_SYSTEM_TABLE_GUID \
|
||||||
|
{ 0xeb9d2d32, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _EFI_CONFIGURATION_TABLE {
|
||||||
|
EFI_GUID VendorGuid;
|
||||||
|
VOID *VendorTable;
|
||||||
|
} EFI_CONFIGURATION_TABLE;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI System Table
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
|
||||||
|
#define EFI_SYSTEM_TABLE_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
|
||||||
|
|
||||||
|
typedef struct _EFI_SYSTEM_TABLE {
|
||||||
|
EFI_TABLE_HEADER Hdr;
|
||||||
|
|
||||||
|
CHAR16 *FirmwareVendor;
|
||||||
|
UINT32 FirmwareRevision;
|
||||||
|
|
||||||
|
EFI_HANDLE ConsoleInHandle;
|
||||||
|
SIMPLE_INPUT_INTERFACE *ConIn;
|
||||||
|
|
||||||
|
EFI_HANDLE ConsoleOutHandle;
|
||||||
|
SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut;
|
||||||
|
|
||||||
|
EFI_HANDLE StandardErrorHandle;
|
||||||
|
SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr;
|
||||||
|
|
||||||
|
EFI_RUNTIME_SERVICES *RuntimeServices;
|
||||||
|
EFI_BOOT_SERVICES *BootServices;
|
||||||
|
|
||||||
|
UINTN NumberOfTableEntries;
|
||||||
|
EFI_CONFIGURATION_TABLE *ConfigurationTable;
|
||||||
|
|
||||||
|
} EFI_SYSTEM_TABLE;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
30
src/include/efi/eficompiler.h
Normal file
30
src/include/efi/eficompiler.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2016 Pete Batard <pete@akeo.ie>
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
eficompiler.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Compiler specific adjustments
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#ifdef _MSC_EXTENSIONS
|
||||||
|
#define EFI_UNUSED
|
||||||
|
#else
|
||||||
|
#define EFI_UNUSED __attribute__((__unused__))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_EXTENSIONS
|
||||||
|
#define ALIGN(x) __declspec(align(x))
|
||||||
|
#else
|
||||||
|
#define ALIGN(x) __attribute__((__aligned__(x)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Also add a catch-all on __attribute__() for MS compilers */
|
||||||
|
#ifdef _MSC_EXTENSIONS
|
||||||
|
#define __attribute__(x)
|
||||||
|
#endif
|
||||||
306
src/include/efi/eficon.h
Normal file
306
src/include/efi/eficon.h
Normal file
@@ -0,0 +1,306 @@
|
|||||||
|
#ifndef _EFI_CON_H
|
||||||
|
#define _EFI_CON_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
eficon.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI console protocols
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Text output protocol
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \
|
||||||
|
{ 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||||||
|
#define SIMPLE_TEXT_OUTPUT_PROTOCOL EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID
|
||||||
|
|
||||||
|
INTERFACE_DECL(_SIMPLE_TEXT_OUTPUT_INTERFACE);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_TEXT_RESET) (
|
||||||
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
||||||
|
IN BOOLEAN ExtendedVerification
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_TEXT_OUTPUT_STRING) (
|
||||||
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
||||||
|
IN CHAR16 *String
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_TEXT_TEST_STRING) (
|
||||||
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
||||||
|
IN CHAR16 *String
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_TEXT_QUERY_MODE) (
|
||||||
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
||||||
|
IN UINTN ModeNumber,
|
||||||
|
OUT UINTN *Columns,
|
||||||
|
OUT UINTN *Rows
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_TEXT_SET_MODE) (
|
||||||
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
||||||
|
IN UINTN ModeNumber
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_TEXT_SET_ATTRIBUTE) (
|
||||||
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
||||||
|
IN UINTN Attribute
|
||||||
|
);
|
||||||
|
|
||||||
|
#define EFI_BLACK 0x00
|
||||||
|
#define EFI_BLUE 0x01
|
||||||
|
#define EFI_GREEN 0x02
|
||||||
|
#define EFI_CYAN (EFI_BLUE | EFI_GREEN)
|
||||||
|
#define EFI_RED 0x04
|
||||||
|
#define EFI_MAGENTA (EFI_BLUE | EFI_RED)
|
||||||
|
#define EFI_BROWN (EFI_GREEN | EFI_RED)
|
||||||
|
#define EFI_LIGHTGRAY (EFI_BLUE | EFI_GREEN | EFI_RED)
|
||||||
|
#define EFI_BRIGHT 0x08
|
||||||
|
#define EFI_DARKGRAY (EFI_BRIGHT)
|
||||||
|
#define EFI_LIGHTBLUE (EFI_BLUE | EFI_BRIGHT)
|
||||||
|
#define EFI_LIGHTGREEN (EFI_GREEN | EFI_BRIGHT)
|
||||||
|
#define EFI_LIGHTCYAN (EFI_CYAN | EFI_BRIGHT)
|
||||||
|
#define EFI_LIGHTRED (EFI_RED | EFI_BRIGHT)
|
||||||
|
#define EFI_LIGHTMAGENTA (EFI_MAGENTA | EFI_BRIGHT)
|
||||||
|
#define EFI_YELLOW (EFI_BROWN | EFI_BRIGHT)
|
||||||
|
#define EFI_WHITE (EFI_BLUE | EFI_GREEN | EFI_RED | EFI_BRIGHT)
|
||||||
|
|
||||||
|
#define EFI_TEXT_ATTR(f,b) ((f) | ((b) << 4))
|
||||||
|
|
||||||
|
#define EFI_BACKGROUND_BLACK 0x00
|
||||||
|
#define EFI_BACKGROUND_BLUE 0x10
|
||||||
|
#define EFI_BACKGROUND_GREEN 0x20
|
||||||
|
#define EFI_BACKGROUND_CYAN (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN)
|
||||||
|
#define EFI_BACKGROUND_RED 0x40
|
||||||
|
#define EFI_BACKGROUND_MAGENTA (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_RED)
|
||||||
|
#define EFI_BACKGROUND_BROWN (EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED)
|
||||||
|
#define EFI_BACKGROUND_LIGHTGRAY (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED)
|
||||||
|
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_TEXT_CLEAR_SCREEN) (
|
||||||
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_TEXT_SET_CURSOR_POSITION) (
|
||||||
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
||||||
|
IN UINTN Column,
|
||||||
|
IN UINTN Row
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_TEXT_ENABLE_CURSOR) (
|
||||||
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
||||||
|
IN BOOLEAN Enable
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
INT32 MaxMode;
|
||||||
|
// current settings
|
||||||
|
INT32 Mode;
|
||||||
|
INT32 Attribute;
|
||||||
|
INT32 CursorColumn;
|
||||||
|
INT32 CursorRow;
|
||||||
|
BOOLEAN CursorVisible;
|
||||||
|
} SIMPLE_TEXT_OUTPUT_MODE;
|
||||||
|
|
||||||
|
typedef struct _SIMPLE_TEXT_OUTPUT_INTERFACE {
|
||||||
|
EFI_TEXT_RESET Reset;
|
||||||
|
|
||||||
|
EFI_TEXT_OUTPUT_STRING OutputString;
|
||||||
|
EFI_TEXT_TEST_STRING TestString;
|
||||||
|
|
||||||
|
EFI_TEXT_QUERY_MODE QueryMode;
|
||||||
|
EFI_TEXT_SET_MODE SetMode;
|
||||||
|
EFI_TEXT_SET_ATTRIBUTE SetAttribute;
|
||||||
|
|
||||||
|
EFI_TEXT_CLEAR_SCREEN ClearScreen;
|
||||||
|
EFI_TEXT_SET_CURSOR_POSITION SetCursorPosition;
|
||||||
|
EFI_TEXT_ENABLE_CURSOR EnableCursor;
|
||||||
|
|
||||||
|
// Current mode
|
||||||
|
SIMPLE_TEXT_OUTPUT_MODE *Mode;
|
||||||
|
} SIMPLE_TEXT_OUTPUT_INTERFACE, EFI_SIMPLE_TEXT_OUT_PROTOCOL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define's for required EFI Unicode Box Draw character
|
||||||
|
//
|
||||||
|
|
||||||
|
#define BOXDRAW_HORIZONTAL 0x2500
|
||||||
|
#define BOXDRAW_VERTICAL 0x2502
|
||||||
|
#define BOXDRAW_DOWN_RIGHT 0x250c
|
||||||
|
#define BOXDRAW_DOWN_LEFT 0x2510
|
||||||
|
#define BOXDRAW_UP_RIGHT 0x2514
|
||||||
|
#define BOXDRAW_UP_LEFT 0x2518
|
||||||
|
#define BOXDRAW_VERTICAL_RIGHT 0x251c
|
||||||
|
#define BOXDRAW_VERTICAL_LEFT 0x2524
|
||||||
|
#define BOXDRAW_DOWN_HORIZONTAL 0x252c
|
||||||
|
#define BOXDRAW_UP_HORIZONTAL 0x2534
|
||||||
|
#define BOXDRAW_VERTICAL_HORIZONTAL 0x253c
|
||||||
|
|
||||||
|
#define BOXDRAW_DOUBLE_HORIZONTAL 0x2550
|
||||||
|
#define BOXDRAW_DOUBLE_VERTICAL 0x2551
|
||||||
|
#define BOXDRAW_DOWN_RIGHT_DOUBLE 0x2552
|
||||||
|
#define BOXDRAW_DOWN_DOUBLE_RIGHT 0x2553
|
||||||
|
#define BOXDRAW_DOUBLE_DOWN_RIGHT 0x2554
|
||||||
|
|
||||||
|
#define BOXDRAW_DOWN_LEFT_DOUBLE 0x2555
|
||||||
|
#define BOXDRAW_DOWN_DOUBLE_LEFT 0x2556
|
||||||
|
#define BOXDRAW_DOUBLE_DOWN_LEFT 0x2557
|
||||||
|
|
||||||
|
#define BOXDRAW_UP_RIGHT_DOUBLE 0x2558
|
||||||
|
#define BOXDRAW_UP_DOUBLE_RIGHT 0x2559
|
||||||
|
#define BOXDRAW_DOUBLE_UP_RIGHT 0x255a
|
||||||
|
|
||||||
|
#define BOXDRAW_UP_LEFT_DOUBLE 0x255b
|
||||||
|
#define BOXDRAW_UP_DOUBLE_LEFT 0x255c
|
||||||
|
#define BOXDRAW_DOUBLE_UP_LEFT 0x255d
|
||||||
|
|
||||||
|
#define BOXDRAW_VERTICAL_RIGHT_DOUBLE 0x255e
|
||||||
|
#define BOXDRAW_VERTICAL_DOUBLE_RIGHT 0x255f
|
||||||
|
#define BOXDRAW_DOUBLE_VERTICAL_RIGHT 0x2560
|
||||||
|
|
||||||
|
#define BOXDRAW_VERTICAL_LEFT_DOUBLE 0x2561
|
||||||
|
#define BOXDRAW_VERTICAL_DOUBLE_LEFT 0x2562
|
||||||
|
#define BOXDRAW_DOUBLE_VERTICAL_LEFT 0x2563
|
||||||
|
|
||||||
|
#define BOXDRAW_DOWN_HORIZONTAL_DOUBLE 0x2564
|
||||||
|
#define BOXDRAW_DOWN_DOUBLE_HORIZONTAL 0x2565
|
||||||
|
#define BOXDRAW_DOUBLE_DOWN_HORIZONTAL 0x2566
|
||||||
|
|
||||||
|
#define BOXDRAW_UP_HORIZONTAL_DOUBLE 0x2567
|
||||||
|
#define BOXDRAW_UP_DOUBLE_HORIZONTAL 0x2568
|
||||||
|
#define BOXDRAW_DOUBLE_UP_HORIZONTAL 0x2569
|
||||||
|
|
||||||
|
#define BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE 0x256a
|
||||||
|
#define BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL 0x256b
|
||||||
|
#define BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL 0x256c
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Required Block Elements Code Chart
|
||||||
|
//
|
||||||
|
|
||||||
|
#define BLOCKELEMENT_FULL_BLOCK 0x2588
|
||||||
|
#define BLOCKELEMENT_LIGHT_SHADE 0x2591
|
||||||
|
//
|
||||||
|
// EFI Required Geometric Shapes Code Chart
|
||||||
|
//
|
||||||
|
|
||||||
|
#define GEOMETRICSHAPE_UP_TRIANGLE 0x25b2
|
||||||
|
#define GEOMETRICSHAPE_RIGHT_TRIANGLE 0x25ba
|
||||||
|
#define GEOMETRICSHAPE_DOWN_TRIANGLE 0x25bc
|
||||||
|
#define GEOMETRICSHAPE_LEFT_TRIANGLE 0x25c4
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Required Arrow shapes
|
||||||
|
//
|
||||||
|
|
||||||
|
#define ARROW_UP 0x2191
|
||||||
|
#define ARROW_DOWN 0x2193
|
||||||
|
|
||||||
|
//
|
||||||
|
// Text input protocol
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \
|
||||||
|
{ 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||||||
|
#define SIMPLE_TEXT_INPUT_PROTOCOL EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID
|
||||||
|
|
||||||
|
INTERFACE_DECL(_SIMPLE_INPUT_INTERFACE);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT16 ScanCode;
|
||||||
|
CHAR16 UnicodeChar;
|
||||||
|
} EFI_INPUT_KEY;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Baseline unicode control chars
|
||||||
|
//
|
||||||
|
|
||||||
|
#define CHAR_NULL 0x0000
|
||||||
|
#define CHAR_BACKSPACE 0x0008
|
||||||
|
#define CHAR_TAB 0x0009
|
||||||
|
#define CHAR_LINEFEED 0x000A
|
||||||
|
#define CHAR_CARRIAGE_RETURN 0x000D
|
||||||
|
|
||||||
|
//
|
||||||
|
// Scan codes for base line keys
|
||||||
|
//
|
||||||
|
|
||||||
|
#define SCAN_NULL 0x0000
|
||||||
|
#define SCAN_UP 0x0001
|
||||||
|
#define SCAN_DOWN 0x0002
|
||||||
|
#define SCAN_RIGHT 0x0003
|
||||||
|
#define SCAN_LEFT 0x0004
|
||||||
|
#define SCAN_HOME 0x0005
|
||||||
|
#define SCAN_END 0x0006
|
||||||
|
#define SCAN_INSERT 0x0007
|
||||||
|
#define SCAN_DELETE 0x0008
|
||||||
|
#define SCAN_PAGE_UP 0x0009
|
||||||
|
#define SCAN_PAGE_DOWN 0x000A
|
||||||
|
#define SCAN_F1 0x000B
|
||||||
|
#define SCAN_F2 0x000C
|
||||||
|
#define SCAN_F3 0x000D
|
||||||
|
#define SCAN_F4 0x000E
|
||||||
|
#define SCAN_F5 0x000F
|
||||||
|
#define SCAN_F6 0x0010
|
||||||
|
#define SCAN_F7 0x0011
|
||||||
|
#define SCAN_F8 0x0012
|
||||||
|
#define SCAN_F9 0x0013
|
||||||
|
#define SCAN_F10 0x0014
|
||||||
|
#define SCAN_F11 0x0015
|
||||||
|
#define SCAN_F12 0x0016
|
||||||
|
#define SCAN_ESC 0x0017
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_INPUT_RESET) (
|
||||||
|
IN struct _SIMPLE_INPUT_INTERFACE *This,
|
||||||
|
IN BOOLEAN ExtendedVerification
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_INPUT_READ_KEY) (
|
||||||
|
IN struct _SIMPLE_INPUT_INTERFACE *This,
|
||||||
|
OUT EFI_INPUT_KEY *Key
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _SIMPLE_INPUT_INTERFACE {
|
||||||
|
EFI_INPUT_RESET Reset;
|
||||||
|
EFI_INPUT_READ_KEY ReadKeyStroke;
|
||||||
|
EFI_EVENT WaitForKey;
|
||||||
|
} SIMPLE_INPUT_INTERFACE, EFI_SIMPLE_TEXT_IN_PROTOCOL;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
620
src/include/efi/efidebug.h
Normal file
620
src/include/efi/efidebug.h
Normal file
@@ -0,0 +1,620 @@
|
|||||||
|
#ifndef _EFI_DEBUG_H
|
||||||
|
#define _EFI_DEBUG_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efidebug.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI library debug functions
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
extern UINTN EFIDebug;
|
||||||
|
|
||||||
|
#if EFI_DEBUG
|
||||||
|
|
||||||
|
#define DBGASSERT(a) DbgAssert(__FILE__, __LINE__, #a)
|
||||||
|
#define DEBUG(a) DbgPrint a
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define DBGASSERT(a)
|
||||||
|
#define DEBUG(a)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if EFI_DEBUG_CLEAR_MEMORY
|
||||||
|
|
||||||
|
#define DBGSETMEM(a,l) SetMem(a,l,(CHAR8)BAD_POINTER)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define DBGSETMEM(a,l)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define D_INIT 0x00000001 // Initialization style messages
|
||||||
|
#define D_WARN 0x00000002 // Warnings
|
||||||
|
#define D_LOAD 0x00000004 // Load events
|
||||||
|
#define D_FS 0x00000008 // EFI File system
|
||||||
|
#define D_POOL 0x00000010 // Alloc & Free's
|
||||||
|
#define D_PAGE 0x00000020 // Alloc & Free's
|
||||||
|
#define D_INFO 0x00000040 // Verbose
|
||||||
|
#define D_VAR 0x00000100 // Variable
|
||||||
|
#define D_PARSE 0x00000200 // Command parsing
|
||||||
|
#define D_BM 0x00000400 // Boot manager
|
||||||
|
#define D_BLKIO 0x00001000 // BlkIo Driver
|
||||||
|
#define D_BLKIO_ULTRA 0x00002000 // BlkIo Driver
|
||||||
|
#define D_NET 0x00004000 // SNI Driver
|
||||||
|
#define D_NET_ULTRA 0x00008000 // SNI Driver
|
||||||
|
#define D_TXTIN 0x00010000 // Simple Input Driver
|
||||||
|
#define D_TXTOUT 0x00020000 // Simple Text Output Driver
|
||||||
|
#define D_ERROR_ATA 0x00040000 // ATA error messages
|
||||||
|
#define D_ERROR 0x80000000 // Error
|
||||||
|
|
||||||
|
#define D_RESERVED 0x7fffC880 // Bits not reserved above
|
||||||
|
|
||||||
|
//
|
||||||
|
// Current Debug level of the system, value of EFIDebug
|
||||||
|
//
|
||||||
|
//#define EFI_DBUG_MASK (D_ERROR | D_WARN | D_LOAD | D_BLKIO | D_INIT)
|
||||||
|
#define EFI_DBUG_MASK (D_ERROR)
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#if EFI_DEBUG
|
||||||
|
|
||||||
|
#define ASSERT(a) if(!(a)) DBGASSERT(a)
|
||||||
|
#define ASSERT_LOCKED(l) if(!(l)->Lock) DBGASSERT(l not locked)
|
||||||
|
#define ASSERT_STRUCT(p,t) DBGASSERT(t not structure), p
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define ASSERT(a)
|
||||||
|
#define ASSERT_LOCKED(l)
|
||||||
|
#define ASSERT_STRUCT(p,t)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prototypes
|
||||||
|
//
|
||||||
|
|
||||||
|
INTN
|
||||||
|
DbgAssert (
|
||||||
|
CONST CHAR8 *file,
|
||||||
|
INTN lineno,
|
||||||
|
CONST CHAR8 *string
|
||||||
|
);
|
||||||
|
|
||||||
|
INTN
|
||||||
|
DbgPrint (
|
||||||
|
INTN mask,
|
||||||
|
CONST CHAR8 *format,
|
||||||
|
...
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Instruction Set Architectures definitions for debuggers
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef INTN EFI_EXCEPTION_TYPE;
|
||||||
|
|
||||||
|
// IA32
|
||||||
|
#define EXCEPT_IA32_DIVIDE_ERROR 0
|
||||||
|
#define EXCEPT_IA32_DEBUG 1
|
||||||
|
#define EXCEPT_IA32_NMI 2
|
||||||
|
#define EXCEPT_IA32_BREAKPOINT 3
|
||||||
|
#define EXCEPT_IA32_OVERFLOW 4
|
||||||
|
#define EXCEPT_IA32_BOUND 5
|
||||||
|
#define EXCEPT_IA32_INVALID_OPCODE 6
|
||||||
|
#define EXCEPT_IA32_DOUBLE_FAULT 8
|
||||||
|
#define EXCEPT_IA32_INVALID_TSS 10
|
||||||
|
#define EXCEPT_IA32_SEG_NOT_PRESENT 11
|
||||||
|
#define EXCEPT_IA32_STACK_FAULT 12
|
||||||
|
#define EXCEPT_IA32_GP_FAULT 13
|
||||||
|
#define EXCEPT_IA32_PAGE_FAULT 14
|
||||||
|
#define EXCEPT_IA32_FP_ERROR 16
|
||||||
|
#define EXCEPT_IA32_ALIGNMENT_CHECK 17
|
||||||
|
#define EXCEPT_IA32_MACHINE_CHECK 18
|
||||||
|
#define EXCEPT_IA32_SIMD 19
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT16 Fcw;
|
||||||
|
UINT16 Fsw;
|
||||||
|
UINT16 Ftw;
|
||||||
|
UINT16 Opcode;
|
||||||
|
UINT32 Eip;
|
||||||
|
UINT16 Cs;
|
||||||
|
UINT16 Reserved1;
|
||||||
|
UINT32 DataOffset;
|
||||||
|
UINT16 Ds;
|
||||||
|
UINT8 Reserved2[10];
|
||||||
|
UINT8 St0Mm0[10], Reserved3[6];
|
||||||
|
UINT8 St1Mm1[10], Reserved4[6];
|
||||||
|
UINT8 St2Mm2[10], Reserved5[6];
|
||||||
|
UINT8 St3Mm3[10], Reserved6[6];
|
||||||
|
UINT8 St4Mm4[10], Reserved7[6];
|
||||||
|
UINT8 St5Mm5[10], Reserved8[6];
|
||||||
|
UINT8 St6Mm6[10], Reserved9[6];
|
||||||
|
UINT8 St7Mm7[10], Reserved10[6];
|
||||||
|
UINT8 Xmm0[16];
|
||||||
|
UINT8 Xmm1[16];
|
||||||
|
UINT8 Xmm2[16];
|
||||||
|
UINT8 Xmm3[16];
|
||||||
|
UINT8 Xmm4[16];
|
||||||
|
UINT8 Xmm5[16];
|
||||||
|
UINT8 Xmm6[16];
|
||||||
|
UINT8 Xmm7[16];
|
||||||
|
UINT8 Reserved11[14 * 16];
|
||||||
|
} EFI_FX_SAVE_STATE_IA32;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 ExceptionData;
|
||||||
|
EFI_FX_SAVE_STATE_IA32 FxSaveState;
|
||||||
|
UINT32 Dr0;
|
||||||
|
UINT32 Dr1;
|
||||||
|
UINT32 Dr2;
|
||||||
|
UINT32 Dr3;
|
||||||
|
UINT32 Dr6;
|
||||||
|
UINT32 Dr7;
|
||||||
|
UINT32 Cr0;
|
||||||
|
UINT32 Cr1;
|
||||||
|
UINT32 Cr2;
|
||||||
|
UINT32 Cr3;
|
||||||
|
UINT32 Cr4;
|
||||||
|
UINT32 Eflags;
|
||||||
|
UINT32 Ldtr;
|
||||||
|
UINT32 Tr;
|
||||||
|
UINT32 Gdtr[2];
|
||||||
|
UINT32 Idtr[2];
|
||||||
|
UINT32 Eip;
|
||||||
|
UINT32 Gs;
|
||||||
|
UINT32 Fs;
|
||||||
|
UINT32 Es;
|
||||||
|
UINT32 Ds;
|
||||||
|
UINT32 Cs;
|
||||||
|
UINT32 Ss;
|
||||||
|
UINT32 Edi;
|
||||||
|
UINT32 Esi;
|
||||||
|
UINT32 Ebp;
|
||||||
|
UINT32 Esp;
|
||||||
|
UINT32 Ebx;
|
||||||
|
UINT32 Edx;
|
||||||
|
UINT32 Ecx;
|
||||||
|
UINT32 Eax;
|
||||||
|
} EFI_SYSTEM_CONTEXT_IA32;
|
||||||
|
|
||||||
|
// X64
|
||||||
|
#define EXCEPT_X64_DIVIDE_ERROR 0
|
||||||
|
#define EXCEPT_X64_DEBUG 1
|
||||||
|
#define EXCEPT_X64_NMI 2
|
||||||
|
#define EXCEPT_X64_BREAKPOINT 3
|
||||||
|
#define EXCEPT_X64_OVERFLOW 4
|
||||||
|
#define EXCEPT_X64_BOUND 5
|
||||||
|
#define EXCEPT_X64_INVALID_OPCODE 6
|
||||||
|
#define EXCEPT_X64_DOUBLE_FAULT 8
|
||||||
|
#define EXCEPT_X64_INVALID_TSS 10
|
||||||
|
#define EXCEPT_X64_SEG_NOT_PRESENT 11
|
||||||
|
#define EXCEPT_X64_STACK_FAULT 12
|
||||||
|
#define EXCEPT_X64_GP_FAULT 13
|
||||||
|
#define EXCEPT_X64_PAGE_FAULT 14
|
||||||
|
#define EXCEPT_X64_FP_ERROR 16
|
||||||
|
#define EXCEPT_X64_ALIGNMENT_CHECK 17
|
||||||
|
#define EXCEPT_X64_MACHINE_CHECK 18
|
||||||
|
#define EXCEPT_X64_SIMD 19
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT16 Fcw;
|
||||||
|
UINT16 Fsw;
|
||||||
|
UINT16 Ftw;
|
||||||
|
UINT16 Opcode;
|
||||||
|
UINT64 Rip;
|
||||||
|
UINT64 DataOffset;
|
||||||
|
UINT8 Reserved1[8];
|
||||||
|
UINT8 St0Mm0[10], Reserved2[6];
|
||||||
|
UINT8 St1Mm1[10], Reserved3[6];
|
||||||
|
UINT8 St2Mm2[10], Reserved4[6];
|
||||||
|
UINT8 St3Mm3[10], Reserved5[6];
|
||||||
|
UINT8 St4Mm4[10], Reserved6[6];
|
||||||
|
UINT8 St5Mm5[10], Reserved7[6];
|
||||||
|
UINT8 St6Mm6[10], Reserved8[6];
|
||||||
|
UINT8 St7Mm7[10], Reserved9[6];
|
||||||
|
UINT8 Xmm0[16];
|
||||||
|
UINT8 Xmm1[16];
|
||||||
|
UINT8 Xmm2[16];
|
||||||
|
UINT8 Xmm3[16];
|
||||||
|
UINT8 Xmm4[16];
|
||||||
|
UINT8 Xmm5[16];
|
||||||
|
UINT8 Xmm6[16];
|
||||||
|
UINT8 Xmm7[16];
|
||||||
|
UINT8 Reserved11[14 * 16];
|
||||||
|
} EFI_FX_SAVE_STATE_X64;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 ExceptionData;
|
||||||
|
EFI_FX_SAVE_STATE_X64 FxSaveState;
|
||||||
|
UINT64 Dr0;
|
||||||
|
UINT64 Dr1;
|
||||||
|
UINT64 Dr2;
|
||||||
|
UINT64 Dr3;
|
||||||
|
UINT64 Dr6;
|
||||||
|
UINT64 Dr7;
|
||||||
|
UINT64 Cr0;
|
||||||
|
UINT64 Cr1;
|
||||||
|
UINT64 Cr2;
|
||||||
|
UINT64 Cr3;
|
||||||
|
UINT64 Cr4;
|
||||||
|
UINT64 Cr8;
|
||||||
|
UINT64 Rflags;
|
||||||
|
UINT64 Ldtr;
|
||||||
|
UINT64 Tr;
|
||||||
|
UINT64 Gdtr[2];
|
||||||
|
UINT64 Idtr[2];
|
||||||
|
UINT64 Rip;
|
||||||
|
UINT64 Gs;
|
||||||
|
UINT64 Fs;
|
||||||
|
UINT64 Es;
|
||||||
|
UINT64 Ds;
|
||||||
|
UINT64 Cs;
|
||||||
|
UINT64 Ss;
|
||||||
|
UINT64 Rdi;
|
||||||
|
UINT64 Rsi;
|
||||||
|
UINT64 Rbp;
|
||||||
|
UINT64 Rsp;
|
||||||
|
UINT64 Rbx;
|
||||||
|
UINT64 Rdx;
|
||||||
|
UINT64 Rcx;
|
||||||
|
UINT64 Rax;
|
||||||
|
UINT64 R8;
|
||||||
|
UINT64 R9;
|
||||||
|
UINT64 R10;
|
||||||
|
UINT64 R11;
|
||||||
|
UINT64 R12;
|
||||||
|
UINT64 R13;
|
||||||
|
UINT64 R14;
|
||||||
|
UINT64 R15;
|
||||||
|
} EFI_SYSTEM_CONTEXT_X64;
|
||||||
|
|
||||||
|
/// IA64
|
||||||
|
#define EXCEPT_IPF_VHTP_TRANSLATION 0
|
||||||
|
#define EXCEPT_IPF_INSTRUCTION_TLB 1
|
||||||
|
#define EXCEPT_IPF_DATA_TLB 2
|
||||||
|
#define EXCEPT_IPF_ALT_INSTRUCTION_TLB 3
|
||||||
|
#define EXCEPT_IPF_ALT_DATA_TLB 4
|
||||||
|
#define EXCEPT_IPF_DATA_NESTED_TLB 5
|
||||||
|
#define EXCEPT_IPF_INSTRUCTION_KEY_MISSED 6
|
||||||
|
#define EXCEPT_IPF_DATA_KEY_MISSED 7
|
||||||
|
#define EXCEPT_IPF_DIRTY_BIT 8
|
||||||
|
#define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT 9
|
||||||
|
#define EXCEPT_IPF_DATA_ACCESS_BIT 10
|
||||||
|
#define EXCEPT_IPF_BREAKPOINT 11
|
||||||
|
#define EXCEPT_IPF_EXTERNAL_INTERRUPT 12
|
||||||
|
#define EXCEPT_IPF_PAGE_NOT_PRESENT 20
|
||||||
|
#define EXCEPT_IPF_KEY_PERMISSION 21
|
||||||
|
#define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS 22
|
||||||
|
#define EXCEPT_IPF_DATA_ACCESS_RIGHTS 23
|
||||||
|
#define EXCEPT_IPF_GENERAL_EXCEPTION 24
|
||||||
|
#define EXCEPT_IPF_DISABLED_FP_REGISTER 25
|
||||||
|
#define EXCEPT_IPF_NAT_CONSUMPTION 26
|
||||||
|
#define EXCEPT_IPF_SPECULATION 27
|
||||||
|
#define EXCEPT_IPF_DEBUG 29
|
||||||
|
#define EXCEPT_IPF_UNALIGNED_REFERENCE 30
|
||||||
|
#define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE 31
|
||||||
|
#define EXCEPT_IPF_FP_FAULT 32
|
||||||
|
#define EXCEPT_IPF_FP_TRAP 33
|
||||||
|
#define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP 34
|
||||||
|
#define EXCEPT_IPF_TAKEN_BRANCH 35
|
||||||
|
#define EXCEPT_IPF_SINGLE_STEP 36
|
||||||
|
#define EXCEPT_IPF_IA32_EXCEPTION 45
|
||||||
|
#define EXCEPT_IPF_IA32_INTERCEPT 46
|
||||||
|
#define EXCEPT_IPF_IA32_INTERRUPT 47
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 Reserved;
|
||||||
|
UINT64 R1;
|
||||||
|
UINT64 R2;
|
||||||
|
UINT64 R3;
|
||||||
|
UINT64 R4;
|
||||||
|
UINT64 R5;
|
||||||
|
UINT64 R6;
|
||||||
|
UINT64 R7;
|
||||||
|
UINT64 R8;
|
||||||
|
UINT64 R9;
|
||||||
|
UINT64 R10;
|
||||||
|
UINT64 R11;
|
||||||
|
UINT64 R12;
|
||||||
|
UINT64 R13;
|
||||||
|
UINT64 R14;
|
||||||
|
UINT64 R15;
|
||||||
|
UINT64 R16;
|
||||||
|
UINT64 R17;
|
||||||
|
UINT64 R18;
|
||||||
|
UINT64 R19;
|
||||||
|
UINT64 R20;
|
||||||
|
UINT64 R21;
|
||||||
|
UINT64 R22;
|
||||||
|
UINT64 R23;
|
||||||
|
UINT64 R24;
|
||||||
|
UINT64 R25;
|
||||||
|
UINT64 R26;
|
||||||
|
UINT64 R27;
|
||||||
|
UINT64 R28;
|
||||||
|
UINT64 R29;
|
||||||
|
UINT64 R30;
|
||||||
|
UINT64 R31;
|
||||||
|
UINT64 F2[2];
|
||||||
|
UINT64 F3[2];
|
||||||
|
UINT64 F4[2];
|
||||||
|
UINT64 F5[2];
|
||||||
|
UINT64 F6[2];
|
||||||
|
UINT64 F7[2];
|
||||||
|
UINT64 F8[2];
|
||||||
|
UINT64 F9[2];
|
||||||
|
UINT64 F10[2];
|
||||||
|
UINT64 F11[2];
|
||||||
|
UINT64 F12[2];
|
||||||
|
UINT64 F13[2];
|
||||||
|
UINT64 F14[2];
|
||||||
|
UINT64 F15[2];
|
||||||
|
UINT64 F16[2];
|
||||||
|
UINT64 F17[2];
|
||||||
|
UINT64 F18[2];
|
||||||
|
UINT64 F19[2];
|
||||||
|
UINT64 F20[2];
|
||||||
|
UINT64 F21[2];
|
||||||
|
UINT64 F22[2];
|
||||||
|
UINT64 F23[2];
|
||||||
|
UINT64 F24[2];
|
||||||
|
UINT64 F25[2];
|
||||||
|
UINT64 F26[2];
|
||||||
|
UINT64 F27[2];
|
||||||
|
UINT64 F28[2];
|
||||||
|
UINT64 F29[2];
|
||||||
|
UINT64 F30[2];
|
||||||
|
UINT64 F31[2];
|
||||||
|
UINT64 Pr;
|
||||||
|
UINT64 B0;
|
||||||
|
UINT64 B1;
|
||||||
|
UINT64 B2;
|
||||||
|
UINT64 B3;
|
||||||
|
UINT64 B4;
|
||||||
|
UINT64 B5;
|
||||||
|
UINT64 B6;
|
||||||
|
UINT64 B7;
|
||||||
|
UINT64 ArRsc;
|
||||||
|
UINT64 ArBsp;
|
||||||
|
UINT64 ArBspstore;
|
||||||
|
UINT64 ArRnat;
|
||||||
|
UINT64 ArFcr;
|
||||||
|
UINT64 ArEflag;
|
||||||
|
UINT64 ArCsd;
|
||||||
|
UINT64 ArSsd;
|
||||||
|
UINT64 ArCflg;
|
||||||
|
UINT64 ArFsr;
|
||||||
|
UINT64 ArFir;
|
||||||
|
UINT64 ArFdr;
|
||||||
|
UINT64 ArCcv;
|
||||||
|
UINT64 ArUnat;
|
||||||
|
UINT64 ArFpsr;
|
||||||
|
UINT64 ArPfs;
|
||||||
|
UINT64 ArLc;
|
||||||
|
UINT64 ArEc;
|
||||||
|
UINT64 CrDcr;
|
||||||
|
UINT64 CrItm;
|
||||||
|
UINT64 CrIva;
|
||||||
|
UINT64 CrPta;
|
||||||
|
UINT64 CrIpsr;
|
||||||
|
UINT64 CrIsr;
|
||||||
|
UINT64 CrIip;
|
||||||
|
UINT64 CrIfa;
|
||||||
|
UINT64 CrItir;
|
||||||
|
UINT64 CrIipa;
|
||||||
|
UINT64 CrIfs;
|
||||||
|
UINT64 CrIim;
|
||||||
|
UINT64 CrIha;
|
||||||
|
UINT64 Dbr0;
|
||||||
|
UINT64 Dbr1;
|
||||||
|
UINT64 Dbr2;
|
||||||
|
UINT64 Dbr3;
|
||||||
|
UINT64 Dbr4;
|
||||||
|
UINT64 Dbr5;
|
||||||
|
UINT64 Dbr6;
|
||||||
|
UINT64 Dbr7;
|
||||||
|
UINT64 Ibr0;
|
||||||
|
UINT64 Ibr1;
|
||||||
|
UINT64 Ibr2;
|
||||||
|
UINT64 Ibr3;
|
||||||
|
UINT64 Ibr4;
|
||||||
|
UINT64 Ibr5;
|
||||||
|
UINT64 Ibr6;
|
||||||
|
UINT64 Ibr7;
|
||||||
|
UINT64 IntNat;
|
||||||
|
} EFI_SYSTEM_CONTEXT_IPF;
|
||||||
|
|
||||||
|
// EBC
|
||||||
|
#define EXCEPT_EBC_UNDEFINED 0
|
||||||
|
#define EXCEPT_EBC_DIVIDE_ERROR 1
|
||||||
|
#define EXCEPT_EBC_DEBUG 2
|
||||||
|
#define EXCEPT_EBC_BREAKPOINT 3
|
||||||
|
#define EXCEPT_EBC_OVERFLOW 4
|
||||||
|
#define EXCEPT_EBC_INVALID_OPCODE 5
|
||||||
|
#define EXCEPT_EBC_STACK_FAULT 6
|
||||||
|
#define EXCEPT_EBC_ALIGNMENT_CHECK 7
|
||||||
|
#define EXCEPT_EBC_INSTRUCTION_ENCODING 8
|
||||||
|
#define EXCEPT_EBC_BAD_BREAK 9
|
||||||
|
#define EXCEPT_EBC_STEP 10
|
||||||
|
#define MAX_EBC_EXCEPTION EXCEPT_EBC_STEP
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 R0;
|
||||||
|
UINT64 R1;
|
||||||
|
UINT64 R2;
|
||||||
|
UINT64 R3;
|
||||||
|
UINT64 R4;
|
||||||
|
UINT64 R5;
|
||||||
|
UINT64 R6;
|
||||||
|
UINT64 R7;
|
||||||
|
UINT64 Flags;
|
||||||
|
UINT64 ControlFlags;
|
||||||
|
UINT64 Ip;
|
||||||
|
} EFI_SYSTEM_CONTEXT_EBC;
|
||||||
|
|
||||||
|
// ARM
|
||||||
|
#define EXCEPT_ARM_RESET 0
|
||||||
|
#define EXCEPT_ARM_UNDEFINED_INSTRUCTION 1
|
||||||
|
#define EXCEPT_ARM_SOFTWARE_INTERRUPT 2
|
||||||
|
#define EXCEPT_ARM_PREFETCH_ABORT 3
|
||||||
|
#define EXCEPT_ARM_DATA_ABORT 4
|
||||||
|
#define EXCEPT_ARM_RESERVED 5
|
||||||
|
#define EXCEPT_ARM_IRQ 6
|
||||||
|
#define EXCEPT_ARM_FIQ 7
|
||||||
|
#define MAX_ARM_EXCEPTION EXCEPT_ARM_FIQ
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 R0;
|
||||||
|
UINT32 R1;
|
||||||
|
UINT32 R2;
|
||||||
|
UINT32 R3;
|
||||||
|
UINT32 R4;
|
||||||
|
UINT32 R5;
|
||||||
|
UINT32 R6;
|
||||||
|
UINT32 R7;
|
||||||
|
UINT32 R8;
|
||||||
|
UINT32 R9;
|
||||||
|
UINT32 R10;
|
||||||
|
UINT32 R11;
|
||||||
|
UINT32 R12;
|
||||||
|
UINT32 SP;
|
||||||
|
UINT32 LR;
|
||||||
|
UINT32 PC;
|
||||||
|
UINT32 CPSR;
|
||||||
|
UINT32 DFSR;
|
||||||
|
UINT32 DFAR;
|
||||||
|
UINT32 IFSR;
|
||||||
|
UINT32 IFAR;
|
||||||
|
} EFI_SYSTEM_CONTEXT_ARM;
|
||||||
|
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
EFI_SYSTEM_CONTEXT_EBC *SystemContextEbc;
|
||||||
|
EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32;
|
||||||
|
EFI_SYSTEM_CONTEXT_X64 *SystemContextX64;
|
||||||
|
EFI_SYSTEM_CONTEXT_IPF *SystemContextIpf;
|
||||||
|
EFI_SYSTEM_CONTEXT_ARM *SystemContextArm;
|
||||||
|
} EFI_SYSTEM_CONTEXT;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
VOID
|
||||||
|
(EFIAPI *EFI_EXCEPTION_CALLBACK)(
|
||||||
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
|
IN OUT EFI_SYSTEM_CONTEXT SystemContext);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
VOID
|
||||||
|
(EFIAPI *EFI_PERIODIC_CALLBACK)(
|
||||||
|
IN OUT EFI_SYSTEM_CONTEXT SystemContext);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IsaIa32 = EFI_IMAGE_MACHINE_IA32,
|
||||||
|
IsaX64 = EFI_IMAGE_MACHINE_X64,
|
||||||
|
IsaIpf = EFI_IMAGE_MACHINE_IA64,
|
||||||
|
IsaEbc = EFI_IMAGE_MACHINE_EBC,
|
||||||
|
IsaArm = EFI_IMAGE_MACHINE_ARMTHUMB_MIXED,
|
||||||
|
// IsaArm64 = EFI_IMAGE_MACHINE_AARCH64
|
||||||
|
} EFI_INSTRUCTION_SET_ARCHITECTURE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// DEBUG_IMAGE_INFO
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_DEBUG_IMAGE_INFO_TABLE_GUID \
|
||||||
|
{ 0x49152e77, 0x1ada, 0x4764, {0xb7, 0xa2, 0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b} }
|
||||||
|
|
||||||
|
#define EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS 0x01
|
||||||
|
#define EFI_DEBUG_IMAGE_INFO_TABLE_MODIFIED 0x02
|
||||||
|
#define EFI_DEBUG_IMAGE_INFO_INITIAL_SIZE (EFI_PAGE_SIZE / sizeof (UINTN))
|
||||||
|
#define EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL 0x01
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 Signature;
|
||||||
|
EFI_PHYSICAL_ADDRESS EfiSystemTableBase;
|
||||||
|
UINT32 Crc32;
|
||||||
|
} EFI_SYSTEM_TABLE_POINTER;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 ImageInfoType;
|
||||||
|
EFI_LOADED_IMAGE_PROTOCOL *LoadedImageProtocolInstance;
|
||||||
|
EFI_HANDLE *ImageHandle;
|
||||||
|
} EFI_DEBUG_IMAGE_INFO_NORMAL;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
UINT32 *ImageInfoType;
|
||||||
|
EFI_DEBUG_IMAGE_INFO_NORMAL *NormalImage;
|
||||||
|
} EFI_DEBUG_IMAGE_INFO;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
volatile UINT32 UpdateStatus;
|
||||||
|
UINT32 TableSize;
|
||||||
|
EFI_DEBUG_IMAGE_INFO *EfiDebugImageInfoTable;
|
||||||
|
} EFI_DEBUG_IMAGE_INFO_TABLE_HEADER;
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI_DEBUGGER_PROTOCOL
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \
|
||||||
|
{ 0x2755590c, 0x6f3c, 0x42fa, {0x9e, 0xa4, 0xa3, 0xba, 0x54, 0x3c, 0xda, 0x25} }
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_DEBUG_SUPPORT_PROTOCOL);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)(
|
||||||
|
IN struct _EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
|
OUT UINTN *MaxProcessorIndex);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)(
|
||||||
|
IN struct _EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
|
IN UINTN ProcessorIndex,
|
||||||
|
IN EFI_PERIODIC_CALLBACK PeriodicCallback);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)(
|
||||||
|
IN struct _EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
|
IN UINTN ProcessorIndex,
|
||||||
|
IN EFI_EXCEPTION_CALLBACK ExceptionCallback,
|
||||||
|
IN EFI_EXCEPTION_TYPE ExceptionType);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)(
|
||||||
|
IN struct _EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
|
IN UINTN ProcessorIndex,
|
||||||
|
IN VOID *Start,
|
||||||
|
IN UINT64 Length);
|
||||||
|
|
||||||
|
typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL {
|
||||||
|
EFI_INSTRUCTION_SET_ARCHITECTURE Isa;
|
||||||
|
EFI_GET_MAXIMUM_PROCESSOR_INDEX GetMaximumProcessorIndex;
|
||||||
|
EFI_REGISTER_PERIODIC_CALLBACK RegisterPeriodicCallback;
|
||||||
|
EFI_REGISTER_EXCEPTION_CALLBACK RegisterExceptionCallback;
|
||||||
|
EFI_INVALIDATE_INSTRUCTION_CACHE InvalidateInstructionCache;
|
||||||
|
} EFI_DEBUG_SUPPORT_PROTOCOL;
|
||||||
|
|
||||||
|
#endif
|
||||||
220
src/include/efi/efidef.h
Normal file
220
src/include/efi/efidef.h
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
#ifndef _EFI_DEF_H
|
||||||
|
#define _EFI_DEF_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efidef.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI definitions
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
typedef wchar_t CHAR16;
|
||||||
|
typedef char CHAR8;
|
||||||
|
typedef uint8_t BOOLEAN;
|
||||||
|
#ifndef CONST
|
||||||
|
#define CONST const
|
||||||
|
#endif
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE ((BOOLEAN) 1)
|
||||||
|
#define FALSE ((BOOLEAN) 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
#define NULL ((VOID *) 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef UINTN EFI_STATUS;
|
||||||
|
typedef UINT64 EFI_LBA;
|
||||||
|
typedef UINTN EFI_TPL;
|
||||||
|
typedef VOID *EFI_HANDLE;
|
||||||
|
typedef VOID *EFI_EVENT;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prototype argument decoration for EFI parameters to indicate
|
||||||
|
// their direction
|
||||||
|
//
|
||||||
|
// IN - argument is passed into the function
|
||||||
|
// OUT - argument (pointer) is returned from the function
|
||||||
|
// OPTIONAL - argument is optional
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef IN
|
||||||
|
#define IN
|
||||||
|
#define OUT
|
||||||
|
#define OPTIONAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// A GUID
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 Data1;
|
||||||
|
UINT16 Data2;
|
||||||
|
UINT16 Data3;
|
||||||
|
UINT8 Data4[8];
|
||||||
|
} EFI_GUID;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Time
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT16 Year; // 1998 - 20XX
|
||||||
|
UINT8 Month; // 1 - 12
|
||||||
|
UINT8 Day; // 1 - 31
|
||||||
|
UINT8 Hour; // 0 - 23
|
||||||
|
UINT8 Minute; // 0 - 59
|
||||||
|
UINT8 Second; // 0 - 59
|
||||||
|
UINT8 Pad1;
|
||||||
|
UINT32 Nanosecond; // 0 - 999,999,999
|
||||||
|
INT16 TimeZone; // -1440 to 1440 or 2047
|
||||||
|
UINT8 Daylight;
|
||||||
|
UINT8 Pad2;
|
||||||
|
} EFI_TIME;
|
||||||
|
|
||||||
|
// Bit definitions for EFI_TIME.Daylight
|
||||||
|
#define EFI_TIME_ADJUST_DAYLIGHT 0x01
|
||||||
|
#define EFI_TIME_IN_DAYLIGHT 0x02
|
||||||
|
|
||||||
|
// Value definition for EFI_TIME.TimeZone
|
||||||
|
#define EFI_UNSPECIFIED_TIMEZONE 0x07FF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Networking
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Addr[4];
|
||||||
|
} EFI_IPv4_ADDRESS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Addr[16];
|
||||||
|
} EFI_IPv6_ADDRESS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Addr[32];
|
||||||
|
} EFI_MAC_ADDRESS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 ReceivedQueueTimeoutValue;
|
||||||
|
UINT32 TransmitQueueTimeoutValue;
|
||||||
|
UINT16 ProtocolTypeFilter;
|
||||||
|
BOOLEAN EnableUnicastReceive;
|
||||||
|
BOOLEAN EnableMulticastReceive;
|
||||||
|
BOOLEAN EnableBroadcastReceive;
|
||||||
|
BOOLEAN EnablePromiscuousReceive;
|
||||||
|
BOOLEAN FlushQueuesOnReset;
|
||||||
|
BOOLEAN EnableReceiveTimestamps;
|
||||||
|
BOOLEAN DisableBackgroundPolling;
|
||||||
|
} EFI_MANAGED_NETWORK_CONFIG_DATA;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Memory
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef UINT64 EFI_PHYSICAL_ADDRESS;
|
||||||
|
typedef UINT64 EFI_VIRTUAL_ADDRESS;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AllocateAnyPages,
|
||||||
|
AllocateMaxAddress,
|
||||||
|
AllocateAddress,
|
||||||
|
MaxAllocateType
|
||||||
|
} EFI_ALLOCATE_TYPE;
|
||||||
|
|
||||||
|
//Preseve the attr on any range supplied.
|
||||||
|
//ConventialMemory must have WB,SR,SW when supplied.
|
||||||
|
//When allocating from ConventialMemory always make it WB,SR,SW
|
||||||
|
//When returning to ConventialMemory always make it WB,SR,SW
|
||||||
|
//When getting the memory map, or on RT for runtime types
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiReservedMemoryType,
|
||||||
|
EfiLoaderCode,
|
||||||
|
EfiLoaderData,
|
||||||
|
EfiBootServicesCode,
|
||||||
|
EfiBootServicesData,
|
||||||
|
EfiRuntimeServicesCode,
|
||||||
|
EfiRuntimeServicesData,
|
||||||
|
EfiConventionalMemory,
|
||||||
|
EfiUnusableMemory,
|
||||||
|
EfiACPIReclaimMemory,
|
||||||
|
EfiACPIMemoryNVS,
|
||||||
|
EfiMemoryMappedIO,
|
||||||
|
EfiMemoryMappedIOPortSpace,
|
||||||
|
EfiPalCode,
|
||||||
|
EfiMaxMemoryType
|
||||||
|
} EFI_MEMORY_TYPE;
|
||||||
|
|
||||||
|
// possible caching types for the memory range
|
||||||
|
#define EFI_MEMORY_UC 0x0000000000000001
|
||||||
|
#define EFI_MEMORY_WC 0x0000000000000002
|
||||||
|
#define EFI_MEMORY_WT 0x0000000000000004
|
||||||
|
#define EFI_MEMORY_WB 0x0000000000000008
|
||||||
|
#define EFI_MEMORY_UCE 0x0000000000000010
|
||||||
|
|
||||||
|
// physical memory protection on range
|
||||||
|
#define EFI_MEMORY_WP 0x0000000000001000
|
||||||
|
#define EFI_MEMORY_RP 0x0000000000002000
|
||||||
|
#define EFI_MEMORY_XP 0x0000000000004000
|
||||||
|
|
||||||
|
// range requires a runtime mapping
|
||||||
|
#define EFI_MEMORY_RUNTIME 0x8000000000000000
|
||||||
|
|
||||||
|
#define EFI_MEMORY_DESCRIPTOR_VERSION 1
|
||||||
|
typedef struct {
|
||||||
|
UINT32 Type; // Field size is 32 bits followed by 32 bit pad
|
||||||
|
UINT32 Pad;
|
||||||
|
EFI_PHYSICAL_ADDRESS PhysicalStart; // Field size is 64 bits
|
||||||
|
EFI_VIRTUAL_ADDRESS VirtualStart; // Field size is 64 bits
|
||||||
|
UINT64 NumberOfPages; // Field size is 64 bits
|
||||||
|
UINT64 Attribute; // Field size is 64 bits
|
||||||
|
} EFI_MEMORY_DESCRIPTOR;
|
||||||
|
|
||||||
|
//
|
||||||
|
// International Language
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef UINT8 ISO_639_2;
|
||||||
|
#define ISO_639_2_ENTRY_SIZE 3
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PAGE_SIZE 4096
|
||||||
|
#define EFI_PAGE_MASK 0xFFF
|
||||||
|
#define EFI_PAGE_SHIFT 12
|
||||||
|
|
||||||
|
#define EFI_SIZE_TO_PAGES(a) \
|
||||||
|
( ((a) >> EFI_PAGE_SHIFT) + ((a) & EFI_PAGE_MASK ? 1 : 0) )
|
||||||
|
|
||||||
|
#define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001
|
||||||
|
#define EFI_OS_INDICATIONS_TIMESTAMP_REVOCATION 0x0000000000000002
|
||||||
|
#define EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED \
|
||||||
|
0x0000000000000004
|
||||||
|
#define EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED \
|
||||||
|
0x0000000000000008
|
||||||
|
#define EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED \
|
||||||
|
0x0000000000000010
|
||||||
|
|
||||||
|
#endif
|
||||||
582
src/include/efi/efidevp.h
Normal file
582
src/include/efi/efidevp.h
Normal file
@@ -0,0 +1,582 @@
|
|||||||
|
#ifndef _DEVPATH_H
|
||||||
|
#define _DEVPATH_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
devpath.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Defines for parsing the EFI Device Path structures
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Device Path structures - Section C
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct _EFI_DEVICE_PATH_PROTOCOL {
|
||||||
|
UINT8 Type;
|
||||||
|
UINT8 SubType;
|
||||||
|
UINT8 Length[2];
|
||||||
|
} EFI_DEVICE_PATH_PROTOCOL;
|
||||||
|
|
||||||
|
typedef struct _EFI_DEVICE_PATH_PROTOCOL _EFI_DEVICE_PATH;
|
||||||
|
typedef EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define EFI_DP_TYPE_MASK 0x7F
|
||||||
|
#define EFI_DP_TYPE_UNPACKED 0x80
|
||||||
|
|
||||||
|
//#define END_DEVICE_PATH_TYPE 0xff
|
||||||
|
#define END_DEVICE_PATH_TYPE 0x7f
|
||||||
|
//#define END_DEVICE_PATH_TYPE_UNPACKED 0x7f
|
||||||
|
|
||||||
|
#define END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff
|
||||||
|
#define END_INSTANCE_DEVICE_PATH_SUBTYPE 0x01
|
||||||
|
#define END_DEVICE_PATH_LENGTH (sizeof(EFI_DEVICE_PATH_PROTOCOL))
|
||||||
|
|
||||||
|
|
||||||
|
#define DP_IS_END_TYPE(a)
|
||||||
|
#define DP_IS_END_SUBTYPE(a) ( ((a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
|
||||||
|
|
||||||
|
#define DevicePathType(a) ( ((a)->Type) & EFI_DP_TYPE_MASK )
|
||||||
|
#define DevicePathSubType(a) ( (a)->SubType )
|
||||||
|
#define DevicePathNodeLength(a) ( ((a)->Length[0]) | ((a)->Length[1] << 8) )
|
||||||
|
#define NextDevicePathNode(a) ( (EFI_DEVICE_PATH_PROTOCOL *) ( ((UINT8 *) (a)) + DevicePathNodeLength(a)))
|
||||||
|
//#define IsDevicePathEndType(a) ( DevicePathType(a) == END_DEVICE_PATH_TYPE_UNPACKED )
|
||||||
|
#define IsDevicePathEndType(a) ( DevicePathType(a) == END_DEVICE_PATH_TYPE )
|
||||||
|
#define IsDevicePathEndSubType(a) ( (a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
|
||||||
|
#define IsDevicePathEnd(a) ( IsDevicePathEndType(a) && IsDevicePathEndSubType(a) )
|
||||||
|
#define IsDevicePathUnpacked(a) ( (a)->Type & EFI_DP_TYPE_UNPACKED )
|
||||||
|
|
||||||
|
|
||||||
|
#define SetDevicePathNodeLength(a,l) { \
|
||||||
|
(a)->Length[0] = (UINT8) (l); \
|
||||||
|
(a)->Length[1] = (UINT8) ((l) >> 8); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SetDevicePathEndNode(a) { \
|
||||||
|
(a)->Type = END_DEVICE_PATH_TYPE; \
|
||||||
|
(a)->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE; \
|
||||||
|
(a)->Length[0] = sizeof(EFI_DEVICE_PATH_PROTOCOL); \
|
||||||
|
(a)->Length[1] = 0; \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hardware Device Path (UEFI 2.4 specification, version 2.4 § 9.3.2.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HARDWARE_DEVICE_PATH 0x01
|
||||||
|
|
||||||
|
#define HW_PCI_DP 0x01
|
||||||
|
typedef struct _PCI_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT8 Function;
|
||||||
|
UINT8 Device;
|
||||||
|
} PCI_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define HW_PCCARD_DP 0x02
|
||||||
|
typedef struct _PCCARD_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT8 FunctionNumber ;
|
||||||
|
} PCCARD_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define HW_MEMMAP_DP 0x03
|
||||||
|
typedef struct _MEMMAP_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 MemoryType;
|
||||||
|
EFI_PHYSICAL_ADDRESS StartingAddress;
|
||||||
|
EFI_PHYSICAL_ADDRESS EndingAddress;
|
||||||
|
} MEMMAP_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define HW_VENDOR_DP 0x04
|
||||||
|
typedef struct _VENDOR_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
EFI_GUID Guid;
|
||||||
|
} VENDOR_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define UNKNOWN_DEVICE_GUID \
|
||||||
|
{ 0xcf31fac5, 0xc24e, 0x11d2, {0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} }
|
||||||
|
|
||||||
|
typedef struct _UKNOWN_DEVICE_VENDOR_DP {
|
||||||
|
VENDOR_DEVICE_PATH DevicePath;
|
||||||
|
UINT8 LegacyDriveLetter;
|
||||||
|
} UNKNOWN_DEVICE_VENDOR_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define HW_CONTROLLER_DP 0x05
|
||||||
|
typedef struct _CONTROLLER_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 Controller;
|
||||||
|
} CONTROLLER_DEVICE_PATH;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ACPI Device Path (UEFI 2.4 specification, version 2.4 § 9.3.3 and 9.3.4.)
|
||||||
|
*/
|
||||||
|
#define ACPI_DEVICE_PATH 0x02
|
||||||
|
|
||||||
|
#define ACPI_DP 0x01
|
||||||
|
typedef struct _ACPI_HID_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 HID;
|
||||||
|
UINT32 UID;
|
||||||
|
} ACPI_HID_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define EXPANDED_ACPI_DP 0x02
|
||||||
|
typedef struct _EXPANDED_ACPI_HID_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 HID;
|
||||||
|
UINT32 UID;
|
||||||
|
UINT32 CID;
|
||||||
|
UINT8 HidStr[1];
|
||||||
|
} EXPANDED_ACPI_HID_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define ACPI_ADR_DP 3
|
||||||
|
typedef struct _ACPI_ADR_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header ;
|
||||||
|
UINT32 ADR ;
|
||||||
|
} ACPI_ADR_DEVICE_PATH ;
|
||||||
|
|
||||||
|
//
|
||||||
|
// EISA ID Macro
|
||||||
|
// EISA ID Definition 32-bits
|
||||||
|
// bits[15:0] - three character compressed ASCII EISA ID.
|
||||||
|
// bits[31:16] - binary number
|
||||||
|
// Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z'
|
||||||
|
//
|
||||||
|
#define PNP_EISA_ID_CONST 0x41d0
|
||||||
|
#define EISA_ID(_Name, _Num) ((UINT32) ((_Name) | (_Num) << 16))
|
||||||
|
#define EISA_PNP_ID(_PNPId) (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
|
||||||
|
|
||||||
|
#define PNP_EISA_ID_MASK 0xffff
|
||||||
|
#define EISA_ID_TO_NUM(_Id) ((_Id) >> 16)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Messaging Device Path (UEFI 2.4 specification, version 2.4 § 9.3.5.)
|
||||||
|
*/
|
||||||
|
#define MESSAGING_DEVICE_PATH 0x03
|
||||||
|
|
||||||
|
#define MSG_ATAPI_DP 0x01
|
||||||
|
typedef struct _ATAPI_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT8 PrimarySecondary;
|
||||||
|
UINT8 SlaveMaster;
|
||||||
|
UINT16 Lun;
|
||||||
|
} ATAPI_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_SCSI_DP 0x02
|
||||||
|
typedef struct _SCSI_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT16 Pun;
|
||||||
|
UINT16 Lun;
|
||||||
|
} SCSI_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_FIBRECHANNEL_DP 0x03
|
||||||
|
typedef struct _FIBRECHANNEL_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 Reserved;
|
||||||
|
UINT64 WWN;
|
||||||
|
UINT64 Lun;
|
||||||
|
} FIBRECHANNEL_DEVICE_PATH;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fibre Channel Ex SubType.
|
||||||
|
* UEFI 2.0 specification version 2.4 § 9.3.5.6.
|
||||||
|
*/
|
||||||
|
#define MSG_FIBRECHANNELEX_DP 21
|
||||||
|
typedef struct _FIBRECHANNELEX_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header ;
|
||||||
|
UINT32 Reserved ;
|
||||||
|
UINT8 WWN[ 8 ] ; /* World Wide Name */
|
||||||
|
UINT8 Lun[ 8 ] ; /* Logical unit, T-10 SCSI Architecture Model 4 specification */
|
||||||
|
} FIBRECHANNELEX_DEVICE_PATH ;
|
||||||
|
|
||||||
|
#define MSG_1394_DP 0x04
|
||||||
|
typedef struct _F1394_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 Reserved;
|
||||||
|
UINT64 Guid;
|
||||||
|
} F1394_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_USB_DP 0x05
|
||||||
|
typedef struct _USB_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT8 Port;
|
||||||
|
UINT8 Endpoint;
|
||||||
|
} USB_DEVICE_PATH;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SATA Device Path SubType.
|
||||||
|
* UEFI 2.0 specification version 2.4 § 9.3.5.6.
|
||||||
|
*/
|
||||||
|
#define MSG_SATA_DP 18
|
||||||
|
typedef struct _SATA_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header ;
|
||||||
|
UINT16 HBAPortNumber ;
|
||||||
|
UINT16 PortMultiplierPortNumber ;
|
||||||
|
UINT16 Lun ; /* Logical Unit Number */
|
||||||
|
} SATA_DEVICE_PATH ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* USB WWID Device Path SubType.
|
||||||
|
* UEFI 2.0 specification version 2.4 § 9.3.5.7.
|
||||||
|
*/
|
||||||
|
#define MSG_USB_WWID_DP 16
|
||||||
|
typedef struct _USB_WWID_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header ;
|
||||||
|
UINT16 InterfaceNumber ;
|
||||||
|
UINT16 VendorId ;
|
||||||
|
UINT16 ProductId ;
|
||||||
|
CHAR16 SerialNumber[ 1 ] ; /* UTF-16 characters of the USB serial number */
|
||||||
|
} USB_WWID_DEVICE_PATH ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Device Logical Unit SubType.
|
||||||
|
* UEFI 2.0 specification version 2.4 § 9.3.5.8.
|
||||||
|
*/
|
||||||
|
#define MSG_DEVICE_LOGICAL_UNIT_DP 17
|
||||||
|
typedef struct _DEVICE_LOGICAL_UNIT_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header ;
|
||||||
|
UINT8 Lun ; /* Logical Unit Number */
|
||||||
|
} DEVICE_LOGICAL_UNIT_DEVICE_PATH ;
|
||||||
|
|
||||||
|
#define MSG_USB_CLASS_DP 0x0F
|
||||||
|
typedef struct _USB_CLASS_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT16 VendorId;
|
||||||
|
UINT16 ProductId;
|
||||||
|
UINT8 DeviceClass;
|
||||||
|
UINT8 DeviceSubclass;
|
||||||
|
UINT8 DeviceProtocol;
|
||||||
|
} USB_CLASS_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_I2O_DP 0x06
|
||||||
|
typedef struct _I2O_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 Tid;
|
||||||
|
} I2O_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_MAC_ADDR_DP 0x0b
|
||||||
|
typedef struct _MAC_ADDR_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
EFI_MAC_ADDRESS MacAddress;
|
||||||
|
UINT8 IfType;
|
||||||
|
} MAC_ADDR_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_IPv4_DP 0x0c
|
||||||
|
typedef struct _IPv4_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
EFI_IPv4_ADDRESS LocalIpAddress;
|
||||||
|
EFI_IPv4_ADDRESS RemoteIpAddress;
|
||||||
|
UINT16 LocalPort;
|
||||||
|
UINT16 RemotePort;
|
||||||
|
UINT16 Protocol;
|
||||||
|
BOOLEAN StaticIpAddress;
|
||||||
|
/* new from UEFI version 2, code must check Length field in Header */
|
||||||
|
EFI_IPv4_ADDRESS GatewayIpAddress ;
|
||||||
|
EFI_IPv4_ADDRESS SubnetMask ;
|
||||||
|
} IPv4_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_IPv6_DP 0x0d
|
||||||
|
typedef struct _IPv6_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
EFI_IPv6_ADDRESS LocalIpAddress;
|
||||||
|
EFI_IPv6_ADDRESS RemoteIpAddress;
|
||||||
|
UINT16 LocalPort;
|
||||||
|
UINT16 RemotePort;
|
||||||
|
UINT16 Protocol;
|
||||||
|
BOOLEAN IPAddressOrigin ;
|
||||||
|
/* new from UEFI version 2, code must check Length field in Header */
|
||||||
|
UINT8 PrefixLength ;
|
||||||
|
EFI_IPv6_ADDRESS GatewayIpAddress ;
|
||||||
|
} IPv6_DEVICE_PATH;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uniform Resource Identifiers SubType.
|
||||||
|
* UEFI 2.0 specification version 2.4C § 9.3.5.23.
|
||||||
|
*/
|
||||||
|
#define MSG_URI_DP 24
|
||||||
|
typedef struct _URI_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
CHAR8 Uri[1];
|
||||||
|
} URI_DEVICE_PATH;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Device Logical Unit SubType.
|
||||||
|
* UEFI 2.0 specification version 2.4 § 9.3.5.8.
|
||||||
|
*/
|
||||||
|
#define MSG_VLAN_DP 20
|
||||||
|
typedef struct _VLAN_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header ;
|
||||||
|
UINT16 VlanId ;
|
||||||
|
} VLAN_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_INFINIBAND_DP 0x09
|
||||||
|
typedef struct _INFINIBAND_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 ResourceFlags ;
|
||||||
|
UINT64 PortGid ;
|
||||||
|
UINT64 ServiceId ;
|
||||||
|
UINT64 TargetPortId ;
|
||||||
|
UINT64 DeviceId ;
|
||||||
|
} INFINIBAND_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_UART_DP 0x0e
|
||||||
|
typedef struct _UART_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 Reserved;
|
||||||
|
UINT64 BaudRate;
|
||||||
|
UINT8 DataBits;
|
||||||
|
UINT8 Parity;
|
||||||
|
UINT8 StopBits;
|
||||||
|
} UART_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MSG_VENDOR_DP 0x0A
|
||||||
|
/* Use VENDOR_DEVICE_PATH struct */
|
||||||
|
|
||||||
|
#define EFI_PC_ANSI_GUID \
|
||||||
|
{ 0xe0c14753, 0xf9be, 0x11d2, {0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||||||
|
#define DEVICE_PATH_MESSAGING_PC_ANSI EFI_PC_ANSI_GUID
|
||||||
|
|
||||||
|
#define EFI_VT_100_GUID \
|
||||||
|
{ 0xdfa66065, 0xb419, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||||||
|
#define DEVICE_PATH_MESSAGING_VT_100 EFI_VT_100_GUID
|
||||||
|
|
||||||
|
#define EFI_VT_100_PLUS_GUID \
|
||||||
|
{ 0x7baec70b, 0x57e0, 0x4c76, {0x8e, 0x87, 0x2f, 0x9e, 0x28, 0x08, 0x83, 0x43} }
|
||||||
|
#define DEVICE_PATH_MESSAGING_VT_100_PLUS EFI_VT_100_PLUS_GUID
|
||||||
|
|
||||||
|
#define EFI_VT_UTF8_GUID \
|
||||||
|
{ 0xad15a0d6, 0x8bec, 0x4acf, {0xa0, 0x73, 0xd0, 0x1d, 0xe7, 0x7e, 0x2d, 0x88} }
|
||||||
|
#define DEVICE_PATH_MESSAGING_VT_UTF8 EFI_VT_UTF8_GUID
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Media Device Path (UEFI 2.4 specification, version 2.4 § 9.3.6.)
|
||||||
|
*/
|
||||||
|
#define MEDIA_DEVICE_PATH 0x04
|
||||||
|
|
||||||
|
#define MEDIA_HARDDRIVE_DP 0x01
|
||||||
|
typedef struct _HARDDRIVE_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 PartitionNumber;
|
||||||
|
UINT64 PartitionStart;
|
||||||
|
UINT64 PartitionSize;
|
||||||
|
UINT8 Signature[16];
|
||||||
|
UINT8 MBRType;
|
||||||
|
UINT8 SignatureType;
|
||||||
|
} HARDDRIVE_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MBR_TYPE_PCAT 0x01
|
||||||
|
#define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02
|
||||||
|
|
||||||
|
#define SIGNATURE_TYPE_MBR 0x01
|
||||||
|
#define SIGNATURE_TYPE_GUID 0x02
|
||||||
|
|
||||||
|
#define MEDIA_CDROM_DP 0x02
|
||||||
|
typedef struct _CDROM_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT32 BootEntry;
|
||||||
|
UINT64 PartitionStart;
|
||||||
|
UINT64 PartitionSize;
|
||||||
|
} CDROM_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define MEDIA_VENDOR_DP 0x03
|
||||||
|
/* Use VENDOR_DEVICE_PATH struct */
|
||||||
|
|
||||||
|
#define MEDIA_FILEPATH_DP 0x04
|
||||||
|
typedef struct _FILEPATH_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
CHAR16 PathName[1];
|
||||||
|
} FILEPATH_DEVICE_PATH;
|
||||||
|
|
||||||
|
#define SIZE_OF_FILEPATH_DEVICE_PATH EFI_FIELD_OFFSET(FILEPATH_DEVICE_PATH,PathName)
|
||||||
|
|
||||||
|
#define MEDIA_PROTOCOL_DP 0x05
|
||||||
|
typedef struct _MEDIA_PROTOCOL_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
EFI_GUID Protocol;
|
||||||
|
} MEDIA_PROTOCOL_DEVICE_PATH;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PIWG Firmware File SubType.
|
||||||
|
* UEFI 2.0 specification version 2.4 § 9.3.6.6.
|
||||||
|
*/
|
||||||
|
#define MEDIA_PIWG_FW_FILE_DP 6
|
||||||
|
typedef struct _MEDIA_FW_VOL_FILEPATH_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header ;
|
||||||
|
EFI_GUID FvFileName ;
|
||||||
|
} MEDIA_FW_VOL_FILEPATH_DEVICE_PATH ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PIWG Firmware Volume Device Path SubType.
|
||||||
|
* UEFI 2.0 specification version 2.4 § 9.3.6.7.
|
||||||
|
*/
|
||||||
|
#define MEDIA_PIWG_FW_VOL_DP 7
|
||||||
|
typedef struct _MEDIA_FW_VOL_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header ;
|
||||||
|
EFI_GUID FvName ;
|
||||||
|
} MEDIA_FW_VOL_DEVICE_PATH ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Media relative offset range device path.
|
||||||
|
* UEFI 2.0 specification version 2.4 § 9.3.6.8.
|
||||||
|
*/
|
||||||
|
#define MEDIA_RELATIVE_OFFSET_RANGE_DP 8
|
||||||
|
typedef struct _MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header ;
|
||||||
|
UINT32 Reserved ;
|
||||||
|
UINT64 StartingOffset ;
|
||||||
|
UINT64 EndingOffset ;
|
||||||
|
} MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH ;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BIOS Boot Specification Device Path (UEFI 2.4 specification, version 2.4 § 9.3.7.)
|
||||||
|
*/
|
||||||
|
#define BBS_DEVICE_PATH 0x05
|
||||||
|
|
||||||
|
#define BBS_BBS_DP 0x01
|
||||||
|
typedef struct _BBS_BBS_DEVICE_PATH {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL Header;
|
||||||
|
UINT16 DeviceType;
|
||||||
|
UINT16 StatusFlag;
|
||||||
|
CHAR8 String[1];
|
||||||
|
} BBS_BBS_DEVICE_PATH;
|
||||||
|
|
||||||
|
/* DeviceType definitions - from BBS specification */
|
||||||
|
#define BBS_TYPE_FLOPPY 0x01
|
||||||
|
#define BBS_TYPE_HARDDRIVE 0x02
|
||||||
|
#define BBS_TYPE_CDROM 0x03
|
||||||
|
#define BBS_TYPE_PCMCIA 0x04
|
||||||
|
#define BBS_TYPE_USB 0x05
|
||||||
|
#define BBS_TYPE_EMBEDDED_NETWORK 0x06
|
||||||
|
#define BBS_TYPE_DEV 0x80
|
||||||
|
#define BBS_TYPE_UNKNOWN 0xFF
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL DevPath;
|
||||||
|
PCI_DEVICE_PATH Pci;
|
||||||
|
PCCARD_DEVICE_PATH PcCard;
|
||||||
|
MEMMAP_DEVICE_PATH MemMap;
|
||||||
|
VENDOR_DEVICE_PATH Vendor;
|
||||||
|
UNKNOWN_DEVICE_VENDOR_DEVICE_PATH UnknownVendor;
|
||||||
|
CONTROLLER_DEVICE_PATH Controller;
|
||||||
|
ACPI_HID_DEVICE_PATH Acpi;
|
||||||
|
|
||||||
|
ATAPI_DEVICE_PATH Atapi;
|
||||||
|
SCSI_DEVICE_PATH Scsi;
|
||||||
|
FIBRECHANNEL_DEVICE_PATH FibreChannel;
|
||||||
|
|
||||||
|
F1394_DEVICE_PATH F1394;
|
||||||
|
USB_DEVICE_PATH Usb;
|
||||||
|
USB_CLASS_DEVICE_PATH UsbClass;
|
||||||
|
I2O_DEVICE_PATH I2O;
|
||||||
|
MAC_ADDR_DEVICE_PATH MacAddr;
|
||||||
|
IPv4_DEVICE_PATH Ipv4;
|
||||||
|
IPv6_DEVICE_PATH Ipv6;
|
||||||
|
URI_DEVICE_PATH Uri;
|
||||||
|
INFINIBAND_DEVICE_PATH InfiniBand;
|
||||||
|
UART_DEVICE_PATH Uart;
|
||||||
|
|
||||||
|
HARDDRIVE_DEVICE_PATH HardDrive;
|
||||||
|
CDROM_DEVICE_PATH CD;
|
||||||
|
|
||||||
|
FILEPATH_DEVICE_PATH FilePath;
|
||||||
|
MEDIA_PROTOCOL_DEVICE_PATH MediaProtocol;
|
||||||
|
|
||||||
|
BBS_BBS_DEVICE_PATH Bbs;
|
||||||
|
|
||||||
|
} EFI_DEV_PATH;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *DevPath;
|
||||||
|
PCI_DEVICE_PATH *Pci;
|
||||||
|
PCCARD_DEVICE_PATH *PcCard;
|
||||||
|
MEMMAP_DEVICE_PATH *MemMap;
|
||||||
|
VENDOR_DEVICE_PATH *Vendor;
|
||||||
|
UNKNOWN_DEVICE_VENDOR_DEVICE_PATH *UnknownVendor;
|
||||||
|
CONTROLLER_DEVICE_PATH *Controller;
|
||||||
|
ACPI_HID_DEVICE_PATH *Acpi;
|
||||||
|
|
||||||
|
ATAPI_DEVICE_PATH *Atapi;
|
||||||
|
SCSI_DEVICE_PATH *Scsi;
|
||||||
|
FIBRECHANNEL_DEVICE_PATH *FibreChannel;
|
||||||
|
|
||||||
|
F1394_DEVICE_PATH *F1394;
|
||||||
|
USB_DEVICE_PATH *Usb;
|
||||||
|
USB_CLASS_DEVICE_PATH *UsbClass;
|
||||||
|
I2O_DEVICE_PATH *I2O;
|
||||||
|
MAC_ADDR_DEVICE_PATH *MacAddr;
|
||||||
|
IPv4_DEVICE_PATH *Ipv4;
|
||||||
|
IPv6_DEVICE_PATH *Ipv6;
|
||||||
|
URI_DEVICE_PATH *Uri;
|
||||||
|
INFINIBAND_DEVICE_PATH *InfiniBand;
|
||||||
|
UART_DEVICE_PATH *Uart;
|
||||||
|
|
||||||
|
HARDDRIVE_DEVICE_PATH *HardDrive;
|
||||||
|
|
||||||
|
FILEPATH_DEVICE_PATH *FilePath;
|
||||||
|
MEDIA_PROTOCOL_DEVICE_PATH *MediaProtocol;
|
||||||
|
|
||||||
|
CDROM_DEVICE_PATH *CD;
|
||||||
|
BBS_BBS_DEVICE_PATH *Bbs;
|
||||||
|
|
||||||
|
} EFI_DEV_PATH_PTR;
|
||||||
|
|
||||||
|
#define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
|
||||||
|
{ 0x8b843e20, 0x8132, 0x4852, {0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c} }
|
||||||
|
|
||||||
|
typedef
|
||||||
|
CHAR16*
|
||||||
|
(EFIAPI *EFI_DEVICE_PATH_TO_TEXT_NODE) (
|
||||||
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode,
|
||||||
|
IN BOOLEAN DisplayOnly,
|
||||||
|
IN BOOLEAN AllowShortcuts
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
CHAR16*
|
||||||
|
(EFIAPI *EFI_DEVICE_PATH_TO_TEXT_PATH) (
|
||||||
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||||
|
IN BOOLEAN DisplayOnly,
|
||||||
|
IN BOOLEAN AllowShortcuts
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _EFI_DEVICE_PATH_TO_TEXT_PROTOCOL {
|
||||||
|
EFI_DEVICE_PATH_TO_TEXT_NODE ConvertDeviceNodeToText;
|
||||||
|
EFI_DEVICE_PATH_TO_TEXT_PATH ConvertDevicePathToText;
|
||||||
|
} EFI_DEVICE_PATH_TO_TEXT_PROTOCOL;
|
||||||
|
|
||||||
|
#define EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL_GUID \
|
||||||
|
{ 0x5c99a21, 0xc70f, 0x4ad2, {0x8a, 0x5f, 0x35, 0xdf, 0x33, 0x43, 0xf5, 0x1e} }
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL*
|
||||||
|
(EFIAPI *EFI_DEVICE_PATH_FROM_TEXT_NODE) (
|
||||||
|
IN CONST CHAR16 *TextDeviceNode
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL*
|
||||||
|
(EFIAPI *EFI_DEVICE_PATH_FROM_TEXT_PATH) (
|
||||||
|
IN CONST CHAR16 *TextDevicePath
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_DEVICE_PATH_FROM_TEXT_NODE ConvertTextToDeviceNode;
|
||||||
|
EFI_DEVICE_PATH_FROM_TEXT_PATH ConvertTextToDevicePath;
|
||||||
|
} EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL;
|
||||||
|
|
||||||
|
#endif
|
||||||
67
src/include/efi/efierr.h
Normal file
67
src/include/efi/efierr.h
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#ifndef _EFI_ERR_H
|
||||||
|
#define _EFI_ERR_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efierr.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI error codes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
|
||||||
|
#define EFIWARN(a) (a)
|
||||||
|
#define EFI_ERROR(a) (((INTN) a) < 0)
|
||||||
|
|
||||||
|
|
||||||
|
#define EFI_SUCCESS 0
|
||||||
|
#define EFI_LOAD_ERROR EFIERR(1)
|
||||||
|
#define EFI_INVALID_PARAMETER EFIERR(2)
|
||||||
|
#define EFI_UNSUPPORTED EFIERR(3)
|
||||||
|
#define EFI_BAD_BUFFER_SIZE EFIERR(4)
|
||||||
|
#define EFI_BUFFER_TOO_SMALL EFIERR(5)
|
||||||
|
#define EFI_NOT_READY EFIERR(6)
|
||||||
|
#define EFI_DEVICE_ERROR EFIERR(7)
|
||||||
|
#define EFI_WRITE_PROTECTED EFIERR(8)
|
||||||
|
#define EFI_OUT_OF_RESOURCES EFIERR(9)
|
||||||
|
#define EFI_VOLUME_CORRUPTED EFIERR(10)
|
||||||
|
#define EFI_VOLUME_FULL EFIERR(11)
|
||||||
|
#define EFI_NO_MEDIA EFIERR(12)
|
||||||
|
#define EFI_MEDIA_CHANGED EFIERR(13)
|
||||||
|
#define EFI_NOT_FOUND EFIERR(14)
|
||||||
|
#define EFI_ACCESS_DENIED EFIERR(15)
|
||||||
|
#define EFI_NO_RESPONSE EFIERR(16)
|
||||||
|
#define EFI_NO_MAPPING EFIERR(17)
|
||||||
|
#define EFI_TIMEOUT EFIERR(18)
|
||||||
|
#define EFI_NOT_STARTED EFIERR(19)
|
||||||
|
#define EFI_ALREADY_STARTED EFIERR(20)
|
||||||
|
#define EFI_ABORTED EFIERR(21)
|
||||||
|
#define EFI_ICMP_ERROR EFIERR(22)
|
||||||
|
#define EFI_TFTP_ERROR EFIERR(23)
|
||||||
|
#define EFI_PROTOCOL_ERROR EFIERR(24)
|
||||||
|
#define EFI_INCOMPATIBLE_VERSION EFIERR(25)
|
||||||
|
#define EFI_SECURITY_VIOLATION EFIERR(26)
|
||||||
|
#define EFI_CRC_ERROR EFIERR(27)
|
||||||
|
#define EFI_END_OF_MEDIA EFIERR(28)
|
||||||
|
#define EFI_END_OF_FILE EFIERR(31)
|
||||||
|
#define EFI_INVALID_LANGUAGE EFIERR(32)
|
||||||
|
#define EFI_COMPROMISED_DATA EFIERR(33)
|
||||||
|
|
||||||
|
#define EFI_WARN_UNKOWN_GLYPH EFIWARN(1)
|
||||||
|
#define EFI_WARN_DELETE_FAILURE EFIWARN(2)
|
||||||
|
#define EFI_WARN_WRITE_FAILURE EFIWARN(3)
|
||||||
|
#define EFI_WARN_BUFFER_TOO_SMALL EFIWARN(4)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
116
src/include/efi/efifs.h
Normal file
116
src/include/efi/efifs.h
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
#ifndef _EFI_FS_H
|
||||||
|
#define _EFI_FS_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efifs.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI File System structures
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Partition header (normaly starts in LBA 1)
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PARTITION_SIGNATURE 0x5053595320494249
|
||||||
|
#define EFI_PARTITION_REVISION 0x00010001
|
||||||
|
#define MIN_EFI_PARTITION_BLOCK_SIZE 512
|
||||||
|
#define EFI_PARTITION_LBA 1
|
||||||
|
|
||||||
|
typedef struct _EFI_PARTITION_HEADER {
|
||||||
|
EFI_TABLE_HEADER Hdr;
|
||||||
|
UINT32 DirectoryAllocationNumber;
|
||||||
|
UINT32 BlockSize;
|
||||||
|
EFI_LBA FirstUsableLba;
|
||||||
|
EFI_LBA LastUsableLba;
|
||||||
|
EFI_LBA UnusableSpace;
|
||||||
|
EFI_LBA FreeSpace;
|
||||||
|
EFI_LBA RootFile;
|
||||||
|
EFI_LBA SecutiryFile;
|
||||||
|
} EFI_PARTITION_HEADER;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// File header
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_FILE_HEADER_SIGNATURE 0x454c494620494249
|
||||||
|
#define EFI_FILE_HEADER_REVISION 0x00010000
|
||||||
|
#define EFI_FILE_STRING_SIZE 260
|
||||||
|
|
||||||
|
typedef struct _EFI_FILE_HEADER {
|
||||||
|
EFI_TABLE_HEADER Hdr;
|
||||||
|
UINT32 Class;
|
||||||
|
UINT32 LBALOffset;
|
||||||
|
EFI_LBA Parent;
|
||||||
|
UINT64 FileSize;
|
||||||
|
UINT64 FileAttributes;
|
||||||
|
EFI_TIME FileCreateTime;
|
||||||
|
EFI_TIME FileModificationTime;
|
||||||
|
EFI_GUID VendorGuid;
|
||||||
|
CHAR16 FileString[EFI_FILE_STRING_SIZE];
|
||||||
|
} EFI_FILE_HEADER;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Return the file's first LBAL which is in the same
|
||||||
|
// logical block as the file header
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_FILE_LBAL(a) ((EFI_LBAL *) (((CHAR8 *) (a)) + (a)->LBALOffset))
|
||||||
|
|
||||||
|
#define EFI_FILE_CLASS_FREE_SPACE 1
|
||||||
|
#define EFI_FILE_CLASS_EMPTY 2
|
||||||
|
#define EFI_FILE_CLASS_NORMAL 3
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Logical Block Address List - the fundemental block
|
||||||
|
// description structure
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_LBAL_SIGNATURE 0x4c41424c20494249
|
||||||
|
#define EFI_LBAL_REVISION 0x00010000
|
||||||
|
|
||||||
|
typedef struct _EFI_LBAL {
|
||||||
|
EFI_TABLE_HEADER Hdr;
|
||||||
|
UINT32 Class;
|
||||||
|
EFI_LBA Parent;
|
||||||
|
EFI_LBA Next;
|
||||||
|
UINT32 ArraySize;
|
||||||
|
UINT32 ArrayCount;
|
||||||
|
} EFI_LBAL;
|
||||||
|
|
||||||
|
// Array size
|
||||||
|
#define EFI_LBAL_ARRAY_SIZE(lbal,offs,blks) \
|
||||||
|
(((blks) - (offs) - (lbal)->Hdr.HeaderSize) / sizeof(EFI_RL))
|
||||||
|
|
||||||
|
//
|
||||||
|
// Logical Block run-length
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_LBA Start;
|
||||||
|
UINT64 Length;
|
||||||
|
} EFI_RL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Return the run-length structure from an LBAL header
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_LBAL_RL(a) ((EFI_RL*) (((CHAR8 *) (a)) + (a)->Hdr.HeaderSize))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
68
src/include/efi/efigpt.h
Normal file
68
src/include/efi/efigpt.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#ifndef _EFI_GPT_H
|
||||||
|
#define _EFI_GPT_H
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
EfiGpt.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
Include file for EFI partitioning scheme
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#define PRIMARY_PART_HEADER_LBA 1
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_TABLE_HEADER Header;
|
||||||
|
EFI_LBA MyLBA;
|
||||||
|
EFI_LBA AlternateLBA;
|
||||||
|
EFI_LBA FirstUsableLBA;
|
||||||
|
EFI_LBA LastUsableLBA;
|
||||||
|
EFI_GUID DiskGUID;
|
||||||
|
EFI_LBA PartitionEntryLBA;
|
||||||
|
UINT32 NumberOfPartitionEntries;
|
||||||
|
UINT32 SizeOfPartitionEntry;
|
||||||
|
UINT32 PartitionEntryArrayCRC32;
|
||||||
|
} EFI_PARTITION_TABLE_HEADER;
|
||||||
|
|
||||||
|
#define EFI_PTAB_HEADER_ID "EFI PART"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_GUID PartitionTypeGUID;
|
||||||
|
EFI_GUID UniquePartitionGUID;
|
||||||
|
EFI_LBA StartingLBA;
|
||||||
|
EFI_LBA EndingLBA;
|
||||||
|
UINT64 Attributes;
|
||||||
|
CHAR16 PartitionName[36];
|
||||||
|
} EFI_PARTITION_ENTRY;
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Partition Attributes
|
||||||
|
//
|
||||||
|
#define EFI_PART_USED_BY_EFI 0x0000000000000001
|
||||||
|
#define EFI_PART_REQUIRED_TO_FUNCTION 0x0000000000000002
|
||||||
|
#define EFI_PART_USED_BY_OS 0x0000000000000004
|
||||||
|
#define EFI_PART_REQUIRED_BY_OS 0x0000000000000008
|
||||||
|
#define EFI_PART_BACKUP_REQUIRED 0x0000000000000010
|
||||||
|
#define EFI_PART_USER_DATA 0x0000000000000020
|
||||||
|
#define EFI_PART_CRITICAL_USER_DATA 0x0000000000000040
|
||||||
|
#define EFI_PART_REDUNDANT_PARTITION 0x0000000000000080
|
||||||
|
|
||||||
|
#define EFI_PART_TYPE_UNUSED_GUID \
|
||||||
|
{ 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }
|
||||||
|
|
||||||
|
#define EFI_PART_TYPE_EFI_SYSTEM_PART_GUID \
|
||||||
|
{ 0xc12a7328, 0xf81f, 0x11d2, {0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} }
|
||||||
|
|
||||||
|
#define EFI_PART_TYPE_LEGACY_MBR_GUID \
|
||||||
|
{ 0x024dee41, 0x33e7, 0x11d3, {0x9d, 0x69, 0x00, 0x08, 0xc7, 0x81, 0xf3, 0x9f} }
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
459
src/include/efi/efiip.h
Normal file
459
src/include/efi/efiip.h
Normal file
@@ -0,0 +1,459 @@
|
|||||||
|
#ifndef _EFI_IP_H
|
||||||
|
#define _EFI_IP_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2013 Intel Corporation
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#define EFI_IP4_SERVICE_BINDING_PROTOCOL \
|
||||||
|
{0xc51711e7,0xb4bf,0x404a,{0xbf,0xb8,0x0a,0x04, 0x8e,0xf1,0xff,0xe4}}
|
||||||
|
|
||||||
|
#define EFI_IP4_PROTOCOL \
|
||||||
|
{0x41d94cd2,0x35b6,0x455a,{0x82,0x58,0xd4,0xe5,0x13,0x34,0xaa,0xdd}}
|
||||||
|
|
||||||
|
#define EFI_IP6_SERVICE_BINDING_PROTOCOL \
|
||||||
|
{0xec835dd3,0xfe0f,0x617b,{0xa6,0x21,0xb3,0x50,0xc3,0xe1,0x33,0x88}}
|
||||||
|
|
||||||
|
#define EFI_IP6_PROTOCOL \
|
||||||
|
{0x2c8759d5,0x5c2d,0x66ef,{0x92,0x5f,0xb6,0x6c,0x10,0x19,0x57,0xe2}}
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_IP4);
|
||||||
|
INTERFACE_DECL(_EFI_IP6);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_HANDLE InstanceHandle;
|
||||||
|
EFI_IPv4_ADDRESS Ip4Address;
|
||||||
|
EFI_IPv4_ADDRESS SubnetMask;
|
||||||
|
} EFI_IP4_ADDRESS_PAIR;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_HANDLE DriverHandle;
|
||||||
|
UINT32 AddressCount;
|
||||||
|
EFI_IP4_ADDRESS_PAIR AddressPairs[1];
|
||||||
|
} EFI_IP4_VARIABLE_DATA;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 DefaultProtocol;
|
||||||
|
BOOLEAN AcceptAnyProtocol;
|
||||||
|
BOOLEAN AcceptIcmpErrors;
|
||||||
|
BOOLEAN AcceptBroadcast;
|
||||||
|
BOOLEAN AcceptPromiscuous;
|
||||||
|
BOOLEAN UseDefaultAddress;
|
||||||
|
EFI_IPv4_ADDRESS StationAddress;
|
||||||
|
EFI_IPv4_ADDRESS SubnetMask;
|
||||||
|
UINT8 TypeOfService;
|
||||||
|
UINT8 TimeToLive;
|
||||||
|
BOOLEAN DoNotFragment;
|
||||||
|
BOOLEAN RawData;
|
||||||
|
UINT32 ReceiveTimeout;
|
||||||
|
UINT32 TransmitTimeout;
|
||||||
|
} EFI_IP4_CONFIG_DATA;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_IPv4_ADDRESS SubnetAddress;
|
||||||
|
EFI_IPv4_ADDRESS SubnetMask;
|
||||||
|
EFI_IPv4_ADDRESS GatewayAddress;
|
||||||
|
} EFI_IP4_ROUTE_TABLE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Type;
|
||||||
|
UINT8 Code;
|
||||||
|
} EFI_IP4_ICMP_TYPE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BOOLEAN IsStarted;
|
||||||
|
UINT32 MaxPacketSize;
|
||||||
|
EFI_IP4_CONFIG_DATA ConfigData;
|
||||||
|
BOOLEAN IsConfigured;
|
||||||
|
UINT32 GroupCount;
|
||||||
|
EFI_IPv4_ADDRESS *GroupTable;
|
||||||
|
UINT32 RouteCount;
|
||||||
|
EFI_IP4_ROUTE_TABLE *RouteTable;
|
||||||
|
UINT32 IcmpTypeCount;
|
||||||
|
EFI_IP4_ICMP_TYPE *IcmpTypeList;
|
||||||
|
} EFI_IP4_MODE_DATA;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP4_GET_MODE_DATA) (
|
||||||
|
IN struct _EFI_IP4 *This,
|
||||||
|
OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL,
|
||||||
|
OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
|
||||||
|
OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP4_CONFIGURE) (
|
||||||
|
IN struct _EFI_IP4 *This,
|
||||||
|
IN EFI_IP4_CONFIG_DATA *IpConfigData OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP4_GROUPS) (
|
||||||
|
IN struct _EFI_IP4 *This,
|
||||||
|
IN BOOLEAN JoinFlag,
|
||||||
|
IN EFI_IPv4_ADDRESS *GroupAddress OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP4_ROUTES) (
|
||||||
|
IN struct _EFI_IP4 *This,
|
||||||
|
IN BOOLEAN DeleteRoute,
|
||||||
|
IN EFI_IPv4_ADDRESS *SubnetAddress,
|
||||||
|
IN EFI_IPv4_ADDRESS *SubnetMask,
|
||||||
|
IN EFI_IPv4_ADDRESS *GatewayAddress
|
||||||
|
);
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
typedef struct {
|
||||||
|
UINT8 HeaderLength:4;
|
||||||
|
UINT8 Version:4;
|
||||||
|
UINT8 TypeOfService;
|
||||||
|
UINT16 TotalLength;
|
||||||
|
UINT16 Identification;
|
||||||
|
UINT16 Fragmentation;
|
||||||
|
UINT8 TimeToLive;
|
||||||
|
UINT8 Protocol;
|
||||||
|
UINT16 Checksum;
|
||||||
|
EFI_IPv4_ADDRESS SourceAddress;
|
||||||
|
EFI_IPv4_ADDRESS DestinationAddress;
|
||||||
|
} EFI_IP4_HEADER;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 FragmentLength;
|
||||||
|
VOID *FragmentBuffer;
|
||||||
|
} EFI_IP4_FRAGMENT_DATA;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_TIME TimeStamp;
|
||||||
|
EFI_EVENT RecycleSignal;
|
||||||
|
UINT32 HeaderLength;
|
||||||
|
EFI_IP4_HEADER *Header;
|
||||||
|
UINT32 OptionsLength;
|
||||||
|
VOID *Options;
|
||||||
|
UINT32 DataLength;
|
||||||
|
UINT32 FragmentCount;
|
||||||
|
EFI_IP4_FRAGMENT_DATA FragmentTable[1];
|
||||||
|
} EFI_IP4_RECEIVE_DATA;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_IPv4_ADDRESS SourceAddress;
|
||||||
|
EFI_IPv4_ADDRESS GatewayAddress;
|
||||||
|
UINT8 Protocol;
|
||||||
|
UINT8 TypeOfService;
|
||||||
|
UINT8 TimeToLive;
|
||||||
|
BOOLEAN DoNotFragment;
|
||||||
|
} EFI_IP4_OVERRIDE_DATA;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_IPv4_ADDRESS DestinationAddress;
|
||||||
|
EFI_IP4_OVERRIDE_DATA *OverrideData;
|
||||||
|
UINT32 OptionsLength;
|
||||||
|
VOID *OptionsBuffer;
|
||||||
|
UINT32 TotalDataLength;
|
||||||
|
UINT32 FragmentCount;
|
||||||
|
EFI_IP4_FRAGMENT_DATA FragmentTable[1];
|
||||||
|
} EFI_IP4_TRANSMIT_DATA;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_EVENT Event;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
union {
|
||||||
|
EFI_IP4_RECEIVE_DATA *RxData;
|
||||||
|
EFI_IP4_TRANSMIT_DATA *TxData;
|
||||||
|
} Packet;
|
||||||
|
} EFI_IP4_COMPLETION_TOKEN;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP4_TRANSMIT) (
|
||||||
|
IN struct _EFI_IP4 *This,
|
||||||
|
IN EFI_IP4_COMPLETION_TOKEN *Token
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP4_RECEIVE) (
|
||||||
|
IN struct _EFI_IP4 *This,
|
||||||
|
IN EFI_IP4_COMPLETION_TOKEN *Token
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP4_CANCEL)(
|
||||||
|
IN struct _EFI_IP4 *This,
|
||||||
|
IN EFI_IP4_COMPLETION_TOKEN *Token OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP4_POLL) (
|
||||||
|
IN struct _EFI_IP4 *This
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _EFI_IP4 {
|
||||||
|
EFI_IP4_GET_MODE_DATA GetModeData;
|
||||||
|
EFI_IP4_CONFIGURE Configure;
|
||||||
|
EFI_IP4_GROUPS Groups;
|
||||||
|
EFI_IP4_ROUTES Routes;
|
||||||
|
EFI_IP4_TRANSMIT Transmit;
|
||||||
|
EFI_IP4_RECEIVE Receive;
|
||||||
|
EFI_IP4_CANCEL Cancel;
|
||||||
|
EFI_IP4_POLL Poll;
|
||||||
|
} EFI_IP4;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 DefaultProtocol;
|
||||||
|
BOOLEAN AcceptAnyProtocol;
|
||||||
|
BOOLEAN AcceptIcmpErrors;
|
||||||
|
BOOLEAN AcceptPromiscuous;
|
||||||
|
EFI_IPv6_ADDRESS DestinationAddress;
|
||||||
|
EFI_IPv6_ADDRESS StationAddress;
|
||||||
|
UINT8 TrafficClass;
|
||||||
|
UINT8 HopLimit;
|
||||||
|
UINT32 FlowLabel;
|
||||||
|
UINT32 ReceiveTimeout;
|
||||||
|
UINT32 TransmitTimeout;
|
||||||
|
} EFI_IP6_CONFIG_DATA;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_IPv6_ADDRESS Address;
|
||||||
|
UINT8 PrefixLength;
|
||||||
|
} EFI_IP6_ADDRESS_INFO;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_IPv6_ADDRESS Gateway;
|
||||||
|
EFI_IPv6_ADDRESS Destination;
|
||||||
|
UINT8 PrefixLength;
|
||||||
|
} EFI_IP6_ROUTE_TABLE;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiNeighborInComplete,
|
||||||
|
EfiNeighborReachable,
|
||||||
|
EfiNeighborStale,
|
||||||
|
EfiNeighborDelay,
|
||||||
|
EfiNeighborProbe
|
||||||
|
} EFI_IP6_NEIGHBOR_STATE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_IPv6_ADDRESS Neighbor;
|
||||||
|
EFI_MAC_ADDRESS LinkAddress;
|
||||||
|
EFI_IP6_NEIGHBOR_STATE State;
|
||||||
|
} EFI_IP6_NEIGHBOR_CACHE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Type;
|
||||||
|
UINT8 Code;
|
||||||
|
} EFI_IP6_ICMP_TYPE;
|
||||||
|
|
||||||
|
//***********************************************************
|
||||||
|
// ICMPv6 type definitions for error messages
|
||||||
|
//***********************************************************
|
||||||
|
#define ICMP_V6_DEST_UNREACHABLE 0x1
|
||||||
|
#define ICMP_V6_PACKET_TOO_BIG 0x2
|
||||||
|
#define ICMP_V6_TIME_EXCEEDED 0x3
|
||||||
|
#define ICMP_V6_PARAMETER_PROBLEM 0x4
|
||||||
|
|
||||||
|
//***********************************************************
|
||||||
|
// ICMPv6 type definition for informational messages
|
||||||
|
//***********************************************************
|
||||||
|
#define ICMP_V6_ECHO_REQUEST 0x80
|
||||||
|
#define ICMP_V6_ECHO_REPLY 0x81
|
||||||
|
#define ICMP_V6_LISTENER_QUERY 0x82
|
||||||
|
#define ICMP_V6_LISTENER_REPORT 0x83
|
||||||
|
#define ICMP_V6_LISTENER_DONE 0x84
|
||||||
|
#define ICMP_V6_ROUTER_SOLICIT 0x85
|
||||||
|
#define ICMP_V6_ROUTER_ADVERTISE 0x86
|
||||||
|
#define ICMP_V6_NEIGHBOR_SOLICIT 0x87
|
||||||
|
#define ICMP_V6_NEIGHBOR_ADVERTISE 0x88
|
||||||
|
#define ICMP_V6_REDIRECT 0x89
|
||||||
|
#define ICMP_V6_LISTENER_REPORT_2 0x8F
|
||||||
|
|
||||||
|
//***********************************************************
|
||||||
|
// ICMPv6 code definitions for ICMP_V6_DEST_UNREACHABLE
|
||||||
|
//***********************************************************
|
||||||
|
#define ICMP_V6_NO_ROUTE_TO_DEST 0x0
|
||||||
|
#define ICMP_V6_COMM_PROHIBITED 0x1
|
||||||
|
#define ICMP_V6_BEYOND_SCOPE 0x2
|
||||||
|
#define ICMP_V6_ADDR_UNREACHABLE 0x3
|
||||||
|
#define ICMP_V6_PORT_UNREACHABLE 0x4
|
||||||
|
#define ICMP_V6_SOURCE_ADDR_FAILED 0x5
|
||||||
|
#define ICMP_V6_ROUTE_REJECTED 0x6
|
||||||
|
|
||||||
|
//***********************************************************
|
||||||
|
// ICMPv6 code definitions for ICMP_V6_TIME_EXCEEDED
|
||||||
|
//***********************************************************
|
||||||
|
#define ICMP_V6_TIMEOUT_HOP_LIMIT 0x0
|
||||||
|
#define ICMP_V6_TIMEOUT_REASSEMBLE 0x1
|
||||||
|
|
||||||
|
//***********************************************************
|
||||||
|
// ICMPv6 code definitions for ICMP_V6_PARAMETER_PROBLEM
|
||||||
|
//***********************************************************
|
||||||
|
#define ICMP_V6_ERRONEOUS_HEADER 0x0
|
||||||
|
#define ICMP_V6_UNRECOGNIZE_NEXT_HDR 0x1
|
||||||
|
#define ICMP_V6_UNRECOGNIZE_OPTION 0x2
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BOOLEAN IsStarted;
|
||||||
|
UINT32 MaxPacketSize;
|
||||||
|
EFI_IP6_CONFIG_DATA ConfigData;
|
||||||
|
BOOLEAN IsConfigured;
|
||||||
|
UINT32 AddressCount;
|
||||||
|
EFI_IP6_ADDRESS_INFO *AddressList;
|
||||||
|
UINT32 GroupCount;
|
||||||
|
EFI_IPv6_ADDRESS *GroupTable;
|
||||||
|
UINT32 RouteCount;
|
||||||
|
EFI_IP6_ROUTE_TABLE *RouteTable;
|
||||||
|
UINT32 NeighborCount;
|
||||||
|
EFI_IP6_NEIGHBOR_CACHE *NeighborCache;
|
||||||
|
UINT32 PrefixCount;
|
||||||
|
EFI_IP6_ADDRESS_INFO *PrefixTable;
|
||||||
|
UINT32 IcmpTypeCount;
|
||||||
|
EFI_IP6_ICMP_TYPE *IcmpTypeList;
|
||||||
|
} EFI_IP6_MODE_DATA;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP6_GET_MODE_DATA) (
|
||||||
|
IN struct _EFI_IP6 *This,
|
||||||
|
OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL,
|
||||||
|
OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
|
||||||
|
OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP6_CONFIGURE) (
|
||||||
|
IN struct _EFI_IP6 *This,
|
||||||
|
IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL
|
||||||
|
);
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP6_GROUPS) (
|
||||||
|
IN struct _EFI_IP6 *This,
|
||||||
|
IN BOOLEAN JoinFlag,
|
||||||
|
IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP6_ROUTES) (
|
||||||
|
IN struct _EFI_IP6 *This,
|
||||||
|
IN BOOLEAN DeleteRoute,
|
||||||
|
IN EFI_IPv6_ADDRESS *Destination OPTIONAL,
|
||||||
|
IN UINT8 PrefixLength,
|
||||||
|
IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP6_NEIGHBORS) (
|
||||||
|
IN struct _EFI_IP6 *This,
|
||||||
|
IN BOOLEAN DeleteFlag,
|
||||||
|
IN EFI_IPv6_ADDRESS *TargetIp6Address,
|
||||||
|
IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,
|
||||||
|
IN UINT32 Timeout,
|
||||||
|
IN BOOLEAN Override
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _EFI_IP6_FRAGMENT_DATA {
|
||||||
|
UINT32 FragmentLength;
|
||||||
|
VOID *FragmentBuffer;
|
||||||
|
} EFI_IP6_FRAGMENT_DATA;
|
||||||
|
|
||||||
|
typedef struct _EFI_IP6_OVERRIDE_DATA {
|
||||||
|
UINT8 Protocol;
|
||||||
|
UINT8 HopLimit;
|
||||||
|
UINT32 FlowLabel;
|
||||||
|
} EFI_IP6_OVERRIDE_DATA;
|
||||||
|
|
||||||
|
typedef struct _EFI_IP6_TRANSMIT_DATA {
|
||||||
|
EFI_IPv6_ADDRESS DestinationAddress;
|
||||||
|
EFI_IP6_OVERRIDE_DATA *OverrideData;
|
||||||
|
UINT32 ExtHdrsLength;
|
||||||
|
VOID *ExtHdrs;
|
||||||
|
UINT8 NextHeader;
|
||||||
|
UINT32 DataLength;
|
||||||
|
UINT32 FragmentCount;
|
||||||
|
EFI_IP6_FRAGMENT_DATA FragmentTable[1];
|
||||||
|
} EFI_IP6_TRANSMIT_DATA;
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
typedef struct _EFI_IP6_HEADER {
|
||||||
|
UINT8 TrafficClassH:4;
|
||||||
|
UINT8 Version:4;
|
||||||
|
UINT8 FlowLabelH:4;
|
||||||
|
UINT8 TrafficClassL:4;
|
||||||
|
UINT16 FlowLabelL;
|
||||||
|
UINT16 PayloadLength;
|
||||||
|
UINT8 NextHeader;
|
||||||
|
UINT8 HopLimit;
|
||||||
|
EFI_IPv6_ADDRESS SourceAddress;
|
||||||
|
EFI_IPv6_ADDRESS DestinationAddress;
|
||||||
|
} EFI_IP6_HEADER;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
typedef struct _EFI_IP6_RECEIVE_DATA {
|
||||||
|
EFI_TIME TimeStamp;
|
||||||
|
EFI_EVENT RecycleSignal;
|
||||||
|
UINT32 HeaderLength;
|
||||||
|
EFI_IP6_HEADER *Header;
|
||||||
|
UINT32 DataLength;
|
||||||
|
UINT32 FragmentCount;
|
||||||
|
EFI_IP6_FRAGMENT_DATA FragmentTable[1];
|
||||||
|
} EFI_IP6_RECEIVE_DATA;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_EVENT Event;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
union {
|
||||||
|
EFI_IP6_RECEIVE_DATA *RxData;
|
||||||
|
EFI_IP6_TRANSMIT_DATA *TxData;
|
||||||
|
} Packet;
|
||||||
|
} EFI_IP6_COMPLETION_TOKEN;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP6_TRANSMIT) (
|
||||||
|
IN struct _EFI_IP6 *This,
|
||||||
|
IN EFI_IP6_COMPLETION_TOKEN *Token
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP6_RECEIVE) (
|
||||||
|
IN struct _EFI_IP6 *This,
|
||||||
|
IN EFI_IP6_COMPLETION_TOKEN *Token
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP6_CANCEL)(
|
||||||
|
IN struct _EFI_IP6 *This,
|
||||||
|
IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_IP6_POLL) (
|
||||||
|
IN struct _EFI_IP6 *This
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _EFI_IP6 {
|
||||||
|
EFI_IP6_GET_MODE_DATA GetModeData;
|
||||||
|
EFI_IP6_CONFIGURE Configure;
|
||||||
|
EFI_IP6_GROUPS Groups;
|
||||||
|
EFI_IP6_ROUTES Routes;
|
||||||
|
EFI_IP6_NEIGHBORS Neighbors;
|
||||||
|
EFI_IP6_TRANSMIT Transmit;
|
||||||
|
EFI_IP6_RECEIVE Receive;
|
||||||
|
EFI_IP6_CANCEL Cancel;
|
||||||
|
EFI_IP6_POLL Poll;
|
||||||
|
} EFI_IP6;
|
||||||
|
|
||||||
|
#endif /* _EFI_IP_H */
|
||||||
1036
src/include/efi/efilib.h
Normal file
1036
src/include/efi/efilib.h
Normal file
File diff suppressed because it is too large
Load Diff
177
src/include/efi/efilink.h
Normal file
177
src/include/efi/efilink.h
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
#ifndef _EFI_LINK_H
|
||||||
|
#define _EFI_LINK_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
link.h (renamed efilink.h to avoid conflicts)
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI link list macro's
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#ifndef EFI_NT_EMUL
|
||||||
|
|
||||||
|
//
|
||||||
|
// List entry - doubly linked list
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct _LIST_ENTRY {
|
||||||
|
struct _LIST_ENTRY *Flink;
|
||||||
|
struct _LIST_ENTRY *Blink;
|
||||||
|
} LIST_ENTRY;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// VOID
|
||||||
|
// InitializeListHead(
|
||||||
|
// LIST_ENTRY *ListHead
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
|
||||||
|
#define InitializeListHead(ListHead) \
|
||||||
|
(ListHead)->Flink = ListHead; \
|
||||||
|
(ListHead)->Blink = ListHead;
|
||||||
|
|
||||||
|
//
|
||||||
|
// BOOLEAN
|
||||||
|
// IsListEmpty(
|
||||||
|
// PLIST_ENTRY ListHead
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
|
||||||
|
#define IsListEmpty(ListHead) \
|
||||||
|
((ListHead)->Flink == (ListHead))
|
||||||
|
|
||||||
|
//
|
||||||
|
// VOID
|
||||||
|
// RemoveEntryList(
|
||||||
|
// PLIST_ENTRY Entry
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
|
||||||
|
#define _RemoveEntryList(Entry) { \
|
||||||
|
LIST_ENTRY *_Blink, *_Flink; \
|
||||||
|
_Flink = (Entry)->Flink; \
|
||||||
|
_Blink = (Entry)->Blink; \
|
||||||
|
_Blink->Flink = _Flink; \
|
||||||
|
_Flink->Blink = _Blink; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#if EFI_DEBUG
|
||||||
|
#define RemoveEntryList(Entry) \
|
||||||
|
_RemoveEntryList(Entry); \
|
||||||
|
(Entry)->Flink = (LIST_ENTRY *) BAD_POINTER; \
|
||||||
|
(Entry)->Blink = (LIST_ENTRY *) BAD_POINTER;
|
||||||
|
#else
|
||||||
|
#define RemoveEntryList(Entry) \
|
||||||
|
_RemoveEntryList(Entry);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// VOID
|
||||||
|
// InsertTailList(
|
||||||
|
// PLIST_ENTRY ListHead,
|
||||||
|
// PLIST_ENTRY Entry
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
|
||||||
|
#define InsertTailList(ListHead,Entry) {\
|
||||||
|
LIST_ENTRY *_ListHead, *_Blink; \
|
||||||
|
_ListHead = (ListHead); \
|
||||||
|
_Blink = _ListHead->Blink; \
|
||||||
|
(Entry)->Flink = _ListHead; \
|
||||||
|
(Entry)->Blink = _Blink; \
|
||||||
|
_Blink->Flink = (Entry); \
|
||||||
|
_ListHead->Blink = (Entry); \
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// VOID
|
||||||
|
// InsertHeadList(
|
||||||
|
// PLIST_ENTRY ListHead,
|
||||||
|
// PLIST_ENTRY Entry
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
|
||||||
|
#define InsertHeadList(ListHead,Entry) {\
|
||||||
|
LIST_ENTRY *_ListHead, *_Flink; \
|
||||||
|
_ListHead = (ListHead); \
|
||||||
|
_Flink = _ListHead->Flink; \
|
||||||
|
(Entry)->Flink = _Flink; \
|
||||||
|
(Entry)->Blink = _ListHead; \
|
||||||
|
_Flink->Blink = (Entry); \
|
||||||
|
_ListHead->Flink = (Entry); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// VOID
|
||||||
|
// SwapListEntries(
|
||||||
|
// PLIST_ENTRY Entry1,
|
||||||
|
// PLIST_ENTRY Entry2
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// Put Entry2 before Entry1
|
||||||
|
//
|
||||||
|
#define SwapListEntries(Entry1,Entry2) {\
|
||||||
|
LIST_ENTRY *Entry1Flink, *Entry1Blink; \
|
||||||
|
LIST_ENTRY *Entry2Flink, *Entry2Blink; \
|
||||||
|
Entry2Flink = (Entry2)->Flink; \
|
||||||
|
Entry2Blink = (Entry2)->Blink; \
|
||||||
|
Entry1Flink = (Entry1)->Flink; \
|
||||||
|
Entry1Blink = (Entry1)->Blink; \
|
||||||
|
Entry2Blink->Flink = Entry2Flink; \
|
||||||
|
Entry2Flink->Blink = Entry2Blink; \
|
||||||
|
(Entry2)->Flink = Entry1; \
|
||||||
|
(Entry2)->Blink = Entry1Blink; \
|
||||||
|
Entry1Blink->Flink = (Entry2); \
|
||||||
|
(Entry1)->Blink = (Entry2); \
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI_FIELD_OFFSET - returns the byte offset to a field within a structure
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(intptr_t)(&(((TYPE *) 0)->Field)))
|
||||||
|
|
||||||
|
//
|
||||||
|
// CONTAINING_RECORD - returns a pointer to the structure
|
||||||
|
// from one of it's elements.
|
||||||
|
//
|
||||||
|
|
||||||
|
#define _CR(Record, TYPE, Field) \
|
||||||
|
((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
|
||||||
|
|
||||||
|
#if EFI_DEBUG
|
||||||
|
#define CR(Record, TYPE, Field, Sig) \
|
||||||
|
_CR(Record, TYPE, Field)->Signature != Sig ? \
|
||||||
|
(TYPE *) ASSERT_STRUCT(_CR(Record, TYPE, Field), Record) : \
|
||||||
|
_CR(Record, TYPE, Field)
|
||||||
|
#else
|
||||||
|
#define CR(Record, TYPE, Field, Signature) \
|
||||||
|
_CR(Record, TYPE, Field)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// A lock structure
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct _FLOCK {
|
||||||
|
EFI_TPL Tpl;
|
||||||
|
EFI_TPL OwnerTpl;
|
||||||
|
UINTN Lock;
|
||||||
|
} FLOCK;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
348
src/include/efi/efinet.h
Normal file
348
src/include/efi/efinet.h
Normal file
@@ -0,0 +1,348 @@
|
|||||||
|
#ifndef _EFINET_H
|
||||||
|
#define _EFINET_H
|
||||||
|
|
||||||
|
|
||||||
|
/*++
|
||||||
|
Copyright (c) 1999 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
efinet.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
EFI Simple Network protocol
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
--*/
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Simple Network Protocol
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_SIMPLE_NETWORK_PROTOCOL_GUID \
|
||||||
|
{ 0xA19832B9, 0xAC25, 0x11D3, {0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} }
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_SIMPLE_NETWORK_PROTOCOL);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
//
|
||||||
|
// Total number of frames received. Includes frames with errors and
|
||||||
|
// dropped frames.
|
||||||
|
//
|
||||||
|
UINT64 RxTotalFrames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Number of valid frames received and copied into receive buffers.
|
||||||
|
//
|
||||||
|
UINT64 RxGoodFrames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Number of frames below the minimum length for the media.
|
||||||
|
// This would be <64 for ethernet.
|
||||||
|
//
|
||||||
|
UINT64 RxUndersizeFrames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Number of frames longer than the maxminum length for the
|
||||||
|
// media. This would be >1500 for ethernet.
|
||||||
|
//
|
||||||
|
UINT64 RxOversizeFrames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Valid frames that were dropped because receive buffers were full.
|
||||||
|
//
|
||||||
|
UINT64 RxDroppedFrames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Number of valid unicast frames received and not dropped.
|
||||||
|
//
|
||||||
|
UINT64 RxUnicastFrames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Number of valid broadcast frames received and not dropped.
|
||||||
|
//
|
||||||
|
UINT64 RxBroadcastFrames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Number of valid mutlicast frames received and not dropped.
|
||||||
|
//
|
||||||
|
UINT64 RxMulticastFrames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Number of frames w/ CRC or alignment errors.
|
||||||
|
//
|
||||||
|
UINT64 RxCrcErrorFrames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Total number of bytes received. Includes frames with errors
|
||||||
|
// and dropped frames.
|
||||||
|
//
|
||||||
|
UINT64 RxTotalBytes;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Transmit statistics.
|
||||||
|
//
|
||||||
|
UINT64 TxTotalFrames;
|
||||||
|
UINT64 TxGoodFrames;
|
||||||
|
UINT64 TxUndersizeFrames;
|
||||||
|
UINT64 TxOversizeFrames;
|
||||||
|
UINT64 TxDroppedFrames;
|
||||||
|
UINT64 TxUnicastFrames;
|
||||||
|
UINT64 TxBroadcastFrames;
|
||||||
|
UINT64 TxMulticastFrames;
|
||||||
|
UINT64 TxCrcErrorFrames;
|
||||||
|
UINT64 TxTotalBytes;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Number of collisions detection on this subnet.
|
||||||
|
//
|
||||||
|
UINT64 Collisions;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Number of frames destined for unsupported protocol.
|
||||||
|
//
|
||||||
|
UINT64 UnsupportedProtocol;
|
||||||
|
|
||||||
|
} EFI_NETWORK_STATISTICS;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiSimpleNetworkStopped,
|
||||||
|
EfiSimpleNetworkStarted,
|
||||||
|
EfiSimpleNetworkInitialized,
|
||||||
|
EfiSimpleNetworkMaxState
|
||||||
|
} EFI_SIMPLE_NETWORK_STATE;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST 0x01
|
||||||
|
#define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST 0x02
|
||||||
|
#define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST 0x04
|
||||||
|
#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS 0x08
|
||||||
|
#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT 0x01
|
||||||
|
#define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT 0x02
|
||||||
|
#define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT 0x04
|
||||||
|
#define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT 0x08
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
#define MAX_MCAST_FILTER_CNT 16
|
||||||
|
typedef struct {
|
||||||
|
UINT32 State;
|
||||||
|
UINT32 HwAddressSize;
|
||||||
|
UINT32 MediaHeaderSize;
|
||||||
|
UINT32 MaxPacketSize;
|
||||||
|
UINT32 NvRamSize;
|
||||||
|
UINT32 NvRamAccessSize;
|
||||||
|
UINT32 ReceiveFilterMask;
|
||||||
|
UINT32 ReceiveFilterSetting;
|
||||||
|
UINT32 MaxMCastFilterCount;
|
||||||
|
UINT32 MCastFilterCount;
|
||||||
|
EFI_MAC_ADDRESS MCastFilter[MAX_MCAST_FILTER_CNT];
|
||||||
|
EFI_MAC_ADDRESS CurrentAddress;
|
||||||
|
EFI_MAC_ADDRESS BroadcastAddress;
|
||||||
|
EFI_MAC_ADDRESS PermanentAddress;
|
||||||
|
UINT8 IfType;
|
||||||
|
BOOLEAN MacAddressChangeable;
|
||||||
|
BOOLEAN MultipleTxSupported;
|
||||||
|
BOOLEAN MediaPresentSupported;
|
||||||
|
BOOLEAN MediaPresent;
|
||||||
|
} EFI_SIMPLE_NETWORK_MODE;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_START) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_STOP) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_INITIALIZE) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
IN UINTN ExtraRxBufferSize OPTIONAL,
|
||||||
|
IN UINTN ExtraTxBufferSize OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_RESET) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
IN BOOLEAN ExtendedVerification
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_SHUTDOWN) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_RECEIVE_FILTERS) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
IN UINT32 Enable,
|
||||||
|
IN UINT32 Disable,
|
||||||
|
IN BOOLEAN ResetMCastFilter,
|
||||||
|
IN UINTN MCastFilterCnt OPTIONAL,
|
||||||
|
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_STATION_ADDRESS) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
IN BOOLEAN Reset,
|
||||||
|
IN EFI_MAC_ADDRESS *New OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_STATISTICS) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
IN BOOLEAN Reset,
|
||||||
|
IN OUT UINTN *StatisticsSize OPTIONAL,
|
||||||
|
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
IN BOOLEAN IPv6,
|
||||||
|
IN EFI_IP_ADDRESS *IP,
|
||||||
|
OUT EFI_MAC_ADDRESS *MAC
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_NVDATA) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
IN BOOLEAN ReadWrite,
|
||||||
|
IN UINTN Offset,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
IN OUT VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_GET_STATUS) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
OUT UINT32 *InterruptStatus OPTIONAL,
|
||||||
|
OUT VOID **TxBuf OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_TRANSMIT) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
IN UINTN HeaderSize,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
IN VOID *Buffer,
|
||||||
|
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
|
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
|
IN UINT16 *Protocol OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_NETWORK_RECEIVE) (
|
||||||
|
IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This,
|
||||||
|
OUT UINTN *HeaderSize OPTIONAL,
|
||||||
|
IN OUT UINTN *BufferSize,
|
||||||
|
OUT VOID *Buffer,
|
||||||
|
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
|
||||||
|
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
|
||||||
|
OUT UINT16 *Protocol OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION 0x00010000
|
||||||
|
#define EFI_SIMPLE_NETWORK_INTERFACE_REVISION EFI_SIMPLE_NETWORK_PROTOCOL_REVISION
|
||||||
|
|
||||||
|
typedef struct _EFI_SIMPLE_NETWORK_PROTOCOL {
|
||||||
|
UINT64 Revision;
|
||||||
|
EFI_SIMPLE_NETWORK_START Start;
|
||||||
|
EFI_SIMPLE_NETWORK_STOP Stop;
|
||||||
|
EFI_SIMPLE_NETWORK_INITIALIZE Initialize;
|
||||||
|
EFI_SIMPLE_NETWORK_RESET Reset;
|
||||||
|
EFI_SIMPLE_NETWORK_SHUTDOWN Shutdown;
|
||||||
|
EFI_SIMPLE_NETWORK_RECEIVE_FILTERS ReceiveFilters;
|
||||||
|
EFI_SIMPLE_NETWORK_STATION_ADDRESS StationAddress;
|
||||||
|
EFI_SIMPLE_NETWORK_STATISTICS Statistics;
|
||||||
|
EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC MCastIpToMac;
|
||||||
|
EFI_SIMPLE_NETWORK_NVDATA NvData;
|
||||||
|
EFI_SIMPLE_NETWORK_GET_STATUS GetStatus;
|
||||||
|
EFI_SIMPLE_NETWORK_TRANSMIT Transmit;
|
||||||
|
EFI_SIMPLE_NETWORK_RECEIVE Receive;
|
||||||
|
EFI_EVENT WaitForPacket;
|
||||||
|
EFI_SIMPLE_NETWORK_MODE *Mode;
|
||||||
|
} EFI_SIMPLE_NETWORK_PROTOCOL;
|
||||||
|
|
||||||
|
// Note: Because it conflicted with the EDK2 struct name, the
|
||||||
|
// 'EFI_SIMPLE_NETWORK_PROTOCOL' GUID definition, from older
|
||||||
|
// versions of gnu-efi, is now obsoleted.
|
||||||
|
// Use 'EFI_SIMPLE_NETWORK_PROTOCOL_GUID' instead.
|
||||||
|
|
||||||
|
typedef struct _EFI_SIMPLE_NETWORK_PROTOCOL _EFI_SIMPLE_NETWORK;
|
||||||
|
typedef EFI_SIMPLE_NETWORK_PROTOCOL EFI_SIMPLE_NETWORK;
|
||||||
|
|
||||||
|
#endif /* _EFINET_H */
|
||||||
61
src/include/efi/efipart.h
Normal file
61
src/include/efi/efipart.h
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
#ifndef _EFI_PART_H
|
||||||
|
#define _EFI_PART_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efipart.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
Info about disk partitions and Master Boot Records
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PARTITION 0xef
|
||||||
|
#define MBR_SIZE 512
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 BootIndicator;
|
||||||
|
UINT8 StartHead;
|
||||||
|
UINT8 StartSector;
|
||||||
|
UINT8 StartTrack;
|
||||||
|
UINT8 OSIndicator;
|
||||||
|
UINT8 EndHead;
|
||||||
|
UINT8 EndSector;
|
||||||
|
UINT8 EndTrack;
|
||||||
|
UINT8 StartingLBA[4];
|
||||||
|
UINT8 SizeInLBA[4];
|
||||||
|
} MBR_PARTITION_RECORD;
|
||||||
|
|
||||||
|
#define EXTRACT_UINT32(D) (UINT32)(D[0] | (D[1] << 8) | (D[2] << 16) | (D[3] << 24))
|
||||||
|
|
||||||
|
#define MBR_SIGNATURE 0xaa55
|
||||||
|
#define MIN_MBR_DEVICE_SIZE 0x80000
|
||||||
|
#define MBR_ERRATA_PAD 0x40000 // 128 MB
|
||||||
|
|
||||||
|
#define MAX_MBR_PARTITIONS 4
|
||||||
|
typedef struct {
|
||||||
|
UINT8 BootStrapCode[440];
|
||||||
|
UINT8 UniqueMbrSignature[4];
|
||||||
|
UINT8 Unknown[2];
|
||||||
|
MBR_PARTITION_RECORD Partition[MAX_MBR_PARTITIONS];
|
||||||
|
UINT16 Signature;
|
||||||
|
} MASTER_BOOT_RECORD;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
399
src/include/efi/efipciio.h
Normal file
399
src/include/efi/efipciio.h
Normal file
@@ -0,0 +1,399 @@
|
|||||||
|
#ifndef _EFI_PCI_IO_H
|
||||||
|
#define _EFI_PCI_IO_H
|
||||||
|
|
||||||
|
#define EFI_PCI_IO_PROTOCOL_GUID \
|
||||||
|
{ 0x4cf5b200, 0x68b8, 0x4ca5, {0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a} }
|
||||||
|
|
||||||
|
#define EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID \
|
||||||
|
{ 0x2f707ebb, 0x4a1a, 0x11d4, {0x9a, 0x38, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_PCI_IO_PROTOCOL);
|
||||||
|
INTERFACE_DECL(_EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiPciIoWidthUint8,
|
||||||
|
EfiPciIoWidthUint16,
|
||||||
|
EfiPciIoWidthUint32,
|
||||||
|
EfiPciIoWidthUint64,
|
||||||
|
EfiPciIoWidthFifoUint8,
|
||||||
|
EfiPciIoWidthFifoUint16,
|
||||||
|
EfiPciIoWidthFifoUint32,
|
||||||
|
EfiPciIoWidthFifoUint64,
|
||||||
|
EfiPciIoWidthFillUint8,
|
||||||
|
EfiPciIoWidthFillUint16,
|
||||||
|
EfiPciIoWidthFillUint32,
|
||||||
|
EfiPciIoWidthFillUint64,
|
||||||
|
EfiPciIoWidthMaximum
|
||||||
|
} EFI_PCI_IO_PROTOCOL_WIDTH, EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH;
|
||||||
|
|
||||||
|
#define EFI_PCI_IO_PASS_THROUGH_BAR 0xff
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_POLL_IO_MEM) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
|
||||||
|
IN UINT8 BarIndex,
|
||||||
|
IN UINT64 Offset,
|
||||||
|
IN UINT64 Mask,
|
||||||
|
IN UINT64 Value,
|
||||||
|
IN UINT64 Delay,
|
||||||
|
OUT UINT64 *Result
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_POLL_IO_MEM) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
|
||||||
|
IN UINT64 Address,
|
||||||
|
IN UINT64 Mask,
|
||||||
|
IN UINT64 Value,
|
||||||
|
IN UINT64 Delay,
|
||||||
|
OUT UINT64 *Result
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_IO_MEM) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
|
||||||
|
IN UINT8 BarIndex,
|
||||||
|
IN UINT64 Offset,
|
||||||
|
IN UINTN Count,
|
||||||
|
IN OUT VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
|
||||||
|
IN UINT64 Address,
|
||||||
|
IN UINTN Count,
|
||||||
|
IN OUT VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_PCI_IO_PROTOCOL_IO_MEM Read;
|
||||||
|
EFI_PCI_IO_PROTOCOL_IO_MEM Write;
|
||||||
|
} EFI_PCI_IO_PROTOCOL_ACCESS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM Read;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM Write;
|
||||||
|
} EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_CONFIG) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
|
||||||
|
IN UINT32 Offset,
|
||||||
|
IN UINTN Count,
|
||||||
|
IN OUT VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_CONFIGURATION) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
OUT VOID **Resources
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_PCI_IO_PROTOCOL_CONFIG Read;
|
||||||
|
EFI_PCI_IO_PROTOCOL_CONFIG Write;
|
||||||
|
} EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_COPY_MEM) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
|
||||||
|
IN UINT8 DestBarIndex,
|
||||||
|
IN UINT64 DestOffset,
|
||||||
|
IN UINT8 SrcBarIndex,
|
||||||
|
IN UINT64 SrcOffset,
|
||||||
|
IN UINTN Count
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_COPY_MEM) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
|
||||||
|
IN UINT64 DestAddress,
|
||||||
|
IN UINT64 SrcAddress,
|
||||||
|
IN UINTN Count
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiPciIoOperationBusMasterRead,
|
||||||
|
EfiPciIoOperationBusMasterWrite,
|
||||||
|
EfiPciIoOperationBusMasterCommonBuffer,
|
||||||
|
EfiPciIoOperationMaximum
|
||||||
|
} EFI_PCI_IO_PROTOCOL_OPERATION;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiPciOperationBusMasterRead,
|
||||||
|
EfiPciOperationBusMasterWrite,
|
||||||
|
EfiPciOperationBusMasterCommonBuffer,
|
||||||
|
EfiPciOperationBusMasterRead64,
|
||||||
|
EfiPciOperationBusMasterWrite64,
|
||||||
|
EfiPciOperationBusMasterCommonBuffer64,
|
||||||
|
EfiPciOperationMaximum
|
||||||
|
} EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_MAP) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_IO_PROTOCOL_OPERATION Operation,
|
||||||
|
IN VOID *HostAddress,
|
||||||
|
IN OUT UINTN *NumberOfBytes,
|
||||||
|
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||||
|
OUT VOID **Mapping
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_MAP) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION Operation,
|
||||||
|
IN VOID *HostAddress,
|
||||||
|
IN OUT UINTN *NumberOfBytes,
|
||||||
|
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||||
|
OUT VOID **Mapping
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_UNMAP) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN VOID *Mapping
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_UNMAP) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
IN VOID *Mapping
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN EFI_ALLOCATE_TYPE Type,
|
||||||
|
IN EFI_MEMORY_TYPE MemoryType,
|
||||||
|
IN UINTN Pages,
|
||||||
|
OUT VOID **HostAddress,
|
||||||
|
IN UINT64 Attributes
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ALLOCATE_BUFFER) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
IN EFI_ALLOCATE_TYPE Type,
|
||||||
|
IN EFI_MEMORY_TYPE MemoryType,
|
||||||
|
IN UINTN Pages,
|
||||||
|
IN OUT VOID **HostAddress,
|
||||||
|
IN UINT64 Attributes
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_FREE_BUFFER) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN UINTN Pages,
|
||||||
|
IN VOID *HostAddress
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FREE_BUFFER) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
IN UINTN Pages,
|
||||||
|
IN VOID *HostAddress
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_FLUSH) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FLUSH) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_GET_LOCATION) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
OUT UINTN *SegmentNumber,
|
||||||
|
OUT UINTN *BusNumber,
|
||||||
|
OUT UINTN *DeviceNumber,
|
||||||
|
OUT UINTN *FunctionNumber
|
||||||
|
);
|
||||||
|
|
||||||
|
#define EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
|
||||||
|
#define EFI_PCI_ATTRIBUTE_ISA_IO 0x0002
|
||||||
|
#define EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO 0x0004
|
||||||
|
#define EFI_PCI_ATTRIBUTE_VGA_MEMORY 0x0008
|
||||||
|
#define EFI_PCI_ATTRIBUTE_VGA_IO 0x0010
|
||||||
|
#define EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
|
||||||
|
#define EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
|
||||||
|
#define EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
|
||||||
|
#define EFI_PCI_ATTRIBUTE_IO 0x0100
|
||||||
|
#define EFI_PCI_ATTRIBUTE_MEMORY 0x0200
|
||||||
|
#define EFI_PCI_ATTRIBUTE_BUS_MASTER 0x0400
|
||||||
|
#define EFI_PCI_ATTRIBUTE_MEMORY_CACHED 0x0800
|
||||||
|
#define EFI_PCI_ATTRIBUTE_MEMORY_DISABLE 0x1000
|
||||||
|
#define EFI_PCI_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
|
||||||
|
#define EFI_PCI_ATTRIBUTE_EMBEDDED_ROM 0x4000
|
||||||
|
#define EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
|
||||||
|
#define EFI_PCI_ATTRIBUTE_ISA_IO_16 0x10000
|
||||||
|
#define EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
|
||||||
|
#define EFI_PCI_ATTRIBUTE_VGA_IO_16 0x40000
|
||||||
|
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_ISA_IO EFI_PCI_ATTRIBUTE_ISA_IO
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY EFI_PCI_ATTRIBUTE_VGA_MEMORY
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_VGA_IO EFI_PCI_ATTRIBUTE_VGA_IO
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_IO EFI_PCI_ATTRIBUTE_IO
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_MEMORY EFI_PCI_ATTRIBUTE_MEMORY
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER EFI_PCI_ATTRIBUTE_BUS_MASTER
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED EFI_PCI_ATTRIBUTE_MEMORY_CACHED
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE EFI_PCI_ATTRIBUTE_MEMORY_DISABLE
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE EFI_PCI_ATTRIBUTE_EMBEDDED_DEVICE
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM EFI_PCI_ATTRIBUTE_EMBEDDED_ROM
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 EFI_PCI_ATTRIBUTE_ISA_IO_16
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16
|
||||||
|
#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 EFI_PCI_ATTRIBUTE_VGA_IO_16
|
||||||
|
|
||||||
|
#define EFI_PCI_ATTRIBUTE_VALID_FOR_ALLOCATE_BUFFER \
|
||||||
|
(EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE | EFI_PCI_ATTRIBUTE_MEMORY_CACHED | EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE)
|
||||||
|
|
||||||
|
#define EFI_PCI_ATTRIBUTE_INVALID_FOR_ALLOCATE_BUFFER \
|
||||||
|
(~EFI_PCI_ATTRIBUTE_VALID_FOR_ALLOCATE_BUFFER)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Register;
|
||||||
|
UINT8 Function;
|
||||||
|
UINT8 Device;
|
||||||
|
UINT8 Bus;
|
||||||
|
UINT32 ExtendedRegister;
|
||||||
|
} EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiPciIoAttributeOperationGet,
|
||||||
|
EfiPciIoAttributeOperationSet,
|
||||||
|
EfiPciIoAttributeOperationEnable,
|
||||||
|
EfiPciIoAttributeOperationDisable,
|
||||||
|
EfiPciIoAttributeOperationSupported,
|
||||||
|
EfiPciIoAttributeOperationMaximum
|
||||||
|
} EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_ATTRIBUTES) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation,
|
||||||
|
IN UINT64 Attributes,
|
||||||
|
OUT UINT64 *Result OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN UINT8 BarIndex,
|
||||||
|
OUT UINT64 *Supports OPTIONAL,
|
||||||
|
OUT VOID **Resources OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GET_ATTRIBUTES) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
OUT UINT64 *Supports,
|
||||||
|
OUT UINT64 *Attributes
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES) (
|
||||||
|
IN struct _EFI_PCI_IO_PROTOCOL *This,
|
||||||
|
IN UINT64 Attributes,
|
||||||
|
IN UINT8 BarIndex,
|
||||||
|
IN OUT UINT64 *Offset,
|
||||||
|
IN OUT UINT64 *Length
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_SET_ATTRIBUTES) (
|
||||||
|
IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
|
||||||
|
IN UINT64 Attributes,
|
||||||
|
IN OUT UINT64 *ResourceBase,
|
||||||
|
IN OUT UINT64 *ResourceLength
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _EFI_PCI_IO_PROTOCOL {
|
||||||
|
EFI_PCI_IO_PROTOCOL_POLL_IO_MEM PollMem;
|
||||||
|
EFI_PCI_IO_PROTOCOL_POLL_IO_MEM PollIo;
|
||||||
|
EFI_PCI_IO_PROTOCOL_ACCESS Mem;
|
||||||
|
EFI_PCI_IO_PROTOCOL_ACCESS Io;
|
||||||
|
EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS Pci;
|
||||||
|
EFI_PCI_IO_PROTOCOL_COPY_MEM CopyMem;
|
||||||
|
EFI_PCI_IO_PROTOCOL_MAP Map;
|
||||||
|
EFI_PCI_IO_PROTOCOL_UNMAP Unmap;
|
||||||
|
EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER AllocateBuffer;
|
||||||
|
EFI_PCI_IO_PROTOCOL_FREE_BUFFER FreeBuffer;
|
||||||
|
EFI_PCI_IO_PROTOCOL_FLUSH Flush;
|
||||||
|
EFI_PCI_IO_PROTOCOL_GET_LOCATION GetLocation;
|
||||||
|
EFI_PCI_IO_PROTOCOL_ATTRIBUTES Attributes;
|
||||||
|
EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES GetBarAttributes;
|
||||||
|
EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES SetBarAttributes;
|
||||||
|
UINT64 RomSize;
|
||||||
|
VOID *RomImage;
|
||||||
|
} EFI_PCI_IO_PROTOCOL;
|
||||||
|
|
||||||
|
// Note: Because it conflicted with the EDK2 struct name, the
|
||||||
|
// 'EFI_PCI_IO_PROTOCOL' GUID definition, from older versions
|
||||||
|
// of gnu-efi, is now obsoleted.
|
||||||
|
// Use 'EFI_PCI_IO_PROTOCOL_GUID' instead.
|
||||||
|
|
||||||
|
typedef struct _EFI_PCI_IO_PROTOCOL _EFI_PCI_IO;
|
||||||
|
typedef EFI_PCI_IO_PROTOCOL EFI_PCI_IO;
|
||||||
|
|
||||||
|
typedef struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL {
|
||||||
|
EFI_HANDLE ParentHandle;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_POLL_IO_MEM PollMem;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_POLL_IO_MEM PollIo;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS Mem;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS Io;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS Pci;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_COPY_MEM CopyMem;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_MAP Map;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_UNMAP Unmap;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ALLOCATE_BUFFER AllocateBuffer;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FREE_BUFFER FreeBuffer;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FLUSH Flush;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GET_ATTRIBUTES GetAttributes;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_SET_ATTRIBUTES SetAttributes;
|
||||||
|
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_CONFIGURATION Configuration;
|
||||||
|
UINT32 SegmentNumber;
|
||||||
|
} EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL;
|
||||||
|
|
||||||
|
#endif /* _EFI_PCI_IO_H */
|
||||||
115
src/include/efi/efipoint.h
Normal file
115
src/include/efi/efipoint.h
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/* Copyright (C) 2014 by John Cronin
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _EFI_POINT_H
|
||||||
|
#define _EFI_POINT_H
|
||||||
|
|
||||||
|
#define EFI_SIMPLE_POINTER_PROTOCOL_GUID \
|
||||||
|
{ 0x31878c87, 0xb75, 0x11d5, { 0x9a, 0x4f, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_SIMPLE_POINTER);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
INT32 RelativeMovementX;
|
||||||
|
INT32 RelativeMovementY;
|
||||||
|
INT32 RelativeMovementZ;
|
||||||
|
BOOLEAN LeftButton;
|
||||||
|
BOOLEAN RightButton;
|
||||||
|
} EFI_SIMPLE_POINTER_STATE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 ResolutionX;
|
||||||
|
UINT64 ResolutionY;
|
||||||
|
UINT64 ResolutionZ;
|
||||||
|
BOOLEAN LeftButton;
|
||||||
|
BOOLEAN RightButton;
|
||||||
|
} EFI_SIMPLE_POINTER_MODE;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_POINTER_RESET) (
|
||||||
|
IN struct _EFI_SIMPLE_POINTER *This,
|
||||||
|
IN BOOLEAN ExtendedVerification
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SIMPLE_POINTER_GET_STATE) (
|
||||||
|
IN struct _EFI_SIMPLE_POINTER *This,
|
||||||
|
IN OUT EFI_SIMPLE_POINTER_STATE *State
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _EFI_SIMPLE_POINTER {
|
||||||
|
EFI_SIMPLE_POINTER_RESET Reset;
|
||||||
|
EFI_SIMPLE_POINTER_GET_STATE GetState;
|
||||||
|
EFI_EVENT WaitForInput;
|
||||||
|
EFI_SIMPLE_POINTER_MODE *Mode;
|
||||||
|
} EFI_SIMPLE_POINTER_PROTOCOL;
|
||||||
|
|
||||||
|
#define EFI_ABSOLUTE_POINTER_PROTOCOL_GUID \
|
||||||
|
{ 0x8D59D32B, 0xC655, 0x4AE9, { 0x9B, 0x15, 0xF2, 0x59, 0x04, 0x99, 0x2A, 0x43 } }
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_ABSOLUTE_POINTER_PROTOCOL);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 AbsoluteMinX;
|
||||||
|
UINT64 AbsoluteMinY;
|
||||||
|
UINT64 AbsoluteMinZ;
|
||||||
|
UINT64 AbsoluteMaxX;
|
||||||
|
UINT64 AbsoluteMaxY;
|
||||||
|
UINT64 AbsoluteMaxZ;
|
||||||
|
UINT32 Attributes;
|
||||||
|
} EFI_ABSOLUTE_POINTER_MODE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 CurrentX;
|
||||||
|
UINT64 CurrentY;
|
||||||
|
UINT64 CurrentZ;
|
||||||
|
UINT32 ActiveButtons;
|
||||||
|
} EFI_ABSOLUTE_POINTER_STATE;
|
||||||
|
|
||||||
|
#define EFI_ABSP_SupportsAltActive 0x00000001
|
||||||
|
#define EFI_ABSP_SupportsPressureAsZ 0x00000002
|
||||||
|
#define EFI_ABSP_TouchActive 0x00000001
|
||||||
|
#define EFI_ABS_AltActive 0x00000002
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_ABSOLUTE_POINTER_RESET) (
|
||||||
|
IN struct _EFI_ABSOLUTE_POINTER_PROTOCOL *This,
|
||||||
|
IN BOOLEAN ExtendedVerification
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_ABSOLUTE_POINTER_GET_STATE) (
|
||||||
|
IN struct _EFI_ABSOLUTE_POINTER_PROTOCOL *This,
|
||||||
|
IN OUT EFI_ABSOLUTE_POINTER_STATE *State
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _EFI_ABSOLUTE_POINTER_PROTOCOL {
|
||||||
|
EFI_ABSOLUTE_POINTER_RESET Reset;
|
||||||
|
EFI_ABSOLUTE_POINTER_GET_STATE GetState;
|
||||||
|
EFI_EVENT WaitForInput;
|
||||||
|
EFI_ABSOLUTE_POINTER_MODE *Mode;
|
||||||
|
} EFI_ABSOLUTE_POINTER_PROTOCOL;
|
||||||
|
|
||||||
|
#endif
|
||||||
1424
src/include/efi/efiprot.h
Normal file
1424
src/include/efi/efiprot.h
Normal file
File diff suppressed because it is too large
Load Diff
482
src/include/efi/efipxebc.h
Normal file
482
src/include/efi/efipxebc.h
Normal file
@@ -0,0 +1,482 @@
|
|||||||
|
#ifndef _EFIPXEBC_H
|
||||||
|
#define _EFIPXEBC_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efipxebc.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI PXE Base Code Protocol
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// PXE Base Code protocol
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PXE_BASE_CODE_PROTOCOL_GUID \
|
||||||
|
{ 0x03c4e603, 0xac28, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_PXE_BASE_CODE_PROTOCOL);
|
||||||
|
|
||||||
|
#define DEFAULT_TTL 4
|
||||||
|
#define DEFAULT_ToS 0
|
||||||
|
//
|
||||||
|
// Address definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
UINT32 Addr[4];
|
||||||
|
EFI_IPv4_ADDRESS v4;
|
||||||
|
EFI_IPv6_ADDRESS v6;
|
||||||
|
} EFI_IP_ADDRESS;
|
||||||
|
|
||||||
|
typedef UINT16 EFI_PXE_BASE_CODE_UDP_PORT;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Packet definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 BootpOpcode;
|
||||||
|
UINT8 BootpHwType;
|
||||||
|
UINT8 BootpHwAddrLen;
|
||||||
|
UINT8 BootpGateHops;
|
||||||
|
UINT32 BootpIdent;
|
||||||
|
UINT16 BootpSeconds;
|
||||||
|
UINT16 BootpFlags;
|
||||||
|
UINT8 BootpCiAddr[4];
|
||||||
|
UINT8 BootpYiAddr[4];
|
||||||
|
UINT8 BootpSiAddr[4];
|
||||||
|
UINT8 BootpGiAddr[4];
|
||||||
|
UINT8 BootpHwAddr[16];
|
||||||
|
UINT8 BootpSrvName[64];
|
||||||
|
UINT8 BootpBootFile[128];
|
||||||
|
UINT32 DhcpMagik;
|
||||||
|
UINT8 DhcpOptions[56];
|
||||||
|
} EFI_PXE_BASE_CODE_DHCPV4_PACKET;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 MessageType:8;
|
||||||
|
UINT32 TransactionId:24;
|
||||||
|
UINT8 DhcpOptions[1024];
|
||||||
|
} EFI_PXE_BASE_CODE_DHCPV6_PACKET;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
UINT8 Raw[1472];
|
||||||
|
EFI_PXE_BASE_CODE_DHCPV4_PACKET Dhcpv4;
|
||||||
|
EFI_PXE_BASE_CODE_DHCPV6_PACKET Dhcpv6;
|
||||||
|
} EFI_PXE_BASE_CODE_PACKET;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Type;
|
||||||
|
UINT8 Code;
|
||||||
|
UINT16 Checksum;
|
||||||
|
union {
|
||||||
|
UINT32 reserved;
|
||||||
|
UINT32 Mtu;
|
||||||
|
UINT32 Pointer;
|
||||||
|
struct {
|
||||||
|
UINT16 Identifier;
|
||||||
|
UINT16 Sequence;
|
||||||
|
} Echo;
|
||||||
|
} u;
|
||||||
|
UINT8 Data[494];
|
||||||
|
} EFI_PXE_BASE_CODE_ICMP_ERROR;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 ErrorCode;
|
||||||
|
CHAR8 ErrorString[127];
|
||||||
|
} EFI_PXE_BASE_CODE_TFTP_ERROR;
|
||||||
|
|
||||||
|
//
|
||||||
|
// IP Receive Filter definitions
|
||||||
|
//
|
||||||
|
#define EFI_PXE_BASE_CODE_MAX_IPCNT 8
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Filters;
|
||||||
|
UINT8 IpCnt;
|
||||||
|
UINT16 reserved;
|
||||||
|
EFI_IP_ADDRESS IpList[EFI_PXE_BASE_CODE_MAX_IPCNT];
|
||||||
|
} EFI_PXE_BASE_CODE_IP_FILTER;
|
||||||
|
|
||||||
|
#define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP 0x0001
|
||||||
|
#define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST 0x0002
|
||||||
|
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS 0x0004
|
||||||
|
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST 0x0008
|
||||||
|
|
||||||
|
//
|
||||||
|
// ARP Cache definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_IP_ADDRESS IpAddr;
|
||||||
|
EFI_MAC_ADDRESS MacAddr;
|
||||||
|
} EFI_PXE_BASE_CODE_ARP_ENTRY;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_IP_ADDRESS IpAddr;
|
||||||
|
EFI_IP_ADDRESS SubnetMask;
|
||||||
|
EFI_IP_ADDRESS GwAddr;
|
||||||
|
} EFI_PXE_BASE_CODE_ROUTE_ENTRY;
|
||||||
|
|
||||||
|
//
|
||||||
|
// UDP definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP 0x0001
|
||||||
|
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT 0x0002
|
||||||
|
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP 0x0004
|
||||||
|
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT 0x0008
|
||||||
|
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER 0x0010
|
||||||
|
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT 0x0020
|
||||||
|
|
||||||
|
//
|
||||||
|
// Discover() definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP 0
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_MS_WINNT_RIS 1
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_INTEL_LCM 2
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_DOSUNDI 3
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_NEC_ESMPRO 4
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_WSoD 5
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_LCCM 6
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_CA_UNICENTER_TNG 7
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_HP_OPENVIEW 8
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_9 9
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_10 10
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_11 11
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_NOT_USED_12 12
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_INSTALL 13
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_BOOT 14
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_REMBO 15
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_BEOBOOT 16
|
||||||
|
//
|
||||||
|
// 17 through 32767 are reserved
|
||||||
|
// 32768 through 65279 are for vendor use
|
||||||
|
// 65280 through 65534 are reserved
|
||||||
|
//
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_TYPE_PXETEST 65535
|
||||||
|
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_LAYER_MASK 0x7FFF
|
||||||
|
#define EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL 0x0000
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT16 Type;
|
||||||
|
BOOLEAN AcceptAnyResponse;
|
||||||
|
UINT8 Reserved;
|
||||||
|
EFI_IP_ADDRESS IpAddr;
|
||||||
|
} EFI_PXE_BASE_CODE_SRVLIST;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BOOLEAN UseMCast;
|
||||||
|
BOOLEAN UseBCast;
|
||||||
|
BOOLEAN UseUCast;
|
||||||
|
BOOLEAN MustUseList;
|
||||||
|
EFI_IP_ADDRESS ServerMCastIp;
|
||||||
|
UINT16 IpCnt;
|
||||||
|
EFI_PXE_BASE_CODE_SRVLIST SrvList[1];
|
||||||
|
} EFI_PXE_BASE_CODE_DISCOVER_INFO;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Mtftp() definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EFI_PXE_BASE_CODE_TFTP_FIRST,
|
||||||
|
EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
|
||||||
|
EFI_PXE_BASE_CODE_TFTP_READ_FILE,
|
||||||
|
EFI_PXE_BASE_CODE_TFTP_WRITE_FILE,
|
||||||
|
EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY,
|
||||||
|
EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE,
|
||||||
|
EFI_PXE_BASE_CODE_MTFTP_READ_FILE,
|
||||||
|
EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY,
|
||||||
|
EFI_PXE_BASE_CODE_MTFTP_LAST
|
||||||
|
} EFI_PXE_BASE_CODE_TFTP_OPCODE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_IP_ADDRESS MCastIp;
|
||||||
|
EFI_PXE_BASE_CODE_UDP_PORT CPort;
|
||||||
|
EFI_PXE_BASE_CODE_UDP_PORT SPort;
|
||||||
|
UINT16 ListenTimeout;
|
||||||
|
UINT16 TransmitTimeout;
|
||||||
|
} EFI_PXE_BASE_CODE_MTFTP_INFO;
|
||||||
|
|
||||||
|
//
|
||||||
|
// PXE Base Code Mode structure
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES 8
|
||||||
|
#define EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES 8
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BOOLEAN Started;
|
||||||
|
BOOLEAN Ipv6Available;
|
||||||
|
BOOLEAN Ipv6Supported;
|
||||||
|
BOOLEAN UsingIpv6;
|
||||||
|
BOOLEAN BisSupported;
|
||||||
|
BOOLEAN BisDetected;
|
||||||
|
BOOLEAN AutoArp;
|
||||||
|
BOOLEAN SendGUID;
|
||||||
|
BOOLEAN DhcpDiscoverValid;
|
||||||
|
BOOLEAN DhcpAckReceived;
|
||||||
|
BOOLEAN ProxyOfferReceived;
|
||||||
|
BOOLEAN PxeDiscoverValid;
|
||||||
|
BOOLEAN PxeReplyReceived;
|
||||||
|
BOOLEAN PxeBisReplyReceived;
|
||||||
|
BOOLEAN IcmpErrorReceived;
|
||||||
|
BOOLEAN TftpErrorReceived;
|
||||||
|
BOOLEAN MakeCallbacks;
|
||||||
|
UINT8 TTL;
|
||||||
|
UINT8 ToS;
|
||||||
|
EFI_IP_ADDRESS StationIp;
|
||||||
|
EFI_IP_ADDRESS SubnetMask;
|
||||||
|
EFI_PXE_BASE_CODE_PACKET DhcpDiscover;
|
||||||
|
EFI_PXE_BASE_CODE_PACKET DhcpAck;
|
||||||
|
EFI_PXE_BASE_CODE_PACKET ProxyOffer;
|
||||||
|
EFI_PXE_BASE_CODE_PACKET PxeDiscover;
|
||||||
|
EFI_PXE_BASE_CODE_PACKET PxeReply;
|
||||||
|
EFI_PXE_BASE_CODE_PACKET PxeBisReply;
|
||||||
|
EFI_PXE_BASE_CODE_IP_FILTER IpFilter;
|
||||||
|
UINT32 ArpCacheEntries;
|
||||||
|
EFI_PXE_BASE_CODE_ARP_ENTRY ArpCache[EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES];
|
||||||
|
UINT32 RouteTableEntries;
|
||||||
|
EFI_PXE_BASE_CODE_ROUTE_ENTRY RouteTable[EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES];
|
||||||
|
EFI_PXE_BASE_CODE_ICMP_ERROR IcmpError;
|
||||||
|
EFI_PXE_BASE_CODE_TFTP_ERROR TftpError;
|
||||||
|
} EFI_PXE_BASE_CODE_MODE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// PXE Base Code Interface Function definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_START) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN BOOLEAN UseIpv6
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_STOP) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_DHCP) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN BOOLEAN SortOffers
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_DISCOVER) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN UINT16 Type,
|
||||||
|
IN UINT16 *Layer,
|
||||||
|
IN BOOLEAN UseBis,
|
||||||
|
IN OUT EFI_PXE_BASE_CODE_DISCOVER_INFO *Info OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_MTFTP) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation,
|
||||||
|
IN OUT VOID *BufferPtr OPTIONAL,
|
||||||
|
IN BOOLEAN Overwrite,
|
||||||
|
IN OUT UINT64 *BufferSize,
|
||||||
|
IN UINTN *BlockSize OPTIONAL,
|
||||||
|
IN EFI_IP_ADDRESS *ServerIp,
|
||||||
|
IN UINT8 *Filename,
|
||||||
|
IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL,
|
||||||
|
IN BOOLEAN DontUseBuffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_UDP_WRITE) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN UINT16 OpFlags,
|
||||||
|
IN EFI_IP_ADDRESS *DestIp,
|
||||||
|
IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort,
|
||||||
|
IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL
|
||||||
|
IN EFI_IP_ADDRESS *SrcIp, OPTIONAL
|
||||||
|
IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL
|
||||||
|
IN UINTN *HeaderSize, OPTIONAL
|
||||||
|
IN VOID *HeaderPtr, OPTIONAL
|
||||||
|
IN UINTN *BufferSize,
|
||||||
|
IN VOID *BufferPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_UDP_READ) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN UINT16 OpFlags,
|
||||||
|
IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL
|
||||||
|
IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort, OPTIONAL
|
||||||
|
IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL
|
||||||
|
IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL
|
||||||
|
IN UINTN *HeaderSize, OPTIONAL
|
||||||
|
IN VOID *HeaderPtr, OPTIONAL
|
||||||
|
IN OUT UINTN *BufferSize,
|
||||||
|
IN VOID *BufferPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_SET_IP_FILTER) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_ARP) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN EFI_IP_ADDRESS *IpAddr,
|
||||||
|
IN EFI_MAC_ADDRESS *MacAddr OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_SET_PARAMETERS) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN BOOLEAN *NewAutoArp, OPTIONAL
|
||||||
|
IN BOOLEAN *NewSendGUID, OPTIONAL
|
||||||
|
IN UINT8 *NewTTL, OPTIONAL
|
||||||
|
IN UINT8 *NewToS, OPTIONAL
|
||||||
|
IN BOOLEAN *NewMakeCallback OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_SET_STATION_IP) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
IN EFI_IP_ADDRESS *NewStationIp, OPTIONAL
|
||||||
|
IN EFI_IP_ADDRESS *NewSubnetMask OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_BASE_CODE_SET_PACKETS) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This,
|
||||||
|
BOOLEAN *NewDhcpDiscoverValid, OPTIONAL
|
||||||
|
BOOLEAN *NewDhcpAckReceived, OPTIONAL
|
||||||
|
BOOLEAN *NewProxyOfferReceived, OPTIONAL
|
||||||
|
BOOLEAN *NewPxeDiscoverValid, OPTIONAL
|
||||||
|
BOOLEAN *NewPxeReplyReceived, OPTIONAL
|
||||||
|
BOOLEAN *NewPxeBisReplyReceived,OPTIONAL
|
||||||
|
IN EFI_PXE_BASE_CODE_PACKET *NewDhcpDiscover, OPTIONAL
|
||||||
|
IN EFI_PXE_BASE_CODE_PACKET *NewDhcpAck, OPTIONAL
|
||||||
|
IN EFI_PXE_BASE_CODE_PACKET *NewProxyOffer, OPTIONAL
|
||||||
|
IN EFI_PXE_BASE_CODE_PACKET *NewPxeDiscover, OPTIONAL
|
||||||
|
IN EFI_PXE_BASE_CODE_PACKET *NewPxeReply, OPTIONAL
|
||||||
|
IN EFI_PXE_BASE_CODE_PACKET *NewPxeBisReply OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// PXE Base Code Protocol structure
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PXE_BASE_CODE_PROTOCOL_REVISION 0x00010000
|
||||||
|
#define EFI_PXE_BASE_CODE_INTERFACE_REVISION EFI_PXE_BASE_CODE_PROTOCOL_REVISION
|
||||||
|
|
||||||
|
typedef struct _EFI_PXE_BASE_CODE_PROTOCOL {
|
||||||
|
UINT64 Revision;
|
||||||
|
EFI_PXE_BASE_CODE_START Start;
|
||||||
|
EFI_PXE_BASE_CODE_STOP Stop;
|
||||||
|
EFI_PXE_BASE_CODE_DHCP Dhcp;
|
||||||
|
EFI_PXE_BASE_CODE_DISCOVER Discover;
|
||||||
|
EFI_PXE_BASE_CODE_MTFTP Mtftp;
|
||||||
|
EFI_PXE_BASE_CODE_UDP_WRITE UdpWrite;
|
||||||
|
EFI_PXE_BASE_CODE_UDP_READ UdpRead;
|
||||||
|
EFI_PXE_BASE_CODE_SET_IP_FILTER SetIpFilter;
|
||||||
|
EFI_PXE_BASE_CODE_ARP Arp;
|
||||||
|
EFI_PXE_BASE_CODE_SET_PARAMETERS SetParameters;
|
||||||
|
EFI_PXE_BASE_CODE_SET_STATION_IP SetStationIp;
|
||||||
|
EFI_PXE_BASE_CODE_SET_PACKETS SetPackets;
|
||||||
|
EFI_PXE_BASE_CODE_MODE *Mode;
|
||||||
|
} EFI_PXE_BASE_CODE_PROTOCOL;
|
||||||
|
|
||||||
|
// Note: Because it conflicted with the EDK2 struct name, the
|
||||||
|
// 'EFI_PXE_BASE_CODE_PROTOCOL' GUID definition, from older
|
||||||
|
// versions of gnu-efi, is now obsoleted.
|
||||||
|
// Use 'EFI_PXE_BASE_CODE_PROTOCOL_GUID' instead.
|
||||||
|
|
||||||
|
typedef struct _EFI_PXE_BASE_CODE_PROTOCOL _EFI_PXE_BASE_CODE;
|
||||||
|
typedef struct _EFI_PXE_BASE_CODE_PROTOCOL EFI_PXE_BASE_CODE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Call Back Definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_GUID \
|
||||||
|
{ 0x245dca21, 0xfb7b, 0x11d3, {0x8f, 0x01, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Revision Number
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION 0x00010000
|
||||||
|
#define EFI_PXE_BASE_CODE_CALLBACK_INTERFACE_REVISION EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EFI_PXE_BASE_CODE_FUNCTION_FIRST,
|
||||||
|
EFI_PXE_BASE_CODE_FUNCTION_DHCP,
|
||||||
|
EFI_PXE_BASE_CODE_FUNCTION_DISCOVER,
|
||||||
|
EFI_PXE_BASE_CODE_FUNCTION_MTFTP,
|
||||||
|
EFI_PXE_BASE_CODE_FUNCTION_UDP_WRITE,
|
||||||
|
EFI_PXE_BASE_CODE_FUNCTION_UDP_READ,
|
||||||
|
EFI_PXE_BASE_CODE_FUNCTION_ARP,
|
||||||
|
EFI_PXE_BASE_CODE_FUNCTION_IGMP,
|
||||||
|
EFI_PXE_BASE_CODE_PXE_FUNCTION_LAST
|
||||||
|
} EFI_PXE_BASE_CODE_FUNCTION;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EFI_PXE_BASE_CODE_CALLBACK_STATUS_FIRST,
|
||||||
|
EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
|
||||||
|
EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT,
|
||||||
|
EFI_PXE_BASE_CODE_CALLBACK_STATUS_LAST
|
||||||
|
} EFI_PXE_BASE_CODE_CALLBACK_STATUS;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_PXE_BASE_CODE_CALLBACK_STATUS
|
||||||
|
(EFIAPI *EFI_PXE_CALLBACK) (
|
||||||
|
IN struct _EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *This,
|
||||||
|
IN EFI_PXE_BASE_CODE_FUNCTION Function,
|
||||||
|
IN BOOLEAN Received,
|
||||||
|
IN UINT32 PacketLen,
|
||||||
|
IN EFI_PXE_BASE_CODE_PACKET *Packet OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct _EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL {
|
||||||
|
UINT64 Revision;
|
||||||
|
EFI_PXE_CALLBACK Callback;
|
||||||
|
} EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL;
|
||||||
|
|
||||||
|
// Note: Because it conflicted with the EDK2 struct name, the
|
||||||
|
// 'EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL' GUID definition, from
|
||||||
|
// older versions of gnu-efi, is now obsoleted.
|
||||||
|
// Use 'EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_GUID' instead.
|
||||||
|
|
||||||
|
typedef struct _EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL _EFI_PXE_BASE_CODE_CALLBACK;
|
||||||
|
typedef EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL EFI_PXE_BASE_CODE_CALLBACK;
|
||||||
|
|
||||||
|
#endif /* _EFIPXEBC_H */
|
||||||
179
src/include/efi/efirtlib.h
Normal file
179
src/include/efi/efirtlib.h
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
#ifndef _EFI_RT_LIB_INCLUDE_
|
||||||
|
#define _EFI_RT_LIB_INCLUDE_
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efilib.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI Runtime library functions
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#include <efi/efidebug.h>
|
||||||
|
#include <efi/efipart.h>
|
||||||
|
#include <efi/efilibplat.h>
|
||||||
|
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtZeroMem (
|
||||||
|
IN VOID *Buffer,
|
||||||
|
IN UINTN Size
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtSetMem (
|
||||||
|
IN VOID *Buffer,
|
||||||
|
IN UINTN Size,
|
||||||
|
IN UINT8 Value
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtCopyMem (
|
||||||
|
IN VOID *Dest,
|
||||||
|
IN CONST VOID *Src,
|
||||||
|
IN UINTN len
|
||||||
|
);
|
||||||
|
|
||||||
|
INTN
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtCompareMem (
|
||||||
|
IN CONST VOID *Dest,
|
||||||
|
IN CONST VOID *Src,
|
||||||
|
IN UINTN len
|
||||||
|
);
|
||||||
|
|
||||||
|
INTN
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStrCmp (
|
||||||
|
IN CONST CHAR16 *s1,
|
||||||
|
IN CONST CHAR16 *s2
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStrCpy (
|
||||||
|
IN CHAR16 *Dest,
|
||||||
|
IN CONST CHAR16 *Src
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStrnCpy (
|
||||||
|
IN CHAR16 *Dest,
|
||||||
|
IN CONST CHAR16 *Src,
|
||||||
|
IN UINTN Len
|
||||||
|
);
|
||||||
|
|
||||||
|
CHAR16 *
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStpCpy (
|
||||||
|
IN CHAR16 *Dest,
|
||||||
|
IN CONST CHAR16 *Src
|
||||||
|
);
|
||||||
|
|
||||||
|
CHAR16 *
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStpnCpy (
|
||||||
|
IN CHAR16 *Dest,
|
||||||
|
IN CONST CHAR16 *Src,
|
||||||
|
IN UINTN Len
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStrCat (
|
||||||
|
IN CHAR16 *Dest,
|
||||||
|
IN CONST CHAR16 *Src
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStrnCat (
|
||||||
|
IN CHAR16 *Dest,
|
||||||
|
IN CONST CHAR16 *Src,
|
||||||
|
IN UINTN Len
|
||||||
|
);
|
||||||
|
|
||||||
|
UINTN
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStrLen (
|
||||||
|
IN CONST CHAR16 *s1
|
||||||
|
);
|
||||||
|
|
||||||
|
UINTN
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStrnLen (
|
||||||
|
IN CONST CHAR16 *s1,
|
||||||
|
IN UINTN Len
|
||||||
|
);
|
||||||
|
|
||||||
|
UINTN
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtStrSize (
|
||||||
|
IN CONST CHAR16 *s1
|
||||||
|
);
|
||||||
|
|
||||||
|
INTN
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtCompareGuid (
|
||||||
|
IN EFI_GUID *Guid1,
|
||||||
|
IN EFI_GUID *Guid2
|
||||||
|
);
|
||||||
|
|
||||||
|
UINT8
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtDecimaltoBCD(
|
||||||
|
IN UINT8 BcdValue
|
||||||
|
);
|
||||||
|
|
||||||
|
UINT8
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtBCDtoDecimal(
|
||||||
|
IN UINT8 BcdValue
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Virtual mapping transition support. (Only used during
|
||||||
|
// the virtual address change transisition)
|
||||||
|
//
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtLibEnableVirtualMappings (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtConvertList (
|
||||||
|
IN UINTN DebugDisposition,
|
||||||
|
IN OUT LIST_ENTRY *ListHead
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtAcquireLock (
|
||||||
|
IN FLOCK *Lock
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtReleaseLock (
|
||||||
|
IN FLOCK *Lock
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
136
src/include/efi/efiser.h
Normal file
136
src/include/efi/efiser.h
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
#ifndef _EFI_SER_H
|
||||||
|
#define _EFI_SER_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efiser.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI serial protocol
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Serial protocol
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_SERIAL_IO_PROTOCOL_GUID \
|
||||||
|
{ 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD} }
|
||||||
|
#define SERIAL_IO_PROTOCOL EFI_SERIAL_IO_PROTOCOL_GUID
|
||||||
|
|
||||||
|
INTERFACE_DECL(_EFI_SERIAL_IO_PROTOCOL);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DefaultParity,
|
||||||
|
NoParity,
|
||||||
|
EvenParity,
|
||||||
|
OddParity,
|
||||||
|
MarkParity,
|
||||||
|
SpaceParity
|
||||||
|
} EFI_PARITY_TYPE;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DefaultStopBits,
|
||||||
|
OneStopBit, // 1 stop bit
|
||||||
|
OneFiveStopBits, // 1.5 stop bits
|
||||||
|
TwoStopBits // 2 stop bits
|
||||||
|
} EFI_STOP_BITS_TYPE;
|
||||||
|
|
||||||
|
#define EFI_SERIAL_CLEAR_TO_SEND 0x0010 // RO
|
||||||
|
#define EFI_SERIAL_DATA_SET_READY 0x0020 // RO
|
||||||
|
#define EFI_SERIAL_RING_INDICATE 0x0040 // RO
|
||||||
|
#define EFI_SERIAL_CARRIER_DETECT 0x0080 // RO
|
||||||
|
#define EFI_SERIAL_REQUEST_TO_SEND 0x0002 // WO
|
||||||
|
#define EFI_SERIAL_DATA_TERMINAL_READY 0x0001 // WO
|
||||||
|
#define EFI_SERIAL_INPUT_BUFFER_EMPTY 0x0100 // RO
|
||||||
|
#define EFI_SERIAL_OUTPUT_BUFFER_EMPTY 0x0200 // RO
|
||||||
|
#define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x1000 // RW
|
||||||
|
#define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x2000 // RW
|
||||||
|
#define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x4000 // RW
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_RESET) (
|
||||||
|
IN struct _EFI_SERIAL_IO_PROTOCOL *This
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_SET_ATTRIBUTES) (
|
||||||
|
IN struct _EFI_SERIAL_IO_PROTOCOL *This,
|
||||||
|
IN UINT64 BaudRate,
|
||||||
|
IN UINT32 ReceiveFifoDepth,
|
||||||
|
IN UINT32 Timeout,
|
||||||
|
IN EFI_PARITY_TYPE Parity,
|
||||||
|
IN UINT8 DataBits,
|
||||||
|
IN EFI_STOP_BITS_TYPE StopBits
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_SET_CONTROL_BITS) (
|
||||||
|
IN struct _EFI_SERIAL_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 Control
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_GET_CONTROL_BITS) (
|
||||||
|
IN struct _EFI_SERIAL_IO_PROTOCOL *This,
|
||||||
|
OUT UINT32 *Control
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_WRITE) (
|
||||||
|
IN struct _EFI_SERIAL_IO_PROTOCOL *This,
|
||||||
|
IN OUT UINTN *BufferSize,
|
||||||
|
IN VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SERIAL_READ) (
|
||||||
|
IN struct _EFI_SERIAL_IO_PROTOCOL *This,
|
||||||
|
IN OUT UINTN *BufferSize,
|
||||||
|
OUT VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 ControlMask;
|
||||||
|
|
||||||
|
// current Attributes
|
||||||
|
UINT32 Timeout;
|
||||||
|
UINT64 BaudRate;
|
||||||
|
UINT32 ReceiveFifoDepth;
|
||||||
|
UINT32 DataBits;
|
||||||
|
UINT32 Parity;
|
||||||
|
UINT32 StopBits;
|
||||||
|
} SERIAL_IO_MODE;
|
||||||
|
|
||||||
|
#define SERIAL_IO_INTERFACE_REVISION 0x00010000
|
||||||
|
|
||||||
|
typedef struct _EFI_SERIAL_IO_PROTOCOL {
|
||||||
|
UINT32 Revision;
|
||||||
|
EFI_SERIAL_RESET Reset;
|
||||||
|
EFI_SERIAL_SET_ATTRIBUTES SetAttributes;
|
||||||
|
EFI_SERIAL_SET_CONTROL_BITS SetControl;
|
||||||
|
EFI_SERIAL_GET_CONTROL_BITS GetControl;
|
||||||
|
EFI_SERIAL_WRITE Write;
|
||||||
|
EFI_SERIAL_READ Read;
|
||||||
|
|
||||||
|
SERIAL_IO_MODE *Mode;
|
||||||
|
} EFI_SERIAL_IO_PROTOCOL;
|
||||||
|
|
||||||
|
typedef struct _EFI_SERIAL_IO_PROTOCOL _SERIAL_IO_INTERFACE;
|
||||||
|
typedef EFI_SERIAL_IO_PROTOCOL SERIAL_IO_INTERFACE;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
19
src/include/efi/efisetjmp.h
Normal file
19
src/include/efi/efisetjmp.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef GNU_EFI_SETJMP_H
|
||||||
|
#define GNU_EFI_SETJMP_H
|
||||||
|
|
||||||
|
#include <efi/eficompiler.h>
|
||||||
|
#include <efi/efisetjmp_arch.h>
|
||||||
|
|
||||||
|
#ifndef __has_builtin
|
||||||
|
#define __has_builtin(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ! __has_builtin(setjmp)
|
||||||
|
extern UINTN setjmp(jmp_buf *env) __attribute__((returns_twice));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ! __has_builtin(longjmp)
|
||||||
|
extern VOID longjmp(jmp_buf *env, UINTN value) __attribute__((noreturn));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* GNU_EFI_SETJMP_H */
|
||||||
94
src/include/efi/efishellintf.h
Normal file
94
src/include/efi/efishellintf.h
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
/** @file
|
||||||
|
SHELL_INTERFACE_PROTOCOL from EDK shell (no spec).
|
||||||
|
|
||||||
|
Shell Interface - additional information (over image_info) provided
|
||||||
|
to an application started by the shell.
|
||||||
|
|
||||||
|
ConIo provides a file-style interface to the console.
|
||||||
|
|
||||||
|
The shell interface's and data (including ConIo) are only valid during
|
||||||
|
the applications Entry Point. Once the application returns from it's
|
||||||
|
entry point the data is freed by the invoking shell.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||||
|
This program and the accompanying materials
|
||||||
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.php
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
|
**/
|
||||||
|
/*
|
||||||
|
* This is based on ShellPkg/Include/Protocol/EfiShellInterface.h from EDK II.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SHELLINTERFACE_H_
|
||||||
|
#define _SHELLINTERFACE_H_
|
||||||
|
|
||||||
|
|
||||||
|
#define SHELL_INTERFACE_PROTOCOL_GUID \
|
||||||
|
{ \
|
||||||
|
0x47c7b223, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} \
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Bit definitions for EFI_SHELL_ARG_INFO
|
||||||
|
///
|
||||||
|
typedef enum {
|
||||||
|
ARG_NO_ATTRIB = 0x0,
|
||||||
|
ARG_IS_QUOTED = 1<<0,
|
||||||
|
ARG_PARTIALLY_QUOTED = 1<<1,
|
||||||
|
ARG_FIRST_HALF_QUOTED = 1<<2,
|
||||||
|
ARG_FIRST_CHAR_IS_ESC = 1<<3
|
||||||
|
} EFI_SHELL_ARG_INFO_TYPES;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Attributes for an argument.
|
||||||
|
///
|
||||||
|
typedef struct _EFI_SHELL_ARG_INFO {
|
||||||
|
UINT32 Attributes;
|
||||||
|
} EFI_SHELL_ARG_INFO;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// This protocol provides access to additional information about a shell application.
|
||||||
|
///
|
||||||
|
typedef struct {
|
||||||
|
///
|
||||||
|
/// Handle back to original image handle & image information.
|
||||||
|
///
|
||||||
|
EFI_HANDLE ImageHandle;
|
||||||
|
EFI_LOADED_IMAGE *Info;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Parsed arg list converted more C-like format.
|
||||||
|
///
|
||||||
|
CHAR16 **Argv;
|
||||||
|
UINTN Argc;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Storage for file redirection args after parsing.
|
||||||
|
///
|
||||||
|
CHAR16 **RedirArgv;
|
||||||
|
UINTN RedirArgc;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// A file style handle for console io.
|
||||||
|
///
|
||||||
|
EFI_FILE *StdIn;
|
||||||
|
EFI_FILE *StdOut;
|
||||||
|
EFI_FILE *StdErr;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// List of attributes for each argument.
|
||||||
|
///
|
||||||
|
EFI_SHELL_ARG_INFO *ArgInfo;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Whether we are echoing.
|
||||||
|
///
|
||||||
|
BOOLEAN EchoOn;
|
||||||
|
} EFI_SHELL_INTERFACE;
|
||||||
|
|
||||||
|
#endif
|
||||||
63
src/include/efi/efishellparm.h
Normal file
63
src/include/efi/efishellparm.h
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/** @file
|
||||||
|
EFI_SHELL_PARAMETERS_PROTOCOL as defined in the UEFI Shell 2.0 specification.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
|
This program and the accompanying materials
|
||||||
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.php
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
|
**/
|
||||||
|
/*
|
||||||
|
* This is based on ShellPkg/Include/Protocol/EfiShellParameters.h from EDK II.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EFI_SHELL_PARAMETERS_PROTOCOL__
|
||||||
|
#define __EFI_SHELL_PARAMETERS_PROTOCOL__
|
||||||
|
|
||||||
|
|
||||||
|
// EDK2's ShellBase.h
|
||||||
|
typedef VOID *SHELL_FILE_HANDLE;
|
||||||
|
|
||||||
|
#define EFI_SHELL_PARAMETERS_PROTOCOL_GUID \
|
||||||
|
{ \
|
||||||
|
0x752f3136, 0x4e16, 0x4fdc, { 0xa2, 0x2a, 0xe5, 0xf4, 0x68, 0x12, 0xf4, 0xca } \
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct _EFI_SHELL_PARAMETERS_PROTOCOL {
|
||||||
|
///
|
||||||
|
/// Points to an Argc-element array of points to NULL-terminated strings containing
|
||||||
|
/// the command-line parameters. The first entry in the array is always the full file
|
||||||
|
/// path of the executable. Any quotation marks that were used to preserve
|
||||||
|
/// whitespace have been removed.
|
||||||
|
///
|
||||||
|
CHAR16 **Argv;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// The number of elements in the Argv array.
|
||||||
|
///
|
||||||
|
UINTN Argc;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// The file handle for the standard input for this executable. This may be different
|
||||||
|
/// from the ConInHandle in EFI_SYSTEM_TABLE.
|
||||||
|
///
|
||||||
|
SHELL_FILE_HANDLE StdIn;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// The file handle for the standard output for this executable. This may be different
|
||||||
|
/// from the ConOutHandle in EFI_SYSTEM_TABLE.
|
||||||
|
///
|
||||||
|
SHELL_FILE_HANDLE StdOut;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// The file handle for the standard error output for this executable. This may be
|
||||||
|
/// different from the StdErrHandle in EFI_SYSTEM_TABLE.
|
||||||
|
///
|
||||||
|
SHELL_FILE_HANDLE StdErr;
|
||||||
|
} EFI_SHELL_PARAMETERS_PROTOCOL;
|
||||||
|
|
||||||
|
#endif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user