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(&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(&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 = """\