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

Tristan Ross via libc-commits libc-commits at lists.llvm.org
Thu Mar 13 19:44:39 PDT 2025


https://github.com/RossComputerGuy updated https://github.com/llvm/llvm-project/pull/131246

>From d9c81fbe50587153a4662975a1feda990ceb8911 Mon Sep 17 00:00:00 2001
From: Tristan Ross <tristan.ross at midstall.com>
Date: Thu, 13 Mar 2025 17:33:22 -0700
Subject: [PATCH] [libc] init uefi

---
 .../cmake/modules/LLVMLibCArchitectures.cmake |  2 ++
 libc/config/uefi/config.json                  |  7 ++++
 libc/config/uefi/entrypoints.txt              | 11 ++++++
 libc/config/uefi/headers.txt                  |  4 +++
 libc/include/Uefi.yaml                        |  3 +-
 libc/src/__support/OSUtil/io.h                |  2 ++
 libc/src/__support/OSUtil/uefi/CMakeLists.txt | 11 ++++++
 libc/src/__support/OSUtil/uefi/exit.cpp       | 22 ++++++++++++
 libc/src/__support/OSUtil/uefi/io.cpp         | 36 +++++++++++++++++++
 libc/src/__support/OSUtil/uefi/io.h           | 25 +++++++++++++
 libc/utils/hdrgen/hdrgen/header.py            |  1 +
 11 files changed, 123 insertions(+), 1 deletion(-)
 create mode 100644 libc/config/uefi/config.json
 create mode 100644 libc/config/uefi/entrypoints.txt
 create mode 100644 libc/config/uefi/headers.txt
 create mode 100644 libc/src/__support/OSUtil/uefi/CMakeLists.txt
 create mode 100644 libc/src/__support/OSUtil/uefi/exit.cpp
 create mode 100644 libc/src/__support/OSUtil/uefi/io.cpp
 create mode 100644 libc/src/__support/OSUtil/uefi/io.h

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