[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