xref: /freebsd/stand/efi/libefi/errno.c (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
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 __FBSDID("$FreeBSD$");
29 
30 #include <efi.h>
31 #include <efilib.h>
32 
33 EFI_STATUS
34 errno_to_efi_status(int errno)
35 {
36         EFI_STATUS status;
37 
38         switch (errno) {
39         case EPERM:
40                 status = EFI_ACCESS_DENIED;
41                 break;
42 
43         case EOVERFLOW:
44                 status = EFI_BUFFER_TOO_SMALL;
45                 break;
46 
47         case EIO:
48                 status = EFI_DEVICE_ERROR;
49                 break;
50 
51         case EINVAL:
52                 status = EFI_INVALID_PARAMETER;
53                 break;
54 
55         case ESTALE:
56                 status = EFI_MEDIA_CHANGED;
57                 break;
58 
59         case ENXIO:
60                 status = EFI_NO_MEDIA;
61                 break;
62 
63         case ENOENT:
64                 status = EFI_NOT_FOUND;
65                 break;
66 
67         case ENOMEM:
68                 status = EFI_OUT_OF_RESOURCES;
69                 break;
70 
71         case ENOTSUP:
72         case ENODEV:
73                 status = EFI_UNSUPPORTED;
74                 break;
75 
76         case ENOSPC:
77                 status = EFI_VOLUME_FULL;
78                 break;
79 
80         case EACCES:
81                 status = EFI_WRITE_PROTECTED;
82                 break;
83 
84         case 0:
85                 status = EFI_SUCCESS;
86                 break;
87 
88         default:
89                 status = EFI_DEVICE_ERROR;
90                 break;
91         }
92 
93         return (status);
94 }
95 
96 int
97 efi_status_to_errno(EFI_STATUS status)
98 {
99 	int errno;
100 
101 	switch (status) {
102 	case EFI_ACCESS_DENIED:
103 		errno = EPERM;
104 		break;
105 
106 	case EFI_BUFFER_TOO_SMALL:
107 		errno = EOVERFLOW;
108 		break;
109 
110 	case EFI_DEVICE_ERROR:
111 	case EFI_VOLUME_CORRUPTED:
112 		errno = EIO;
113 		break;
114 
115 	case EFI_INVALID_PARAMETER:
116 		errno = EINVAL;
117 		break;
118 
119 	case EFI_MEDIA_CHANGED:
120 		errno = ESTALE;
121 		break;
122 
123 	case EFI_NO_MEDIA:
124 		errno = ENXIO;
125 		break;
126 
127 	case EFI_NOT_FOUND:
128 		errno = ENOENT;
129 		break;
130 
131 	case EFI_OUT_OF_RESOURCES:
132 		errno = ENOMEM;
133 		break;
134 
135 	case EFI_UNSUPPORTED:
136 		errno = ENODEV;
137 		break;
138 
139 	case EFI_VOLUME_FULL:
140 		errno = ENOSPC;
141 		break;
142 
143 	case EFI_WRITE_PROTECTED:
144 		errno = EACCES;
145 		break;
146 
147 	case 0:
148 		errno = 0;
149 		break;
150 
151 	default:
152 		errno = EDOOFUS;
153 		break;
154 	}
155 
156 	return (errno);
157 }
158