Skip to content

Commit 4ccc169

Browse files
[libc][uefi] get error codes working
1 parent d963ce2 commit 4ccc169

File tree

5 files changed

+79
-97
lines changed

5 files changed

+79
-97
lines changed

libc/include/llvm-libc-types/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ add_header(EFI_HANDLE HDR EFI_HANDLE.h)
185185
add_header(EFI_TIME HDR EFI_TIME.h DEPENDS libc.include.llvm-libc-macros.stdint_macros)
186186
add_header(EFI_TIMER_DELAY HDR EFI_TIMER_DELAY.h)
187187
add_header(EFI_TPL HDR EFI_TPL.h DEPENDS .size_t)
188-
add_header(EFI_STATUS HDR EFI_STATUS.h DEPENDS .size_t)
188+
add_header(EFI_STATUS HDR EFI_STATUS.h DEPENDS libc.include.llvm-libc-macros.stdint_macros)
189189

190190
add_header(EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
191191
HDR

libc/include/llvm-libc-types/EFI_STATUS.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
#ifndef LLVM_LIBC_TYPES_EFI_STATUS_H
1010
#define LLVM_LIBC_TYPES_EFI_STATUS_H
1111

12-
#include "size_t.h"
12+
#include "../llvm-libc-macros/stdint-macros.h"
1313

14-
typedef size_t EFI_STATUS;
14+
typedef uintptr_t EFI_STATUS;
1515

1616
#define EFI_SUCCESS 0
1717

libc/src/__support/OSUtil/uefi/CMakeLists.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@ add_object_library(
33
SRCS
44
io.cpp
55
exit.cpp
6-
error.cpp
76
HDRS
87
io.h
9-
error.h
108
DEPENDS
11-
libc.include.errno
12-
libc.include.limits
139
libc.include.uefi
1410
libc.src.__support.common
1511
libc.src.__support.CPP.string_view

libc/src/__support/OSUtil/uefi/error.cpp

Lines changed: 0 additions & 88 deletions
This file was deleted.

libc/src/__support/OSUtil/uefi/error.h

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,87 @@
99
#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
1010
#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_UEFI_ERROR_H
1111

12+
#include "errno.h"
1213
#include "include/llvm-libc-types/EFI_STATUS.h"
14+
#include "limits.h"
1315
#include "src/__support/macros/config.h"
1416

1517
namespace LIBC_NAMESPACE_DECL {
1618

17-
int uefi_status_to_errno(EFI_STATUS status);
18-
EFI_STATUS errno_to_uefi_status(int errno);
19+
#define EFI_ERROR_MAX_BIT (1 << (sizeof(EFI_STATUS) * sizeof(char) - 1))
20+
#define EFI_ENCODE_ERROR(value) \
21+
(EFI_ERROR_MAX_BIT | (EFI_ERROR_MAX_BIT >> 2) | (value))
22+
#define EFI_ENCODE_WARNING(value) ((EFI_ERROR_MAX_BIT >> 2) | (value))
23+
24+
static constexpr struct errno_efi_status_entry {
25+
EFI_STATUS status;
26+
int errno_value;
27+
} uefi_status_errno_map[] = {
28+
{EFI_SUCCESS, 0},
29+
{EFI_ENCODE_ERROR(EFI_LOAD_ERROR), EINVAL},
30+
{EFI_ENCODE_ERROR(EFI_INVALID_PARAMETER), EINVAL},
31+
{EFI_ENCODE_ERROR(EFI_BAD_BUFFER_SIZE), EINVAL},
32+
{EFI_ENCODE_ERROR(EFI_NOT_READY), EBUSY},
33+
{EFI_ENCODE_ERROR(EFI_DEVICE_ERROR), EIO},
34+
{EFI_ENCODE_ERROR(EFI_WRITE_PROTECTED), EPERM},
35+
{EFI_ENCODE_ERROR(EFI_OUT_OF_RESOURCES), ENOMEM},
36+
{EFI_ENCODE_ERROR(EFI_VOLUME_CORRUPTED), EROFS},
37+
{EFI_ENCODE_ERROR(EFI_VOLUME_FULL), ENOSPC},
38+
{EFI_ENCODE_ERROR(EFI_NO_MEDIA), ENODEV},
39+
{EFI_ENCODE_ERROR(EFI_MEDIA_CHANGED), ENXIO},
40+
{EFI_ENCODE_ERROR(EFI_NOT_FOUND), ENOENT},
41+
{EFI_ENCODE_ERROR(EFI_ACCESS_DENIED), EACCES},
42+
{EFI_ENCODE_ERROR(EFI_NO_RESPONSE), EBUSY},
43+
{EFI_ENCODE_ERROR(EFI_NO_MAPPING), ENODEV},
44+
{EFI_ENCODE_ERROR(EFI_TIMEOUT), EBUSY},
45+
{EFI_ENCODE_ERROR(EFI_NOT_STARTED), EAGAIN},
46+
{EFI_ENCODE_ERROR(EFI_ALREADY_STARTED), EINVAL},
47+
{EFI_ENCODE_ERROR(EFI_ABORTED), EFAULT},
48+
{EFI_ENCODE_ERROR(EFI_ICMP_ERROR), EIO},
49+
{EFI_ENCODE_ERROR(EFI_TFTP_ERROR), EIO},
50+
{EFI_ENCODE_ERROR(EFI_PROTOCOL_ERROR), EINVAL},
51+
{EFI_ENCODE_ERROR(EFI_INCOMPATIBLE_VERSION), EINVAL},
52+
{EFI_ENCODE_ERROR(EFI_SECURITY_VIOLATION), EPERM},
53+
{EFI_ENCODE_ERROR(EFI_CRC_ERROR), EINVAL},
54+
{EFI_ENCODE_ERROR(EFI_END_OF_MEDIA), EPIPE},
55+
{EFI_ENCODE_ERROR(EFI_END_OF_FILE), EPIPE},
56+
{EFI_ENCODE_ERROR(EFI_INVALID_LANGUAGE), EINVAL},
57+
{EFI_ENCODE_ERROR(EFI_COMPROMISED_DATA), EINVAL},
58+
{EFI_ENCODE_ERROR(EFI_IP_ADDRESS_CONFLICT), EINVAL},
59+
{EFI_ENCODE_ERROR(EFI_HTTP_ERROR), EIO},
60+
{EFI_ENCODE_WARNING(EFI_WARN_UNKNOWN_GLYPH), EINVAL},
61+
{EFI_ENCODE_WARNING(EFI_WARN_DELETE_FAILURE), EROFS},
62+
{EFI_ENCODE_WARNING(EFI_WARN_WRITE_FAILURE), EROFS},
63+
{EFI_ENCODE_WARNING(EFI_WARN_BUFFER_TOO_SMALL), E2BIG},
64+
{EFI_ENCODE_WARNING(EFI_WARN_STALE_DATA), EINVAL},
65+
{EFI_ENCODE_WARNING(EFI_WARN_FILE_SYSTEM), EROFS},
66+
{EFI_ENCODE_WARNING(EFI_WARN_RESET_REQUIRED), EINTR},
67+
};
68+
69+
static constexpr size_t uefi_status_errno_map_length =
70+
sizeof(uefi_status_errno_map) / sizeof(uefi_status_errno_map[0]);
71+
72+
static inline int uefi_status_to_errno(EFI_STATUS status) {
73+
for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
74+
const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
75+
if (entry->status == status)
76+
return entry->errno_value;
77+
}
78+
79+
// Unknown type
80+
__builtin_unreachable();
81+
}
82+
83+
static inline EFI_STATUS errno_to_uefi_status(int errno_value) {
84+
for (size_t i = 0; i < uefi_status_errno_map_length; i++) {
85+
const struct errno_efi_status_entry *entry = &uefi_status_errno_map[i];
86+
if (entry->errno_value == errno_value)
87+
return entry->status;
88+
}
89+
90+
// Unknown type
91+
__builtin_unreachable();
92+
}
1993

2094
} // namespace LIBC_NAMESPACE_DECL
2195

0 commit comments

Comments
 (0)