[libc-commits] [libc] [libc][uefi] add crt1 (PR #132150)

Tristan Ross via libc-commits libc-commits at lists.llvm.org
Fri Mar 21 17:43:54 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 1/6] [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 2/6] [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 3/6] [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 4/6] [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 5/6] [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 6/6] [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));
 }
 }



More information about the libc-commits mailing list