From d2cd7b4f770749f23cdccdb5a715c6d03cc1e16e Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Wed, 19 Feb 2020 23:11:45 -0800 Subject: [PATCH] Initial import --- .gitignore | 1 + LICENSE.md | 354 +++++++++++++++++++++++++++++++++++ README.md | 20 ++ generate_protos.py | 80 ++++++++ include/uefi/boot_services.h | 89 +++++++++ include/uefi/errors.inc | 39 ++++ include/uefi/graphics.h | 92 +++++++++ include/uefi/guid.h | 29 +++ include/uefi/tables.h | 69 +++++++ include/uefi/types.h | 34 ++++ protos.yaml | 103 ++++++++++ 11 files changed, 910 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 README.md create mode 100755 generate_protos.py create mode 100644 include/uefi/boot_services.h create mode 100644 include/uefi/errors.inc create mode 100644 include/uefi/graphics.h create mode 100644 include/uefi/guid.h create mode 100644 include/uefi/tables.h create mode 100644 include/uefi/types.h create mode 100644 protos.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..252bdd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +include/uefi/protos/* diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..181a749 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,354 @@ +# License + +j6-uefi-headers is (c) 2020 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. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..13d8253 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# j6 UEFI headers + +This is a set of headers for interacting with UEFI as a C++ EFI application. I +found the EDK2 headers seemed to be missing some definitions (or perhaps I just +hadn't found the right headers to include), and the GNU-EFI ones to be specific +to using GNU-EFI and tended to break when using clang to natively build an EFI +application. + +I also hate the style of the standard headers, they should probably +come with a trigger warning for anyone who had to spend time doing Win32 COM +programming. So I've created my headers in a modern C++ style that is ABI +compatible, but doesn't attempt to be API compatible with other UEFI headers. + +The UEFI protocol definition headers aren't directly included in the git repo, +but are generated from the `protos.yaml` file via the `generate_protos.py` +script. I've started with just the protocols I'm actually using in the [jsix][] +bootloader, but new protocols should be fairly simple to add. I'll happily +accept pull requests if you find this code useful. + +[jsix]: https://github.com/justinian/jsix diff --git a/generate_protos.py b/generate_protos.py new file mode 100755 index 0000000..e8a31cd --- /dev/null +++ b/generate_protos.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 + +# 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/. + +import os +import os.path +from jinja2 import Template + +template = Template('''#pragma once +#ifndef _uefi_protos_{{ name }}_h_ +#define _uefi_protos_{{ name }}_h_ + +// This file was auto generated by the j6-uefi-headers project. Please see +// https://github.com/justinian/j6-uefi-headers for more information. + +#include +{%- for header in headers %} +#include <{{ header }}> +{%- endfor %} + +namespace uefi { +namespace protos { +struct {{ name }}; + +namespace {{ name }}_impl { +{%- for method in methods %} + using {{ method.name }} = uefi::status (*)( + {%- if not method.get("skip_this", false) -%}uefi::protos::{{ name }} *{%- endif -%} + {%- if not method.get("skip_this", false) and method.args %}, {% endif -%} + {{ method.args|join(', ', attribute='type') }}); +{%- endfor %} +} // namespace {{ name }}_impl + +struct {{ name }} +{ + static constexpr uefi::guid guid{ {{ guid }} }; +{% for method in methods %} + inline uefi::status {{ method.name }}( + {%- for arg in method.args -%} + {% if not loop.first %}, {% endif -%} + {{ arg.type }} {{ arg.name }} + {%- endfor %}) { + return _{{ method.name }}( + {%- if not method.get("skip_this", false) -%}this{%- endif -%} + {%- if not method.get("skip_this", false) and method.args %}, {% endif -%} + {{ method.args|join(', ', attribute='name') }}); + } +{% endfor %} +{%- for datum in pre_data %} + {{ datum.type }} {{ datum.name }}; +{%- endfor %} + +protected: +{%- for method in methods %} + {{ name }}_impl::{{ method.name }} _{{ method.name }}; +{%- endfor %} + +public: +{%- for datum in post_data %} + {{ datum.type }} {{ datum.name }}; +{%- endfor %} +}; + +} // namespace protos +} // namespace uefi + +#endif // _uefi_protos_{{ name }}_h_ + +''') + +protos_dir = os.path.join("include", "uefi", "protos") +os.makedirs(protos_dir, exist_ok=True) + +import yaml +protos = yaml.load(open("protos.yaml")) +for proto in protos: + with open(os.path.join(protos_dir, proto["name"] + ".h"), 'w') as header: + header.write(template.render(proto)) diff --git a/include/uefi/boot_services.h b/include/uefi/boot_services.h new file mode 100644 index 0000000..731febf --- /dev/null +++ b/include/uefi/boot_services.h @@ -0,0 +1,89 @@ +#pragma once +#ifndef _uefi_boot_services_h_ +#define _uefi_boot_services_h_ + +// This Source Code Form is part of the j6-uefi-headers project and 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/. + +#include +#include + +namespace uefi { + +struct boot_services { + static constexpr uint64_t signature = 0x56524553544f4f42ull; + + table_header header; + + // Task Priority Level management + void *raise_tpl; + void *restore_tpl; + + // Memory Services + void *allocate_pages; + void *free_pages; + void *get_memory_map; + void *allocate_pool; + void *free_pool; + + // Event & Timer Services + void *create_event; + void *set_timer; + void *wait_for_event; + void *signal_event; + void *close_event; + void *check_event; + + // Protocol Handler Services + void *install_protocol_interface; + void *reinstall_protocol_interface; + void *uninstall_protocol_interface; + void *handle_protocol; + void *_reserved; + void *register_protocol_notify; + void *locate_handle; + void *locate_device_path; + void *install_configuration_table; + + // Image Services + void *load_image; + void *start_image; + void *exit; + void *unload_image; + void *exit_boot_services; + + // Miscellaneous Services + void *get_next_monotonic_count; + void *stall; + void *set_watchdog_timer; + + // DriverSupport Services + void *connect_controller; + void *disconnect_controller; + + // Open and Close Protocol Services + void *open_protocol; + void *close_protocol; + void *open_protocol_information; + + // Library Services + void *protocols_per_handle; + void *locate_handle_buffer; + void *locate_protocol; + void *install_multiple_protocol_interfaces; + void *uninstall_multiple_protocol_interfaces; + + // 32-bit CRC Services + void *calculate_crc32; + + // Miscellaneous Services + void *copy_mem; + void *set_mem; + void *create_event_ex; +}; + +} // namespace uefi + +#endif diff --git a/include/uefi/errors.inc b/include/uefi/errors.inc new file mode 100644 index 0000000..b63f3c0 --- /dev/null +++ b/include/uefi/errors.inc @@ -0,0 +1,39 @@ +STATUS_WARNING( warn_unknown_glyph, 1) +STATUS_WARNING( warn_delete_failure, 2) +STATUS_WARNING( warn_write_failure, 3) +STATUS_WARNING( warn_buffer_too_small,4) +STATUS_WARNING( warn_stale_data, 5) +STATUS_WARNING( warn_file_system, 6) + +STATUS_ERROR( load_error, 1) +STATUS_ERROR( invalid_parameter, 2) +STATUS_ERROR( unsupported, 3) +STATUS_ERROR( bad_buffer_size, 4) +STATUS_ERROR( buffer_too_small, 5) +STATUS_ERROR( not_ready, 6) +STATUS_ERROR( device_error, 7) +STATUS_ERROR( write_protected, 8) +STATUS_ERROR( out_of_resources, 9) +STATUS_ERROR( volume_corrupted, 10) +STATUS_ERROR( volume_full, 11) +STATUS_ERROR( no_media, 12) +STATUS_ERROR( media_changed, 13) +STATUS_ERROR( not_found, 14) +STATUS_ERROR( access_denied, 15) +STATUS_ERROR( no_response, 16) +STATUS_ERROR( no_mapping, 17) +STATUS_ERROR( timeout, 18) +STATUS_ERROR( not_started, 19) +STATUS_ERROR( already_started, 20) +STATUS_ERROR( aborted, 21) +STATUS_ERROR( icmp_error, 22) +STATUS_ERROR( tftp_error, 23) +STATUS_ERROR( protocol_error, 24) +STATUS_ERROR( incompatible_version, 25) +STATUS_ERROR( security_violation, 26) +STATUS_ERROR( crc_error, 27) +STATUS_ERROR( end_of_media, 28) +STATUS_ERROR( end_of_file, 31) +STATUS_ERROR( invalid_language, 32) +STATUS_ERROR( compromised_data, 33) +STATUS_ERROR( http_error, 35) diff --git a/include/uefi/graphics.h b/include/uefi/graphics.h new file mode 100644 index 0000000..e1b06da --- /dev/null +++ b/include/uefi/graphics.h @@ -0,0 +1,92 @@ +#pragma once +#ifndef _uefi_graphics_h_ +#define _uefi_graphics_h_ + +// This Source Code Form is part of the j6-uefi-headers project and 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/. + +#include +#include + +namespace uefi { + +struct text_output_mode +{ + int32_t max_mode; + int32_t mode; + int32_t attribute; + int32_t cursor_column; + int32_t cursor_row; + bool cursor_visible; +}; + +struct pixel_bitmask +{ + uint32_t red_mask; + uint32_t green_mask; + uint32_t blue_mask; + uint32_t reserved_mask; +}; + +enum class pixel_format +{ + rgb8, + bgr8, + bitmask, + blt_only +}; + +struct graphics_output_mode_info +{ + uint32_t version; + uint32_t horizontal_resolution; + uint32_t vertical_resolution; + pixel_format pixel_format; + pixel_bitmask pixel_information; + uint32_t pixels_per_scanline; +}; + +struct graphics_output_mode +{ + uint32_t max_mode; + uint32_t mode; + graphics_output_mode_info *info; + uint64_t size_of_info; + uintptr_t frame_buffer_base; + uint64_t frame_buffer_size; +}; + +enum class attribute : uint64_t +{ + black, + blue, + green, + cyan, + red, + magenta, + brown, + light_gray, + dark_gray, + light_blue, + light_green, + light_cyan, + light_red, + light_magenta, + yellow, + white, + + background_black = 0x00, + background_blue = 0x10, + background_green = 0x20, + background_cyan = 0x30, + background_red = 0x40, + background_magenta = 0x50, + background_brown = 0x60, + background_light_gray = 0x70, +}; + +} // namespace uefi + +#endif diff --git a/include/uefi/guid.h b/include/uefi/guid.h new file mode 100644 index 0000000..112b1ec --- /dev/null +++ b/include/uefi/guid.h @@ -0,0 +1,29 @@ +#pragma once +#ifndef _uefi_guid_h_ +#define _uefi_guid_h_ + +// This Source Code Form is part of the j6-uefi-headers project and 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/. + +#include + +namespace uefi { + +struct guid +{ + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; + + inline bool operator==(const guid &other) const { + return reinterpret_cast(this)[0] == reinterpret_cast(&other)[0] + && reinterpret_cast(this)[1] == reinterpret_cast(&other)[1]; + } +}; + +} // namespace uefi + +#endif diff --git a/include/uefi/tables.h b/include/uefi/tables.h new file mode 100644 index 0000000..25b93d1 --- /dev/null +++ b/include/uefi/tables.h @@ -0,0 +1,69 @@ +#pragma once +#ifndef _uefi_tables_h_ +#define _uefi_tables_h_ + +// This Source Code Form is part of the j6-uefi-headers project and 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/. + +#include +#include +#include + +namespace uefi { + +struct runtime_services; +struct boot_services; +namespace protos { + struct simple_text_input; + struct simple_text_output; +} + +struct table_header +{ + uint64_t signature; + uint32_t revision; + uint32_t header_size; + uint32_t crc32; + uint32_t reserved; +}; + +struct configuration_table +{ + guid vendor_guid; + void *vendor_table; +}; + +struct system_table +{ + table_header header; + + char16_t *firmware_vendor; + uint32_t firmware_revision; + + handle console_in_handle; + protos::simple_text_input *con_in; + handle console_out_handle; + protos::simple_text_output *con_out; + handle standard_error_handle; + protos::simple_text_output *std_err; + + runtime_services *runtime_services; + boot_services *boot_services; + + unsigned int number_of_table_entries; + configuration_table *configuration_table; +}; + +constexpr uint32_t make_system_table_revision(int major, int minor) { + return (major << 16) | minor; +} + +constexpr uint64_t system_table_signature = 0x5453595320494249ull; +constexpr uint32_t system_table_revision = make_system_table_revision(2, 70); +constexpr uint32_t specification_revision = system_table_revision; + +} // namespace uefi + +#endif diff --git a/include/uefi/types.h b/include/uefi/types.h new file mode 100644 index 0000000..5ab9960 --- /dev/null +++ b/include/uefi/types.h @@ -0,0 +1,34 @@ +#pragma once +#ifndef _uefi_types_h_ +#define _uefi_types_h_ + +// This Source Code Form is part of the j6-uefi-headers project and 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/. + +#include + +namespace uefi { + +using handle = void *; + +constexpr uint64_t error_bit = 0x8000000000000000ull; +constexpr uint64_t make_error(uint64_t e) { return e|error_bit; } + +enum class status : uint64_t +{ + success = 0, + +#define STATUS_WARNING(name, num) name = num, +#define STATUS_ERROR(name, num) name = make_error(num), +#include "uefi/errors.inc" +#undef STATUS_WARNING +#undef STATUS_ERROR +}; + +inline bool is_error(status s) { return static_cast(s) & error_bit; } + +} // namespace uefi + +#endif diff --git a/protos.yaml b/protos.yaml new file mode 100644 index 0000000..4d1475f --- /dev/null +++ b/protos.yaml @@ -0,0 +1,103 @@ +- name: loaded_image + guid: "0x5b1b31a1,0x9562,0x11d2,{0x8e,0x3f,0x00,0xa0,0xc9,0x69,0x72,0x3b}" + pre_data: + - name: revision + type: uint32_t + - name: parent_handle + type: uefi::handle + - name: system_table + type: uefi::system_table * + - name: device_handle + type: uefi::handle + - name: file_path + type: uefi::protos::device_path * + - name: reserved + type: void * + - name: load_options_size + type: uint32_t + - name: load_options + type: void * + - name: image_base + type: void * + - name: image_size + type: uint64_t + - name: image_code_type + type: uefi::memory_type + - name: image_data_type + type: uefi::memory_type + methods: + - name: unload + skip_this: true + args: + - name: image_handle + type: uefi::handle + +- name: simple_text_output + guid: "0x387477c2,0x69c7,0x11d2,{0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b}" + headers: + - uefi/graphics.h + methods: + - name: reset + args: + - name: extended_verification + type: bool + - name: output_string + args: + - name: string + type: const wchar_t * + - name: test_string + args: + - name: string + type: const wchar_t * + - name: query_mode + args: + - name: mode_number + type: uint64_t + - name: columns + type: uint64_t * + - name: rows + type: uint64_t * + - name: set_mode + args: + - name: mode_number + type: uint64_t + - name: set_attribute + args: + - name: attribute + type: uefi::attribute + - name: clear_screen + - name: set_cursor_position + args: + - name: column + type: uint64_t + - name: row + type: uint64_t + - name: enable_cursor + args: + - name: visible + type: bool + post_data: + - name: mode + type: uefi::text_output_mode * + +- name: graphics_output + guid: "0x9042a9de,0x23dc,0x4a38,{0x96,0xfb,0x7a,0xde,0xd0,0x80,0x51,0x6a}" + headers: + - uefi/graphics.h + methods: + - name: query_mode + args: + - name: mode_number + type: uint32_t + - name: size_of_info + type: uint64_t * + - name: info + type: uefi::graphics_output_mode_info ** + - name: set_mode + args: + - name: mode_number + type: uint32_t + - name: blt + post_data: + - name: mode + type: uefi::graphics_output_mode *