[libc-commits] [libc] [libc][uefi] add crt1 (PR #132150)
Tristan Ross via libc-commits
libc-commits at lists.llvm.org
Wed Mar 26 19:53:16 PDT 2025
https://github.com/RossComputerGuy updated https://github.com/llvm/llvm-project/pull/132150
>From b12c594943843f11a785a4a51a8fd2a15529db3b Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Wed, 19 Mar 2025 22:51:20 -0700
Subject: [PATCH 01/10] [libc][uefi] add crt1
---
libc/startup/uefi/CMakeLists.txt | 46 ++++++++++++++++++++++
libc/startup/uefi/crt1.cpp | 65 ++++++++++++++++++++++++++++++++
2 files changed, 111 insertions(+)
create mode 100644 libc/startup/uefi/CMakeLists.txt
create mode 100644 libc/startup/uefi/crt1.cpp
diff --git a/libc/startup/uefi/CMakeLists.txt b/libc/startup/uefi/CMakeLists.txt
new file mode 100644
index 0000000000000..741081144001c
--- /dev/null
+++ b/libc/startup/uefi/CMakeLists.txt
@@ -0,0 +1,46 @@
+function(add_startup_object name)
+ cmake_parse_arguments(
+ "ADD_STARTUP_OBJECT"
+ "ALIAS" # Option argument
+ "SRC" # Single value arguments
+ "DEPENDS;COMPILE_OPTIONS" # Multi value arguments
+ ${ARGN}
+ )
+
+ get_fq_target_name(${name} fq_target_name)
+ if(ADD_STARTUP_OBJECT_ALIAS)
+ get_fq_deps_list(fq_dep_list ${ADD_STARTUP_OBJECT_DEPENDS})
+ add_library(${fq_target_name} ALIAS ${fq_dep_list})
+ return()
+ endif()
+
+ add_object_library(
+ ${name}
+ SRCS ${ADD_STARTUP_OBJECT_SRC}
+ COMPILE_OPTIONS ${ADD_STARTUP_OBJECT_COMPILE_OPTIONS}
+ ${ADD_STARTUP_OBJECT_UNPARSED_ARGUMENTS}
+ DEPENDS ${ADD_STARTUP_OBJECT_DEPENDS}
+ )
+ set_target_properties(
+ ${fq_target_name}
+ PROPERTIES
+ OUTPUT_NAME ${name}.o
+ )
+endfunction()
+
+add_startup_object(
+ crt1
+ SRCS
+ crt1.cpp
+)
+
+add_custom_target(libc-startup)
+set(startup_components crt1)
+foreach(target IN LISTS startup_components)
+ set(fq_target_name libc.startup.uefi.${target})
+ add_dependencies(libc-startup ${fq_target_name})
+ install(FILES $<TARGET_OBJECTS:${fq_target_name}>
+ DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
+ RENAME $<TARGET_PROPERTY:${fq_target_name},OUTPUT_NAME>
+ COMPONENT libc)
+endforeach()
diff --git a/libc/startup/uefi/crt1.cpp b/libc/startup/uefi/crt1.cpp
new file mode 100644
index 0000000000000..9da8b8c1e9556
--- /dev/null
+++ b/libc/startup/uefi/crt1.cpp
@@ -0,0 +1,65 @@
+//===-- Implementation of crt for UEFI ----------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--------------------------------------------------------------------===//
+
+#include "include/llvm-libc-macros/stdlib-macros.h"
+#include "include/llvm-libc-types/EFI_HANDLE.h"
+#include "include/llvm-libc-types/EFI_STATUS.h"
+#include "include/llvm-libc-types/EFI_SYSTEM_TABLE.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+using InitCallback = void(void);
+using FiniCallback = void(void);
+extern "C" InitCallback *__CTOR_LIST__[];
+extern "C" FiniCallback *__DTOR_LIST__[];
+
+static void call_init_array_callbacks() {
+ unsigned long nptrs = (unsigned long)__CTOR_LIST__[0];
+ unsigned long i;
+
+ if (nptrs == ~0ul) {
+ for (nptrs = 0; __CTOR_LIST__[nptrs + 1] != 0; nptrs++)
+ ;
+ }
+
+ for (i = nptrs; i >= 1; i--) {
+ __CTOR_LIST__[i]();
+ }
+}
+
+static void call_fini_array_callbacks() {
+ unsigned long nptrs = 0;
+
+ for (nptrs = 0; __DTOR_LIST__[nptrs + 1] != 0; nptrs++)
+ ;
+
+ for (unsigned long i = nptrs; i >= 1; i--) {
+ __DTOR_LIST__[i]();
+ }
+}
+} // namespace LIBC_NAMESPACE_DECL
+
+EFI_HANDLE efi_image_handle;
+EFI_SYSTEM_TABLE *efi_system_table;
+
+extern "C" int main(int argc, char **argv, char **envp);
+
+extern "C" EFI_STATUS EfiMain(EFI_HANDLE ImageHandle,
+ EFI_SYSTEM_TABLE *SystemTable) {
+ efi_image_handle = ImageHandle;
+ efi_system_table = SystemTable;
+
+ LIBC_NAMESPACE::call_init_array_callbacks();
+
+ main(0, NULL, NULL);
+
+ LIBC_NAMESPACE::call_fini_array_callbacks();
+ // TODO: convert the return value of main to EFI_STATUS
+ return 0; // TODO: EFI_SUCCESS
+}
>From dee779f8e6290ada6d31c9aec02cb636ebaa8cfa Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Thu, 20 Mar 2025 13:37:37 -0700
Subject: [PATCH 02/10] [libc][uefi] drop mingw compat in crt0
---
libc/startup/uefi/crt1.cpp | 36 ------------------------------------
1 file changed, 36 deletions(-)
diff --git a/libc/startup/uefi/crt1.cpp b/libc/startup/uefi/crt1.cpp
index 9da8b8c1e9556..0ebd943cdc527 100644
--- a/libc/startup/uefi/crt1.cpp
+++ b/libc/startup/uefi/crt1.cpp
@@ -12,39 +12,6 @@
#include "include/llvm-libc-types/EFI_SYSTEM_TABLE.h"
#include "src/__support/macros/config.h"
-namespace LIBC_NAMESPACE_DECL {
-
-using InitCallback = void(void);
-using FiniCallback = void(void);
-extern "C" InitCallback *__CTOR_LIST__[];
-extern "C" FiniCallback *__DTOR_LIST__[];
-
-static void call_init_array_callbacks() {
- unsigned long nptrs = (unsigned long)__CTOR_LIST__[0];
- unsigned long i;
-
- if (nptrs == ~0ul) {
- for (nptrs = 0; __CTOR_LIST__[nptrs + 1] != 0; nptrs++)
- ;
- }
-
- for (i = nptrs; i >= 1; i--) {
- __CTOR_LIST__[i]();
- }
-}
-
-static void call_fini_array_callbacks() {
- unsigned long nptrs = 0;
-
- for (nptrs = 0; __DTOR_LIST__[nptrs + 1] != 0; nptrs++)
- ;
-
- for (unsigned long i = nptrs; i >= 1; i--) {
- __DTOR_LIST__[i]();
- }
-}
-} // namespace LIBC_NAMESPACE_DECL
-
EFI_HANDLE efi_image_handle;
EFI_SYSTEM_TABLE *efi_system_table;
@@ -55,11 +22,8 @@ extern "C" EFI_STATUS EfiMain(EFI_HANDLE ImageHandle,
efi_image_handle = ImageHandle;
efi_system_table = SystemTable;
- LIBC_NAMESPACE::call_init_array_callbacks();
-
main(0, NULL, NULL);
- LIBC_NAMESPACE::call_fini_array_callbacks();
// TODO: convert the return value of main to EFI_STATUS
return 0; // TODO: EFI_SUCCESS
}
>From 7428fe0c8e50ae8f8d0fb009db4e23d154c85128 Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Fri, 21 Mar 2025 11:01:50 -0700
Subject: [PATCH 03/10] [libc][uefi] update efi symbols in efi main
---
libc/include/Uefi.yaml | 4 ++--
libc/startup/uefi/crt1.cpp | 23 +++++++++++++----------
2 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/libc/include/Uefi.yaml b/libc/include/Uefi.yaml
index 9f38ff3f4a497..0bc62cbe81333 100644
--- a/libc/include/Uefi.yaml
+++ b/libc/include/Uefi.yaml
@@ -10,7 +10,7 @@ types:
enums: []
functions: []
objects:
- - object_name: efi_system_table
+ - object_name: __llvm_libc_efi_system_table
object_type: EFI_SYSTEM_TABLE *
- - object_name: efi_image_handle
+ - object_name: __llvm_libc_efi_image_handle
object_type: EFI_HANDLE
diff --git a/libc/startup/uefi/crt1.cpp b/libc/startup/uefi/crt1.cpp
index 0ebd943cdc527..01d4e701583c0 100644
--- a/libc/startup/uefi/crt1.cpp
+++ b/libc/startup/uefi/crt1.cpp
@@ -1,10 +1,10 @@
-//===-- Implementation of crt for UEFI ----------------------------------===//
+//===-- Implementation of crt for UEFI ------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
-//===--------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
#include "include/llvm-libc-macros/stdlib-macros.h"
#include "include/llvm-libc-types/EFI_HANDLE.h"
@@ -12,18 +12,21 @@
#include "include/llvm-libc-types/EFI_SYSTEM_TABLE.h"
#include "src/__support/macros/config.h"
-EFI_HANDLE efi_image_handle;
-EFI_SYSTEM_TABLE *efi_system_table;
+extern "C" {
+EFI_HANDLE __llvm_libc_efi_image_handle;
+EFI_SYSTEM_TABLE *__llvm_libc_efi_system_table;
-extern "C" int main(int argc, char **argv, char **envp);
+int main(int argc, char **argv, char **envp);
-extern "C" EFI_STATUS EfiMain(EFI_HANDLE ImageHandle,
- EFI_SYSTEM_TABLE *SystemTable) {
- efi_image_handle = ImageHandle;
- efi_system_table = SystemTable;
+EFI_STATUS EfiMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
+ __llvm_libc_efi_image_handle = ImageHandle;
+ __llvm_libc_efi_system_table = SystemTable;
- main(0, NULL, NULL);
+ // TODO: we need the EFI_SHELL_PROTOCOL, malloc, free, and UTF16 -> UTF8
+ // conversion.
+ main(0, nullptr, nullptr);
// TODO: convert the return value of main to EFI_STATUS
return 0; // TODO: EFI_SUCCESS
}
+}
>From bf566bba857dd7e4619f62a52ca2b2b340df72cb Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Fri, 21 Mar 2025 11:50:42 -0700
Subject: [PATCH 04/10] [libc][uefi] add status codes
---
libc/include/llvm-libc-types/EFI_STATUS.h | 44 +++++++++++++++++++++++
libc/startup/uefi/crt1.cpp | 2 +-
2 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/libc/include/llvm-libc-types/EFI_STATUS.h b/libc/include/llvm-libc-types/EFI_STATUS.h
index f7fa6e52381e1..303c9e6d08487 100644
--- a/libc/include/llvm-libc-types/EFI_STATUS.h
+++ b/libc/include/llvm-libc-types/EFI_STATUS.h
@@ -13,4 +13,48 @@
typedef size_t EFI_STATUS;
+#define EFI_SUCCESS 0
+
+#define EFI_LOAD_ERROR 1
+#define EFI_INVALID_PARAMETER 2
+#define EFI_UNSUPPORTED 3
+#define EFI_BAD_BUFFER_SIZE 4
+#define EFI_BUFFER_TOO_SMALL 5
+#define EFI_NOT_READY 6
+#define EFI_DEVICE_ERROR 7
+#define EFI_WRITE_PROTECTED 8
+#define EFI_OUT_OF_RESOURCES 9
+#define EFI_VOLUME_CORRUPTED 10
+#define EFI_VOLUME_FULL 11
+#define EFI_NO_MEDIA 12
+#define EFI_MEDIA_CHANGED 13
+#define EFI_NOT_FOUND 14
+#define EFI_ACCESS_DENIED 15
+#define EFI_NO_RESPONSE 16
+#define EFI_NO_MAPPING 17
+#define EFI_TIMEOUT 18
+#define EFI_NOT_STARTED 19
+#define EFI_ALREADY_STARTED 20
+#define EFI_ABORTED 21
+#define EFI_ICMP_ERROR 22
+#define EFI_TFTP_ERROR 23
+#define EFI_PROTOCOL_ERROR 24
+#define EFI_INCOMPATIBLE_VERSION 25
+#define EFI_SECURITY_VIOLATION 26
+#define EFI_CRC_ERROR 27
+#define EFI_END_OF_MEDIA 28
+#define EFI_END_OF_FILE 31
+#define EFI_INVALID_LANGUAGE 32
+#define EFI_COMPROMISED_DATA 33
+#define EFI_IP_ADDRESS_CONFLICT 34
+#define EFI_HTTP_ERROR 35
+
+#define EFI_WARN_UNKNOWN_GLYPH 1
+#define EFI_WARN_DELETE_FAILURE 2
+#define EFI_WARN_WRITE_FAILURE 3
+#define EFI_WARN_BUFFER_TOO_SMALL 4
+#define EFI_WARN_STALE_DATA 5
+#define EFI_WARN_FILE_SYSTEM 6
+#define EFI_WARN_RESET_REQUIRED 7
+
#endif // LLVM_LIBC_TYPES_EFI_STATUS_H
diff --git a/libc/startup/uefi/crt1.cpp b/libc/startup/uefi/crt1.cpp
index 01d4e701583c0..1d756d06585c3 100644
--- a/libc/startup/uefi/crt1.cpp
+++ b/libc/startup/uefi/crt1.cpp
@@ -27,6 +27,6 @@ EFI_STATUS EfiMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
main(0, nullptr, nullptr);
// TODO: convert the return value of main to EFI_STATUS
- return 0; // TODO: EFI_SUCCESS
+ return EFI_SUCCESS;
}
}
>From 40a26a04e926f64443fd87c7abbf019322d44664 Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Fri, 21 Mar 2025 17:02:24 -0700
Subject: [PATCH 05/10] [libc][uefi] fix Uefi.h install name
---
libc/include/CMakeLists.txt | 1 -
1 file changed, 1 deletion(-)
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index 409737762ac41..1212a6ce50ee2 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -740,7 +740,6 @@ add_header_macro(
add_header_macro(
uefi
../libc/include/Uefi.yaml
- Uefi.h.def
Uefi.h
DEPENDS
.llvm_libc_common_h
>From e5a469267831d69c2750b9075fe7dd3ebaa0684a Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Fri, 21 Mar 2025 17:43:30 -0700
Subject: [PATCH 06/10] [libc][uefi] add errno and uefi status conversion
---
libc/src/__support/OSUtil/uefi/CMakeLists.txt | 4 +
libc/src/__support/OSUtil/uefi/error.cpp | 88 +++++++++++++++++++
libc/src/__support/OSUtil/uefi/error.h | 22 +++++
libc/startup/uefi/CMakeLists.txt | 4 +-
libc/startup/uefi/crt1.cpp | 6 +-
5 files changed, 119 insertions(+), 5 deletions(-)
create mode 100644 libc/src/__support/OSUtil/uefi/error.cpp
create mode 100644 libc/src/__support/OSUtil/uefi/error.h
diff --git a/libc/src/__support/OSUtil/uefi/CMakeLists.txt b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
index 79ec8ab602456..3a3cdecd42505 100644
--- a/libc/src/__support/OSUtil/uefi/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
@@ -3,9 +3,13 @@ add_object_library(
SRCS
io.cpp
exit.cpp
+ error.cpp
HDRS
io.h
+ error.h
DEPENDS
+ libc.include.errno
+ libc.include.limits
libc.src.__support.common
libc.src.__support.CPP.string_view
)
diff --git a/libc/src/__support/OSUtil/uefi/error.cpp b/libc/src/__support/OSUtil/uefi/error.cpp
new file mode 100644
index 0000000000000..9e0a00fb9ca78
--- /dev/null
+++ b/libc/src/__support/OSUtil/uefi/error.cpp
@@ -0,0 +1,88 @@
+//===---------- UEFI implementation of error utils ------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===-------------------------------------------------------------------===//
+
+#include "error.h"
+#include "errno.h"
+#include "limits.h"
+#include "src/__support/macros/config.h"
+
+#define ERROR_BIT (sizeof(size_t) * CHAR_BIT)
+
+namespace LIBC_NAMESPACE_DECL {
+
+static const struct {
+ EFI_STATUS status;
+ int errno;
+} uefi_status_errno_map[] = {
+ {EFI_SUCCESS, 0},
+ {ERROR_BIT | EFI_LOAD_ERROR, EINVAL},
+ {ERROR_BIT | EFI_INVALID_PARAMETER, EINVAL},
+ {ERROR_BIT | EFI_BAD_BUFFER_SIZE, EINVAL},
+ {ERROR_BIT | EFI_NOT_READY, EBUSY},
+ {ERROR_BIT | EFI_DEVICE_ERROR, EIO},
+ {ERROR_BIT | EFI_WRITE_PROTECTED, EPERM},
+ {ERROR_BIT | EFI_OUT_OF_RESOURCES, ENOMEM},
+ {ERROR_BIT | EFI_VOLUME_CORRUPTED, EROFS},
+ {ERROR_BIT | EFI_VOLUME_FULL, ENOSPC},
+ {ERROR_BIT | EFI_NO_MEDIA, ENODEV},
+ {ERROR_BIT | EFI_MEDIA_CHANGED, ENXIO},
+ {ERROR_BIT | EFI_NOT_FOUND, ENOENT},
+ {ERROR_BIT | EFI_ACCESS_DENIED, EACCES},
+ {ERROR_BIT | EFI_NO_RESPONSE, EBUSY},
+ {ERROR_BIT | EFI_NO_MAPPING, ENODEV},
+ {ERROR_BIT | EFI_TIMEOUT, EBUSY},
+ {ERROR_BIT | EFI_NOT_STARTED, EAGAIN},
+ {ERROR_BIT | EFI_ALREADY_STARTED, EINVAL},
+ {ERROR_BIT | EFI_ABORTED, EFAULT},
+ {ERROR_BIT | EFI_ICMP_ERROR, EIO},
+ {ERROR_BIT | EFI_TFTP_ERROR, EIO},
+ {ERROR_BIT | EFI_PROTOCOL_ERROR, EINVAL},
+ {ERROR_BIT | EFI_INCOMPATIBLE_VERSION, EINVAL},
+ {ERROR_BIT | EFI_SECURITY_VIOLATION, EPERM},
+ {ERROR_BIT | EFI_CRC_ERROR, EINVAL},
+ {ERROR_BIT | EFI_END_OF_MEDIA, EPIPE},
+ {ERROR_BIT | EFI_END_OF_FILE, EPIPE},
+ {ERROR_BIT | EFI_INVALID_LANGUAGE, EINVAL},
+ {ERROR_BIT | EFI_COMPROMISED_DATA, EINVAL},
+ {ERROR_BIT | EFI_IP_ADDRESS_CONFLICT, EINVAL},
+ {ERROR_BIT | EFI_HTTP_ERROR, EIO},
+ {EFI_WARN_UNKNOWN_GLYPH, EINVAL},
+ {EFI_WARN_DELETE_FAILURE, EROFS},
+ {EFI_WARN_WRITE_FAILURE, EROFS},
+ {EFI_WARN_BUFFER_TOO_SMALL, E2BIG},
+ {EFI_WARN_STALE_DATA, EINVAL},
+ {EFI_WARN_FILE_SYSTEM, EROFS},
+ {EFI_WARN_RESET_REQUIRED, EINTR},
+};
+
+static constexpr size_t uefi_status_errno_map_length =
+ sizeof(uefi_status_errno_map) / sizeof(uefi_status_errno_map[0]);
+
+int uefi_status_to_errno(EFI_STATUS status) {
+ for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
+ if (uefi_status_errno_map[i].status == status) {
+ return uefi_status_errno_map[i].errno;
+ }
+ }
+
+ // Unknown type
+ __builtin_unreachable();
+}
+
+EFI_STATUS errno_to_uefi_status(int errno) {
+ for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
+ if (uefi_status_errno_map[i].errno == errno) {
+ return uefi_status_errno_map[i].status;
+ }
+ }
+
+ // Unknown type
+ __builtin_unreachable();
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/OSUtil/uefi/error.h b/libc/src/__support/OSUtil/uefi/error.h
new file mode 100644
index 0000000000000..a878f3e818d61
--- /dev/null
+++ b/libc/src/__support/OSUtil/uefi/error.h
@@ -0,0 +1,22 @@
+//===---------- UEFI implementation of error utils ------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===-------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
+#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
+
+#include "include/llvm-libc-types/EFI_STATUS.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+int uefi_status_to_errno(EFI_STATUS status);
+EFI_STATUS errno_to_uefi_status(int errno);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
diff --git a/libc/startup/uefi/CMakeLists.txt b/libc/startup/uefi/CMakeLists.txt
index 741081144001c..b4e45a3e4e21e 100644
--- a/libc/startup/uefi/CMakeLists.txt
+++ b/libc/startup/uefi/CMakeLists.txt
@@ -31,7 +31,9 @@ endfunction()
add_startup_object(
crt1
SRCS
- crt1.cpp
+ crt1.cpp
+ DEPENDS
+ libc.src.__support.OSUtil.uefi.uefi_util
)
add_custom_target(libc-startup)
diff --git a/libc/startup/uefi/crt1.cpp b/libc/startup/uefi/crt1.cpp
index 1d756d06585c3..dd2f404fc1496 100644
--- a/libc/startup/uefi/crt1.cpp
+++ b/libc/startup/uefi/crt1.cpp
@@ -10,6 +10,7 @@
#include "include/llvm-libc-types/EFI_HANDLE.h"
#include "include/llvm-libc-types/EFI_STATUS.h"
#include "include/llvm-libc-types/EFI_SYSTEM_TABLE.h"
+#include "src/__support/OSUtil/uefi/error.h"
#include "src/__support/macros/config.h"
extern "C" {
@@ -24,9 +25,6 @@ EFI_STATUS EfiMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
// TODO: we need the EFI_SHELL_PROTOCOL, malloc, free, and UTF16 -> UTF8
// conversion.
- main(0, nullptr, nullptr);
-
- // TODO: convert the return value of main to EFI_STATUS
- return EFI_SUCCESS;
+ return LIBC_NAMESPACE::errno_to_uefi_status(main(0, nullptr, nullptr));
}
}
>From d963ce2fc4ed9778521a8d461e6acb1d2616d926 Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Fri, 21 Mar 2025 21:09:40 -0700
Subject: [PATCH 07/10] [libc][uefi] fix error, exit, and io OSUtil support
compilation
---
libc/src/__support/OSUtil/uefi/CMakeLists.txt | 1 +
libc/src/__support/OSUtil/uefi/error.cpp | 18 +++++++++---------
libc/src/__support/OSUtil/uefi/exit.cpp | 5 +++--
libc/src/__support/OSUtil/uefi/io.cpp | 16 +++++++++++-----
4 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/libc/src/__support/OSUtil/uefi/CMakeLists.txt b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
index 3a3cdecd42505..08923e55413c9 100644
--- a/libc/src/__support/OSUtil/uefi/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
@@ -10,6 +10,7 @@ add_object_library(
DEPENDS
libc.include.errno
libc.include.limits
+ libc.include.uefi
libc.src.__support.common
libc.src.__support.CPP.string_view
)
diff --git a/libc/src/__support/OSUtil/uefi/error.cpp b/libc/src/__support/OSUtil/uefi/error.cpp
index 9e0a00fb9ca78..36fc58a0be4de 100644
--- a/libc/src/__support/OSUtil/uefi/error.cpp
+++ b/libc/src/__support/OSUtil/uefi/error.cpp
@@ -15,9 +15,9 @@
namespace LIBC_NAMESPACE_DECL {
-static const struct {
+static constexpr struct errno_efi_status_entry {
EFI_STATUS status;
- int errno;
+ int errno_value;
} uefi_status_errno_map[] = {
{EFI_SUCCESS, 0},
{ERROR_BIT | EFI_LOAD_ERROR, EINVAL},
@@ -65,20 +65,20 @@ static constexpr size_t uefi_status_errno_map_length =
int uefi_status_to_errno(EFI_STATUS status) {
for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
- if (uefi_status_errno_map[i].status == status) {
- return uefi_status_errno_map[i].errno;
- }
+ const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
+ if (entry->status == status)
+ return entry->errno_value;
}
// Unknown type
__builtin_unreachable();
}
-EFI_STATUS errno_to_uefi_status(int errno) {
+EFI_STATUS errno_to_uefi_status(int errno_value) {
for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
- if (uefi_status_errno_map[i].errno == errno) {
- return uefi_status_errno_map[i].status;
- }
+ const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
+ if (entry->errno_value == errno_value)
+ return entry->status;
}
// Unknown type
diff --git a/libc/src/__support/OSUtil/uefi/exit.cpp b/libc/src/__support/OSUtil/uefi/exit.cpp
index 432f69a306b79..9546c6c31b040 100644
--- a/libc/src/__support/OSUtil/uefi/exit.cpp
+++ b/libc/src/__support/OSUtil/uefi/exit.cpp
@@ -7,14 +7,15 @@
//===-----------------------------------------------------------------===//
#include "src/__support/OSUtil/exit.h"
-#include "include/Uefi.h"
+#include "Uefi.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
namespace internal {
[[noreturn]] void exit(int status) {
- efi_system_table->BootServices->Exit(efi_image_handle, status, 0, nullptr);
+ __llvm_libc_efi_system_table->BootServices->Exit(__llvm_libc_efi_image_handle,
+ status, 0, nullptr);
__builtin_unreachable();
}
diff --git a/libc/src/__support/OSUtil/uefi/io.cpp b/libc/src/__support/OSUtil/uefi/io.cpp
index 756c5aaf8f452..d72af60727c54 100644
--- a/libc/src/__support/OSUtil/uefi/io.cpp
+++ b/libc/src/__support/OSUtil/uefi/io.cpp
@@ -8,19 +8,24 @@
#include "io.h"
+#include "Uefi.h"
#include "src/__support/CPP/string_view.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
-ssize_t read_from_stdin(char *buf, size_t size) { return 0; }
+ssize_t read_from_stdin([[gnu::unused]] char *buf,
+ [[gnu::unused]] size_t size) {
+ return 0;
+}
void write_to_stdout(cpp::string_view msg) {
// TODO: use mbstowcs once implemented
for (size_t i = 0; i < msg.size(); i++) {
char16_t e[2] = {msg[i], 0};
- efi_system_table->ConOut->OutputString(
- efi_system_table->ConOut, reinterpret_cast<const char16_t *>(&e));
+ __llvm_libc_efi_system_table->ConOut->OutputString(
+ __llvm_libc_efi_system_table->ConOut,
+ reinterpret_cast<const char16_t *>(&e));
}
}
@@ -28,8 +33,9 @@ void write_to_stderr(cpp::string_view msg) {
// TODO: use mbstowcs once implemented
for (size_t i = 0; i < msg.size(); i++) {
char16_t e[2] = {msg[i], 0};
- efi_system_table->StdErr->OutputString(
- efi_system_table->StdErr, reinterpret_cast<const char16_t *>(&e));
+ __llvm_libc_efi_system_table->StdErr->OutputString(
+ __llvm_libc_efi_system_table->StdErr,
+ reinterpret_cast<const char16_t *>(&e));
}
}
>From 4ccc169e2170fb49449a45f788af771ade4df01d Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Fri, 21 Mar 2025 22:39:25 -0700
Subject: [PATCH 08/10] [libc][uefi] get error codes working
---
libc/include/llvm-libc-types/CMakeLists.txt | 2 +-
libc/include/llvm-libc-types/EFI_STATUS.h | 4 +-
libc/src/__support/OSUtil/uefi/CMakeLists.txt | 4 -
libc/src/__support/OSUtil/uefi/error.cpp | 88 -------------------
libc/src/__support/OSUtil/uefi/error.h | 78 +++++++++++++++-
5 files changed, 79 insertions(+), 97 deletions(-)
delete mode 100644 libc/src/__support/OSUtil/uefi/error.cpp
diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt
index bf8bdfe89943c..a98ae69e89d47 100644
--- a/libc/include/llvm-libc-types/CMakeLists.txt
+++ b/libc/include/llvm-libc-types/CMakeLists.txt
@@ -185,7 +185,7 @@ add_header(EFI_HANDLE HDR EFI_HANDLE.h)
add_header(EFI_TIME HDR EFI_TIME.h DEPENDS libc.include.llvm-libc-macros.stdint_macros)
add_header(EFI_TIMER_DELAY HDR EFI_TIMER_DELAY.h)
add_header(EFI_TPL HDR EFI_TPL.h DEPENDS .size_t)
-add_header(EFI_STATUS HDR EFI_STATUS.h DEPENDS .size_t)
+add_header(EFI_STATUS HDR EFI_STATUS.h DEPENDS libc.include.llvm-libc-macros.stdint_macros)
add_header(EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
HDR
diff --git a/libc/include/llvm-libc-types/EFI_STATUS.h b/libc/include/llvm-libc-types/EFI_STATUS.h
index 303c9e6d08487..bb9542bed8efc 100644
--- a/libc/include/llvm-libc-types/EFI_STATUS.h
+++ b/libc/include/llvm-libc-types/EFI_STATUS.h
@@ -9,9 +9,9 @@
#ifndef LLVM_LIBC_TYPES_EFI_STATUS_H
#define LLVM_LIBC_TYPES_EFI_STATUS_H
-#include "size_t.h"
+#include "../llvm-libc-macros/stdint-macros.h"
-typedef size_t EFI_STATUS;
+typedef uintptr_t EFI_STATUS;
#define EFI_SUCCESS 0
diff --git a/libc/src/__support/OSUtil/uefi/CMakeLists.txt b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
index 08923e55413c9..617c0002f9476 100644
--- a/libc/src/__support/OSUtil/uefi/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
@@ -3,13 +3,9 @@ add_object_library(
SRCS
io.cpp
exit.cpp
- error.cpp
HDRS
io.h
- error.h
DEPENDS
- libc.include.errno
- libc.include.limits
libc.include.uefi
libc.src.__support.common
libc.src.__support.CPP.string_view
diff --git a/libc/src/__support/OSUtil/uefi/error.cpp b/libc/src/__support/OSUtil/uefi/error.cpp
deleted file mode 100644
index 36fc58a0be4de..0000000000000
--- a/libc/src/__support/OSUtil/uefi/error.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-//===---------- UEFI implementation of error utils ------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===-------------------------------------------------------------------===//
-
-#include "error.h"
-#include "errno.h"
-#include "limits.h"
-#include "src/__support/macros/config.h"
-
-#define ERROR_BIT (sizeof(size_t) * CHAR_BIT)
-
-namespace LIBC_NAMESPACE_DECL {
-
-static constexpr struct errno_efi_status_entry {
- EFI_STATUS status;
- int errno_value;
-} uefi_status_errno_map[] = {
- {EFI_SUCCESS, 0},
- {ERROR_BIT | EFI_LOAD_ERROR, EINVAL},
- {ERROR_BIT | EFI_INVALID_PARAMETER, EINVAL},
- {ERROR_BIT | EFI_BAD_BUFFER_SIZE, EINVAL},
- {ERROR_BIT | EFI_NOT_READY, EBUSY},
- {ERROR_BIT | EFI_DEVICE_ERROR, EIO},
- {ERROR_BIT | EFI_WRITE_PROTECTED, EPERM},
- {ERROR_BIT | EFI_OUT_OF_RESOURCES, ENOMEM},
- {ERROR_BIT | EFI_VOLUME_CORRUPTED, EROFS},
- {ERROR_BIT | EFI_VOLUME_FULL, ENOSPC},
- {ERROR_BIT | EFI_NO_MEDIA, ENODEV},
- {ERROR_BIT | EFI_MEDIA_CHANGED, ENXIO},
- {ERROR_BIT | EFI_NOT_FOUND, ENOENT},
- {ERROR_BIT | EFI_ACCESS_DENIED, EACCES},
- {ERROR_BIT | EFI_NO_RESPONSE, EBUSY},
- {ERROR_BIT | EFI_NO_MAPPING, ENODEV},
- {ERROR_BIT | EFI_TIMEOUT, EBUSY},
- {ERROR_BIT | EFI_NOT_STARTED, EAGAIN},
- {ERROR_BIT | EFI_ALREADY_STARTED, EINVAL},
- {ERROR_BIT | EFI_ABORTED, EFAULT},
- {ERROR_BIT | EFI_ICMP_ERROR, EIO},
- {ERROR_BIT | EFI_TFTP_ERROR, EIO},
- {ERROR_BIT | EFI_PROTOCOL_ERROR, EINVAL},
- {ERROR_BIT | EFI_INCOMPATIBLE_VERSION, EINVAL},
- {ERROR_BIT | EFI_SECURITY_VIOLATION, EPERM},
- {ERROR_BIT | EFI_CRC_ERROR, EINVAL},
- {ERROR_BIT | EFI_END_OF_MEDIA, EPIPE},
- {ERROR_BIT | EFI_END_OF_FILE, EPIPE},
- {ERROR_BIT | EFI_INVALID_LANGUAGE, EINVAL},
- {ERROR_BIT | EFI_COMPROMISED_DATA, EINVAL},
- {ERROR_BIT | EFI_IP_ADDRESS_CONFLICT, EINVAL},
- {ERROR_BIT | EFI_HTTP_ERROR, EIO},
- {EFI_WARN_UNKNOWN_GLYPH, EINVAL},
- {EFI_WARN_DELETE_FAILURE, EROFS},
- {EFI_WARN_WRITE_FAILURE, EROFS},
- {EFI_WARN_BUFFER_TOO_SMALL, E2BIG},
- {EFI_WARN_STALE_DATA, EINVAL},
- {EFI_WARN_FILE_SYSTEM, EROFS},
- {EFI_WARN_RESET_REQUIRED, EINTR},
-};
-
-static constexpr size_t uefi_status_errno_map_length =
- sizeof(uefi_status_errno_map) / sizeof(uefi_status_errno_map[0]);
-
-int uefi_status_to_errno(EFI_STATUS status) {
- for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
- const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
- if (entry->status == status)
- return entry->errno_value;
- }
-
- // Unknown type
- __builtin_unreachable();
-}
-
-EFI_STATUS errno_to_uefi_status(int errno_value) {
- for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
- const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
- if (entry->errno_value == errno_value)
- return entry->status;
- }
-
- // Unknown type
- __builtin_unreachable();
-}
-
-} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/OSUtil/uefi/error.h b/libc/src/__support/OSUtil/uefi/error.h
index a878f3e818d61..890fbb353b255 100644
--- a/libc/src/__support/OSUtil/uefi/error.h
+++ b/libc/src/__support/OSUtil/uefi/error.h
@@ -9,13 +9,87 @@
#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
+#include "errno.h"
#include "include/llvm-libc-types/EFI_STATUS.h"
+#include "limits.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
-int uefi_status_to_errno(EFI_STATUS status);
-EFI_STATUS errno_to_uefi_status(int errno);
+#define EFI_ERROR_MAX_BIT (1 << (sizeof(EFI_STATUS) * sizeof(char) - 1))
+#define EFI_ENCODE_ERROR(value) \
+ (EFI_ERROR_MAX_BIT | (EFI_ERROR_MAX_BIT >> 2) | (value))
+#define EFI_ENCODE_WARNING(value) ((EFI_ERROR_MAX_BIT >> 2) | (value))
+
+static constexpr struct errno_efi_status_entry {
+ EFI_STATUS status;
+ int errno_value;
+} uefi_status_errno_map[] = {
+ {EFI_SUCCESS, 0},
+ {EFI_ENCODE_ERROR(EFI_LOAD_ERROR), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_INVALID_PARAMETER), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_BAD_BUFFER_SIZE), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_NOT_READY), EBUSY},
+ {EFI_ENCODE_ERROR(EFI_DEVICE_ERROR), EIO},
+ {EFI_ENCODE_ERROR(EFI_WRITE_PROTECTED), EPERM},
+ {EFI_ENCODE_ERROR(EFI_OUT_OF_RESOURCES), ENOMEM},
+ {EFI_ENCODE_ERROR(EFI_VOLUME_CORRUPTED), EROFS},
+ {EFI_ENCODE_ERROR(EFI_VOLUME_FULL), ENOSPC},
+ {EFI_ENCODE_ERROR(EFI_NO_MEDIA), ENODEV},
+ {EFI_ENCODE_ERROR(EFI_MEDIA_CHANGED), ENXIO},
+ {EFI_ENCODE_ERROR(EFI_NOT_FOUND), ENOENT},
+ {EFI_ENCODE_ERROR(EFI_ACCESS_DENIED), EACCES},
+ {EFI_ENCODE_ERROR(EFI_NO_RESPONSE), EBUSY},
+ {EFI_ENCODE_ERROR(EFI_NO_MAPPING), ENODEV},
+ {EFI_ENCODE_ERROR(EFI_TIMEOUT), EBUSY},
+ {EFI_ENCODE_ERROR(EFI_NOT_STARTED), EAGAIN},
+ {EFI_ENCODE_ERROR(EFI_ALREADY_STARTED), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_ABORTED), EFAULT},
+ {EFI_ENCODE_ERROR(EFI_ICMP_ERROR), EIO},
+ {EFI_ENCODE_ERROR(EFI_TFTP_ERROR), EIO},
+ {EFI_ENCODE_ERROR(EFI_PROTOCOL_ERROR), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_INCOMPATIBLE_VERSION), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_SECURITY_VIOLATION), EPERM},
+ {EFI_ENCODE_ERROR(EFI_CRC_ERROR), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_END_OF_MEDIA), EPIPE},
+ {EFI_ENCODE_ERROR(EFI_END_OF_FILE), EPIPE},
+ {EFI_ENCODE_ERROR(EFI_INVALID_LANGUAGE), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_COMPROMISED_DATA), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_IP_ADDRESS_CONFLICT), EINVAL},
+ {EFI_ENCODE_ERROR(EFI_HTTP_ERROR), EIO},
+ {EFI_ENCODE_WARNING(EFI_WARN_UNKNOWN_GLYPH), EINVAL},
+ {EFI_ENCODE_WARNING(EFI_WARN_DELETE_FAILURE), EROFS},
+ {EFI_ENCODE_WARNING(EFI_WARN_WRITE_FAILURE), EROFS},
+ {EFI_ENCODE_WARNING(EFI_WARN_BUFFER_TOO_SMALL), E2BIG},
+ {EFI_ENCODE_WARNING(EFI_WARN_STALE_DATA), EINVAL},
+ {EFI_ENCODE_WARNING(EFI_WARN_FILE_SYSTEM), EROFS},
+ {EFI_ENCODE_WARNING(EFI_WARN_RESET_REQUIRED), EINTR},
+};
+
+static constexpr size_t uefi_status_errno_map_length =
+ sizeof(uefi_status_errno_map) / sizeof(uefi_status_errno_map[0]);
+
+static inline int uefi_status_to_errno(EFI_STATUS status) {
+ for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
+ const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
+ if (entry->status == status)
+ return entry->errno_value;
+ }
+
+ // Unknown type
+ __builtin_unreachable();
+}
+
+static inline EFI_STATUS errno_to_uefi_status(int errno_value) {
+ for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
+ const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
+ if (entry->errno_value == errno_value)
+ return entry->status;
+ }
+
+ // Unknown type
+ __builtin_unreachable();
+}
} // namespace LIBC_NAMESPACE_DECL
>From 65da577673fc2a913f0688eafd793d3d382b10a4 Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Wed, 26 Mar 2025 19:48:00 -0700
Subject: [PATCH 09/10] [libc][uefi] fix review
---
libc/src/__support/OSUtil/uefi/CMakeLists.txt | 2 +-
libc/src/__support/OSUtil/uefi/error.h | 22 +++++++++----------
libc/src/__support/OSUtil/uefi/exit.cpp | 2 +-
libc/startup/uefi/CMakeLists.txt | 1 +
4 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/libc/src/__support/OSUtil/uefi/CMakeLists.txt b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
index 617c0002f9476..e2b7fd0b33b2a 100644
--- a/libc/src/__support/OSUtil/uefi/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
@@ -6,7 +6,7 @@ add_object_library(
HDRS
io.h
DEPENDS
- libc.include.uefi
+ libc.include.llvm-libc-types.EFI_SYSTEM_TABLE
libc.src.__support.common
libc.src.__support.CPP.string_view
)
diff --git a/libc/src/__support/OSUtil/uefi/error.h b/libc/src/__support/OSUtil/uefi/error.h
index 890fbb353b255..43c611ec2d1d0 100644
--- a/libc/src/__support/OSUtil/uefi/error.h
+++ b/libc/src/__support/OSUtil/uefi/error.h
@@ -1,17 +1,17 @@
-//===---------- UEFI implementation of error utils ------------*- C++ -*-===//
+//===----------- UEFI implementation of error utils --------------*- C++-*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
-//===-------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
-#include "errno.h"
+#include <errno.h>
+#include <limits.h>
#include "include/llvm-libc-types/EFI_STATUS.h"
-#include "limits.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
@@ -24,7 +24,7 @@ namespace LIBC_NAMESPACE_DECL {
static constexpr struct errno_efi_status_entry {
EFI_STATUS status;
int errno_value;
-} uefi_status_errno_map[] = {
+} UEFI_STATUS_ERRNO_MAP[] = {
{EFI_SUCCESS, 0},
{EFI_ENCODE_ERROR(EFI_LOAD_ERROR), EINVAL},
{EFI_ENCODE_ERROR(EFI_INVALID_PARAMETER), EINVAL},
@@ -66,12 +66,12 @@ static constexpr struct errno_efi_status_entry {
{EFI_ENCODE_WARNING(EFI_WARN_RESET_REQUIRED), EINTR},
};
-static constexpr size_t uefi_status_errno_map_length =
- sizeof(uefi_status_errno_map) / sizeof(uefi_status_errno_map[0]);
+static constexpr size_t UEFI_STATUS_ERRNO_MAP_LENGTH =
+ sizeof(UEFI_STATUS_ERRNO_MAP) / sizeof(UEFI_STATUS_ERRNO_MAP[0]);
static inline int uefi_status_to_errno(EFI_STATUS status) {
- for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
- const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
+ for (size_t i = 0; i < UEFI_STATUS_ERRNO_MAP_LENGTH; i++) {
+ const struct errno_efi_status_entry *entry = &UEFI_STATUS_ERRNO_MAP[i];
if (entry->status == status)
return entry->errno_value;
}
@@ -81,8 +81,8 @@ static inline int uefi_status_to_errno(EFI_STATUS status) {
}
static inline EFI_STATUS errno_to_uefi_status(int errno_value) {
- for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
- const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
+ for (size_t i = 0; i < UEFI_STATUS_ERRNO_MAP_LENGTH; i++) {
+ const struct errno_efi_status_entry *entry = &UEFI_STATUS_ERRNO_MAP[i];
if (entry->errno_value == errno_value)
return entry->status;
}
diff --git a/libc/src/__support/OSUtil/uefi/exit.cpp b/libc/src/__support/OSUtil/uefi/exit.cpp
index 9546c6c31b040..9ee56bceff212 100644
--- a/libc/src/__support/OSUtil/uefi/exit.cpp
+++ b/libc/src/__support/OSUtil/uefi/exit.cpp
@@ -6,8 +6,8 @@
//
//===-----------------------------------------------------------------===//
+#include "include/llvm-libc-types/EFI_SYSTEM_TABLE.h"
#include "src/__support/OSUtil/exit.h"
-#include "Uefi.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/startup/uefi/CMakeLists.txt b/libc/startup/uefi/CMakeLists.txt
index b4e45a3e4e21e..cc502bcb553fc 100644
--- a/libc/startup/uefi/CMakeLists.txt
+++ b/libc/startup/uefi/CMakeLists.txt
@@ -1,3 +1,4 @@
+# TODO: Use generic "add_startup_object" https://github.com/llvm/llvm-project/issues/133156
function(add_startup_object name)
cmake_parse_arguments(
"ADD_STARTUP_OBJECT"
>From 553ec1bb004f5f40f72075e10ed8f8c57783664d Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Wed, 26 Mar 2025 19:52:57 -0700
Subject: [PATCH 10/10] [libc][uefi] fix formatting
---
libc/src/__support/OSUtil/uefi/error.h | 4 ++--
libc/src/__support/OSUtil/uefi/exit.cpp | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/libc/src/__support/OSUtil/uefi/error.h b/libc/src/__support/OSUtil/uefi/error.h
index 43c611ec2d1d0..de8c9719e72c6 100644
--- a/libc/src/__support/OSUtil/uefi/error.h
+++ b/libc/src/__support/OSUtil/uefi/error.h
@@ -9,10 +9,10 @@
#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
-#include <errno.h>
-#include <limits.h>
#include "include/llvm-libc-types/EFI_STATUS.h"
#include "src/__support/macros/config.h"
+#include <errno.h>
+#include <limits.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/__support/OSUtil/uefi/exit.cpp b/libc/src/__support/OSUtil/uefi/exit.cpp
index 9ee56bceff212..8e780a495c018 100644
--- a/libc/src/__support/OSUtil/uefi/exit.cpp
+++ b/libc/src/__support/OSUtil/uefi/exit.cpp
@@ -6,8 +6,8 @@
//
//===-----------------------------------------------------------------===//
-#include "include/llvm-libc-types/EFI_SYSTEM_TABLE.h"
#include "src/__support/OSUtil/exit.h"
+#include "include/llvm-libc-types/EFI_SYSTEM_TABLE.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
More information about the libc-commits
mailing list