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
33EFI_STATUS
34errno_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
96int
97efi_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