xref: /freebsd/stand/efi/libefi/errno.c (revision 2e3f49888ec8851bafb22011533217487764fdb0)
1 /*-
2  * Copyright (c) 2006 Marcel Moolenaar
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #include <sys/cdefs.h>
28 #include <efi.h>
29 #include <efilib.h>
30 
31 EFI_STATUS
32 errno_to_efi_status(int errno)
33 {
34         EFI_STATUS status;
35 
36         switch (errno) {
37         case EPERM:
38                 status = EFI_ACCESS_DENIED;
39                 break;
40 
41         case EOVERFLOW:
42                 status = EFI_BUFFER_TOO_SMALL;
43                 break;
44 
45         case EIO:
46                 status = EFI_DEVICE_ERROR;
47                 break;
48 
49         case EINVAL:
50                 status = EFI_INVALID_PARAMETER;
51                 break;
52 
53         case ESTALE:
54                 status = EFI_MEDIA_CHANGED;
55                 break;
56 
57         case ENXIO:
58                 status = EFI_NO_MEDIA;
59                 break;
60 
61         case ENOENT:
62                 status = EFI_NOT_FOUND;
63                 break;
64 
65         case ENOMEM:
66                 status = EFI_OUT_OF_RESOURCES;
67                 break;
68 
69         case ENOTSUP:
70         case ENODEV:
71                 status = EFI_UNSUPPORTED;
72                 break;
73 
74         case ENOSPC:
75                 status = EFI_VOLUME_FULL;
76                 break;
77 
78         case EACCES:
79                 status = EFI_WRITE_PROTECTED;
80                 break;
81 
82         case 0:
83                 status = EFI_SUCCESS;
84                 break;
85 
86         default:
87                 status = EFI_DEVICE_ERROR;
88                 break;
89         }
90 
91         return (status);
92 }
93 
94 int
95 efi_status_to_errno(EFI_STATUS status)
96 {
97 	int errno;
98 
99 	switch (status) {
100 	case EFI_ACCESS_DENIED:
101 		errno = EPERM;
102 		break;
103 
104 	case EFI_BUFFER_TOO_SMALL:
105 		errno = EOVERFLOW;
106 		break;
107 
108 	case EFI_DEVICE_ERROR:
109 	case EFI_VOLUME_CORRUPTED:
110 		errno = EIO;
111 		break;
112 
113 	case EFI_INVALID_PARAMETER:
114 		errno = EINVAL;
115 		break;
116 
117 	case EFI_MEDIA_CHANGED:
118 		errno = ESTALE;
119 		break;
120 
121 	case EFI_NO_MEDIA:
122 		errno = ENXIO;
123 		break;
124 
125 	case EFI_NOT_FOUND:
126 		errno = ENOENT;
127 		break;
128 
129 	case EFI_OUT_OF_RESOURCES:
130 		errno = ENOMEM;
131 		break;
132 
133 	case EFI_UNSUPPORTED:
134 		errno = ENODEV;
135 		break;
136 
137 	case EFI_VOLUME_FULL:
138 		errno = ENOSPC;
139 		break;
140 
141 	case EFI_WRITE_PROTECTED:
142 		errno = EACCES;
143 		break;
144 
145 	case 0:
146 		errno = 0;
147 		break;
148 
149 	default:
150 		errno = EDOOFUS;
151 		break;
152 	}
153 
154 	return (errno);
155 }
156