[libc-commits] [libc] bb69499 - [libc] init uefi (#131246)

via libc-commits libc-commits at lists.llvm.org
Fri Mar 14 20:15:28 PDT 2025


Author: Tristan Ross
Date: 2025-03-14T20:15:24-07:00
New Revision: bb694998d2f2aacc0f35384de60c82c78839b231

URL: https://github.com/llvm/llvm-project/commit/bb694998d2f2aacc0f35384de60c82c78839b231
DIFF: https://github.com/llvm/llvm-project/commit/bb694998d2f2aacc0f35384de60c82c78839b231.diff

LOG: [libc] init uefi (#131246)

Initial UEFI OS target support after the headers. This just defines
enough that stuff might try and compile. Test with:
```
$ cmake -S llvm -B build -G Ninja -DLLVM_RUNTIME_TARGETS=x86_64-unknown-uefi-llvm -DRUNTIMES_x86_64-unknown-uefi-llvm_LLVM_ENABLE_RUNTIMES=libc -DRUNTIMES_x86_64-unknown-uefi-llvm_LLVM_LIBC_FULL_BUILD=true -DCMAKE_C_COMPILER_WORKS=true -DCMAKE_CXX_COMPILER_WORKS=true -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_LIBCXX=true -DLLVM_HOST_TRIPLE=aarch64-unknown-linux-gnu -DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-uefi-llvm -DCMAKE_INSTALL_LIBDIR=build/target/lib
$ ninja -C build
```

Added: 
    libc/config/uefi/config.json
    libc/config/uefi/entrypoints.txt
    libc/config/uefi/headers.txt
    libc/src/__support/OSUtil/uefi/CMakeLists.txt
    libc/src/__support/OSUtil/uefi/exit.cpp
    libc/src/__support/OSUtil/uefi/io.cpp
    libc/src/__support/OSUtil/uefi/io.h

Modified: 
    libc/cmake/modules/LLVMLibCArchitectures.cmake
    libc/include/Uefi.yaml
    libc/src/__support/OSUtil/io.h
    libc/utils/hdrgen/hdrgen/header.py

Removed: 
    


################################################################################
diff  --git a/libc/cmake/modules/LLVMLibCArchitectures.cmake b/libc/cmake/modules/LLVMLibCArchitectures.cmake
index b94534bb00980..62f3a2e3bdb59 100644
--- a/libc/cmake/modules/LLVMLibCArchitectures.cmake
+++ b/libc/cmake/modules/LLVMLibCArchitectures.cmake
@@ -191,6 +191,8 @@ elseif(LIBC_TARGET_OS STREQUAL "windows")
   set(LIBC_TARGET_OS_IS_WINDOWS TRUE)
 elseif(LIBC_TARGET_OS STREQUAL "gpu")
   set(LIBC_TARGET_OS_IS_GPU TRUE)
+elseif(LIBC_TARGET_OS STREQUAL "uefi")
+  set(LIBC_TARGET_OS_IS_UEFI TRUE)
 else()
   message(FATAL_ERROR
           "Unsupported libc target operating system ${LIBC_TARGET_OS}")

diff  --git a/libc/config/uefi/config.json b/libc/config/uefi/config.json
new file mode 100644
index 0000000000000..51aa8fecf8b30
--- /dev/null
+++ b/libc/config/uefi/config.json
@@ -0,0 +1,7 @@
+{
+  "errno": {
+    "LIBC_CONF_ERRNO_MODE": {
+      "value": "LIBC_ERRNO_MODE_SHARED"
+    }
+  }
+}

diff  --git a/libc/config/uefi/entrypoints.txt b/libc/config/uefi/entrypoints.txt
new file mode 100644
index 0000000000000..2e11c534a4f3b
--- /dev/null
+++ b/libc/config/uefi/entrypoints.txt
@@ -0,0 +1,11 @@
+set(TARGET_LIBC_ENTRYPOINTS
+    # errno.h entrypoints
+    libc.src.errno.errno
+)
+
+set(TARGET_LIBM_ENTRYPOINTS)
+
+set(TARGET_LLVMLIBC_ENTRYPOINTS
+  ${TARGET_LIBC_ENTRYPOINTS}
+  ${TARGET_LIBM_ENTRYPOINTS}
+)

diff  --git a/libc/config/uefi/headers.txt b/libc/config/uefi/headers.txt
new file mode 100644
index 0000000000000..a8e7b5bc5e37b
--- /dev/null
+++ b/libc/config/uefi/headers.txt
@@ -0,0 +1,4 @@
+set(TARGET_PUBLIC_HEADERS
+    libc.include.errno
+    libc.include.uefi
+)

diff  --git a/libc/include/Uefi.yaml b/libc/include/Uefi.yaml
index 28582eb2524b1..9f38ff3f4a497 100644
--- a/libc/include/Uefi.yaml
+++ b/libc/include/Uefi.yaml
@@ -1,5 +1,6 @@
 header: Uefi.h
-standards: UEFI
+standards:
+  - uefi
 macros: []
 types:
   - type_name: EFI_BOOT_SERVICES

diff  --git a/libc/src/__support/OSUtil/io.h b/libc/src/__support/OSUtil/io.h
index 80119da77fc02..66af31f3cc8c6 100644
--- a/libc/src/__support/OSUtil/io.h
+++ b/libc/src/__support/OSUtil/io.h
@@ -24,6 +24,8 @@
 #elif defined(__ELF__)
 // TODO: Ideally we would have LIBC_TARGET_OS_IS_BAREMETAL.
 #include "baremetal/io.h"
+#elif defined(__UEFI__)
+#include "uefi/io.h"
 #endif
 
 #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_IO_H

diff  --git a/libc/src/__support/OSUtil/uefi/CMakeLists.txt b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
new file mode 100644
index 0000000000000..79ec8ab602456
--- /dev/null
+++ b/libc/src/__support/OSUtil/uefi/CMakeLists.txt
@@ -0,0 +1,11 @@
+add_object_library(
+  uefi_util
+  SRCS
+    io.cpp
+    exit.cpp
+  HDRS
+    io.h
+  DEPENDS
+    libc.src.__support.common
+    libc.src.__support.CPP.string_view
+)

diff  --git a/libc/src/__support/OSUtil/uefi/exit.cpp b/libc/src/__support/OSUtil/uefi/exit.cpp
new file mode 100644
index 0000000000000..432f69a306b79
--- /dev/null
+++ b/libc/src/__support/OSUtil/uefi/exit.cpp
@@ -0,0 +1,22 @@
+//===-------- UEFI implementation of an exit function ------*- 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 "src/__support/OSUtil/exit.h"
+#include "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);
+  __builtin_unreachable();
+}
+
+} // namespace internal
+} // namespace LIBC_NAMESPACE_DECL

diff  --git a/libc/src/__support/OSUtil/uefi/io.cpp b/libc/src/__support/OSUtil/uefi/io.cpp
new file mode 100644
index 0000000000000..756c5aaf8f452
--- /dev/null
+++ b/libc/src/__support/OSUtil/uefi/io.cpp
@@ -0,0 +1,36 @@
+//===---------- UEFI implementation of IO 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 "io.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; }
+
+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));
+  }
+}
+
+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));
+  }
+}
+
+} // namespace LIBC_NAMESPACE_DECL

diff  --git a/libc/src/__support/OSUtil/uefi/io.h b/libc/src/__support/OSUtil/uefi/io.h
new file mode 100644
index 0000000000000..088ae09b8c602
--- /dev/null
+++ b/libc/src/__support/OSUtil/uefi/io.h
@@ -0,0 +1,25 @@
+//===---------- UEFI implementation of IO 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_IO_H
+#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_IO_H
+
+#include "include/llvm-libc-types/size_t.h"
+#include "include/llvm-libc-types/ssize_t.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);
+void write_to_stderr(cpp::string_view msg);
+void write_to_stdout(cpp::string_view msg);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_IO_H

diff  --git a/libc/utils/hdrgen/hdrgen/header.py b/libc/utils/hdrgen/hdrgen/header.py
index 11e0234eda1cf..78444ed377be1 100644
--- a/libc/utils/hdrgen/hdrgen/header.py
+++ b/libc/utils/hdrgen/hdrgen/header.py
@@ -43,6 +43,7 @@
     "bsd": "BSD",
     "gnu": "GNU",
     "linux": "Linux",
+    "uefi": "UEFI",
 }
 
 HEADER_TEMPLATE = """\


        


More information about the libc-commits mailing list