aboutsummaryrefslogtreecommitdiffstats
path: root/src/include/ipxe/errno
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2013-04-19 13:34:13 +0100
committerMichael Brown <mcb30@ipxe.org>2013-04-19 13:34:13 +0100
commit73480352315a12fdef467402ea41be9ac285e4e7 (patch)
tree340080bc152462a85305d007c7af21e07bdfb556 /src/include/ipxe/errno
parente42bc3aa37698941be20cccde599af39c69227e2 (diff)
downloadipxe-73480352315a12fdef467402ea41be9ac285e4e7.tar.gz
[libc] Redefine low 8 bits of error code as "platform error code"
The low 8 bits of an iPXE error code are currently defined as the closest equivalent PXE error code. Generalise this scheme to platforms other than PC-BIOS by extending this definition to "closest equivalent platform error code". This allows for the possibility of returning meaningful errors via EFI APIs. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/ipxe/errno')
-rw-r--r--src/include/ipxe/errno/efi.h129
-rw-r--r--src/include/ipxe/errno/linux.h113
2 files changed, 242 insertions, 0 deletions
diff --git a/src/include/ipxe/errno/efi.h b/src/include/ipxe/errno/efi.h
new file mode 100644
index 000000000..e4f9e5fe1
--- /dev/null
+++ b/src/include/ipxe/errno/efi.h
@@ -0,0 +1,129 @@
+#ifndef _IPXE_ERRNO_EFI_H
+#define _IPXE_ERRNO_EFI_H
+
+/**
+ * @file
+ *
+ * EFI platform error codes
+ *
+ * We derive our platform error codes from the possible values for
+ * EFI_STATUS defined in the UEFI specification.
+ *
+ * EFI_STATUS codes are 32-bit values consisting of a top bit which is
+ * set for errors and clear for warnings, and a mildly undefined
+ * code of low bits indicating the precise error/warning code.
+ * Errors and warnings have completely separate namespaces.
+ *
+ * We assume that no EFI_STATUS code will ever be defined which uses
+ * more than bits 0-6 of the low bits. We then choose to encode our
+ * platform-specific error by mapping bit 31 of the EFI_STATUS to bit
+ * 7 of the platform-specific error code, and preserving bits 0-6
+ * as-is.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <ipxe/efi/efi.h>
+#include <ipxe/efi/Uefi/UefiBaseType.h>
+
+/**
+ * Convert platform error code to platform component of iPXE error code
+ *
+ * @v platform Platform error code
+ * @ret errno Platform component of iPXE error code
+ */
+#define PLATFORM_TO_ERRNO( platform ) \
+ ( ( (platform) | ( (platform) >> 24 ) ) & 0xff )
+
+/**
+ * Convert iPXE error code to platform error code
+ *
+ * @v errno iPXE error code
+ * @ret platform Platform error code
+ */
+#define ERRNO_TO_PLATFORM( errno ) \
+ ( ( ( (errno) << 24 ) | (errno) ) & 0x8000007f )
+
+/* Platform-specific error codes */
+#define PLATFORM_ENOERR EFI_SUCCESS
+#define PLATFORM_E2BIG EFI_BUFFER_TOO_SMALL
+#define PLATFORM_EACCES EFI_ACCESS_DENIED
+#define PLATFORM_EADDRINUSE EFI_ALREADY_STARTED
+#define PLATFORM_EADDRNOTAVAIL EFI_NOT_READY
+#define PLATFORM_EAFNOSUPPORT EFI_UNSUPPORTED
+#define PLATFORM_EAGAIN EFI_NOT_READY
+#define PLATFORM_EALREADY EFI_ALREADY_STARTED
+#define PLATFORM_EBADF EFI_INVALID_PARAMETER
+#define PLATFORM_EBADMSG EFI_PROTOCOL_ERROR
+#define PLATFORM_EBUSY EFI_NO_RESPONSE
+#define PLATFORM_ECANCELED EFI_ABORTED
+#define PLATFORM_ECHILD EFI_NOT_FOUND
+#define PLATFORM_ECONNABORTED EFI_ABORTED
+#define PLATFORM_ECONNREFUSED EFI_NO_RESPONSE
+#define PLATFORM_ECONNRESET EFI_ABORTED
+#define PLATFORM_EDEADLK EFI_NOT_READY
+#define PLATFORM_EDESTADDRREQ EFI_PROTOCOL_ERROR
+#define PLATFORM_EDOM EFI_INVALID_PARAMETER
+#define PLATFORM_EDQUOT EFI_VOLUME_FULL
+#define PLATFORM_EEXIST EFI_WRITE_PROTECTED
+#define PLATFORM_EFAULT EFI_INVALID_PARAMETER
+#define PLATFORM_EFBIG EFI_END_OF_MEDIA
+#define PLATFORM_EHOSTUNREACH EFI_NO_RESPONSE
+#define PLATFORM_EIDRM EFI_INVALID_PARAMETER
+#define PLATFORM_EILSEQ EFI_INVALID_PARAMETER
+#define PLATFORM_EINPROGRESS EFI_ALREADY_STARTED
+#define PLATFORM_EINTR EFI_NOT_READY
+#define PLATFORM_EINVAL EFI_INVALID_PARAMETER
+#define PLATFORM_EIO EFI_PROTOCOL_ERROR
+#define PLATFORM_EISCONN EFI_ALREADY_STARTED
+#define PLATFORM_EISDIR EFI_PROTOCOL_ERROR
+#define PLATFORM_ELOOP EFI_VOLUME_CORRUPTED
+#define PLATFORM_EMFILE EFI_OUT_OF_RESOURCES
+#define PLATFORM_EMLINK EFI_OUT_OF_RESOURCES
+#define PLATFORM_EMSGSIZE EFI_BAD_BUFFER_SIZE
+#define PLATFORM_EMULTIHOP EFI_INVALID_PARAMETER
+#define PLATFORM_ENAMETOOLONG EFI_INVALID_PARAMETER
+#define PLATFORM_ENETDOWN EFI_NO_RESPONSE
+#define PLATFORM_ENETRESET EFI_ABORTED
+#define PLATFORM_ENETUNREACH EFI_NO_RESPONSE
+#define PLATFORM_ENFILE EFI_OUT_OF_RESOURCES
+#define PLATFORM_ENOBUFS EFI_OUT_OF_RESOURCES
+#define PLATFORM_ENODATA EFI_NO_RESPONSE
+#define PLATFORM_ENODEV EFI_DEVICE_ERROR
+#define PLATFORM_ENOENT EFI_NOT_FOUND
+#define PLATFORM_ENOEXEC EFI_LOAD_ERROR
+#define PLATFORM_ENOLCK EFI_OUT_OF_RESOURCES
+#define PLATFORM_ENOLINK EFI_OUT_OF_RESOURCES
+#define PLATFORM_ENOMEM EFI_OUT_OF_RESOURCES
+#define PLATFORM_ENOMSG EFI_PROTOCOL_ERROR
+#define PLATFORM_ENOPROTOOPT EFI_UNSUPPORTED
+#define PLATFORM_ENOSPC EFI_VOLUME_FULL
+#define PLATFORM_ENOSR EFI_OUT_OF_RESOURCES
+#define PLATFORM_ENOSTR EFI_PROTOCOL_ERROR
+#define PLATFORM_ENOSYS EFI_UNSUPPORTED
+#define PLATFORM_ENOTCONN EFI_NOT_STARTED
+#define PLATFORM_ENOTDIR EFI_VOLUME_CORRUPTED
+#define PLATFORM_ENOTEMPTY EFI_VOLUME_CORRUPTED
+#define PLATFORM_ENOTSOCK EFI_INVALID_PARAMETER
+#define PLATFORM_ENOTSUP EFI_UNSUPPORTED
+#define PLATFORM_ENOTTY EFI_UNSUPPORTED
+#define PLATFORM_ENXIO EFI_NOT_FOUND
+#define PLATFORM_EOPNOTSUPP EFI_UNSUPPORTED
+#define PLATFORM_EOVERFLOW EFI_BUFFER_TOO_SMALL
+#define PLATFORM_EPERM EFI_ACCESS_DENIED
+#define PLATFORM_EPIPE EFI_ABORTED
+#define PLATFORM_EPROTO EFI_PROTOCOL_ERROR
+#define PLATFORM_EPROTONOSUPPORT EFI_UNSUPPORTED
+#define PLATFORM_EPROTOTYPE EFI_INVALID_PARAMETER
+#define PLATFORM_ERANGE EFI_BUFFER_TOO_SMALL
+#define PLATFORM_EROFS EFI_WRITE_PROTECTED
+#define PLATFORM_ESPIPE EFI_END_OF_FILE
+#define PLATFORM_ESRCH EFI_NOT_STARTED
+#define PLATFORM_ESTALE EFI_PROTOCOL_ERROR
+#define PLATFORM_ETIME EFI_TIMEOUT
+#define PLATFORM_ETIMEDOUT EFI_TIMEOUT
+#define PLATFORM_ETXTBSY EFI_MEDIA_CHANGED
+#define PLATFORM_EWOULDBLOCK EFI_NOT_READY
+#define PLATFORM_EXDEV EFI_VOLUME_CORRUPTED
+
+#endif /* _IPXE_ERRNO_EFI_H */
diff --git a/src/include/ipxe/errno/linux.h b/src/include/ipxe/errno/linux.h
new file mode 100644
index 000000000..11309b4ad
--- /dev/null
+++ b/src/include/ipxe/errno/linux.h
@@ -0,0 +1,113 @@
+#ifndef _IPXE_ERRNO_LINUX_H
+#define _IPXE_ERRNO_LINUX_H
+
+/**
+ * @file
+ *
+ * Linux platform error codes
+ *
+ * Linux error codes all fit inside 8 bits, so we just use them
+ * directly as our platform error codes.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/**
+ * Convert platform error code to platform component of iPXE error code
+ *
+ * @v platform Platform error code
+ * @ret errno Platform component of iPXE error code
+ */
+#define PLATFORM_TO_ERRNO( platform ) ( (platform) & 0xff )
+
+/**
+ * Convert iPXE error code to platform error code
+ *
+ * @v errno iPXE error code
+ * @ret platform Platform error code
+ */
+#define ERRNO_TO_PLATFORM( errno ) ( (errno) & 0xff )
+
+/* Platform-specific error codes */
+#define PLATFORM_ENOERR 0
+#define PLATFORM_E2BIG 7
+#define PLATFORM_EACCES 13
+#define PLATFORM_EADDRINUSE 98
+#define PLATFORM_EADDRNOTAVAIL 99
+#define PLATFORM_EAFNOSUPPORT 97
+#define PLATFORM_EAGAIN 11
+#define PLATFORM_EALREADY 114
+#define PLATFORM_EBADF 9
+#define PLATFORM_EBADMSG 74
+#define PLATFORM_EBUSY 16
+#define PLATFORM_ECANCELED 125
+#define PLATFORM_ECHILD 10
+#define PLATFORM_ECONNABORTED 103
+#define PLATFORM_ECONNREFUSED 111
+#define PLATFORM_ECONNRESET 104
+#define PLATFORM_EDEADLK 35
+#define PLATFORM_EDESTADDRREQ 89
+#define PLATFORM_EDOM 33
+#define PLATFORM_EDQUOT 122
+#define PLATFORM_EEXIST 17
+#define PLATFORM_EFAULT 14
+#define PLATFORM_EFBIG 27
+#define PLATFORM_EHOSTUNREACH 113
+#define PLATFORM_EIDRM 43
+#define PLATFORM_EILSEQ 84
+#define PLATFORM_EINPROGRESS 115
+#define PLATFORM_EINTR 4
+#define PLATFORM_EINVAL 22
+#define PLATFORM_EIO 5
+#define PLATFORM_EISCONN 106
+#define PLATFORM_EISDIR 21
+#define PLATFORM_ELOOP 40
+#define PLATFORM_EMFILE 24
+#define PLATFORM_EMLINK 31
+#define PLATFORM_EMSGSIZE 90
+#define PLATFORM_EMULTIHOP 72
+#define PLATFORM_ENAMETOOLONG 36
+#define PLATFORM_ENETDOWN 100
+#define PLATFORM_ENETRESET 102
+#define PLATFORM_ENETUNREACH 101
+#define PLATFORM_ENFILE 23
+#define PLATFORM_ENOBUFS 105
+#define PLATFORM_ENODATA 61
+#define PLATFORM_ENODEV 19
+#define PLATFORM_ENOENT 2
+#define PLATFORM_ENOEXEC 8
+#define PLATFORM_ENOLCK 37
+#define PLATFORM_ENOLINK 67
+#define PLATFORM_ENOMEM 12
+#define PLATFORM_ENOMSG 42
+#define PLATFORM_ENOPROTOOPT 92
+#define PLATFORM_ENOSPC 28
+#define PLATFORM_ENOSR 63
+#define PLATFORM_ENOSTR 60
+#define PLATFORM_ENOSYS 38
+#define PLATFORM_ENOTCONN 107
+#define PLATFORM_ENOTDIR 20
+#define PLATFORM_ENOTEMPTY 39
+#define PLATFORM_ENOTSOCK 88
+#define PLATFORM_ENOTSUP PLATFORM_EOPNOTSUPP
+#define PLATFORM_ENOTTY 25
+#define PLATFORM_ENXIO 6
+#define PLATFORM_EOPNOTSUPP 95
+#define PLATFORM_EOVERFLOW 75
+#define PLATFORM_EPERM 1
+#define PLATFORM_EPIPE 32
+#define PLATFORM_EPROTO 71
+#define PLATFORM_EPROTONOSUPPORT 93
+#define PLATFORM_EPROTOTYPE 91
+#define PLATFORM_ERANGE 34
+#define PLATFORM_EROFS 30
+#define PLATFORM_ESPIPE 29
+#define PLATFORM_ESRCH 3
+#define PLATFORM_ESTALE 116
+#define PLATFORM_ETIME 62
+#define PLATFORM_ETIMEDOUT 110
+#define PLATFORM_ETXTBSY 26
+#define PLATFORM_EWOULDBLOCK PLATFORM_EAGAIN
+#define PLATFORM_EXDEV 18
+
+#endif /* _IPXE_ERRNO_LINUX_H */