2 Value transformations between stdio and the UEFI environment.
4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials are licensed and made available under
6 the terms and conditions of the BSD License that accompanies this distribution.
7 The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include <LibConfig.h>
17 #include <sys/EfiCdefs.h>
21 #include <Efi/SysEfi.h>
23 /** Translate the Open flags into a Uefi Open Modes value.
26 O_RDONLY, O_WRONLY, O_RDWR // Pick only one
28 O_NONBLOCK, O_APPEND, O_CREAT, O_TRUNC, O_EXCL // ORed with one of the previous
30 The UEFI Open modes are:
31 // ******************************************************
33 // ******************************************************
34 #define EFI_FILE_MODE_READ 0x0000000000000001
35 #define EFI_FILE_MODE_WRITE 0x0000000000000002
36 #define EFI_FILE_MODE_CREATE 0x8000000000000000
41 Oflags2EFI( int oflags
)
45 // Build the Open Modes
46 flags
= (UINT64
)((oflags
& O_ACCMODE
) + 1); // Handle the Read/Write flags
47 if(flags
& EFI_FILE_MODE_WRITE
) { // Asking for write only?
48 // EFI says the only two RW modes are read-only and read+write.
49 flags
= EFI_FILE_MODE_READ
| EFI_FILE_MODE_WRITE
;
51 if(oflags
& (O_CREAT
| O_TRUNC
)) { // Now add the Create flag.
52 // Also added if O_TRUNC set since we will need to create a new file.
53 // We just set the flags here since the only valid EFI mode with create
54 // is Read+Write+Create.
55 flags
= EFI_FILE_MODE_READ
| EFI_FILE_MODE_WRITE
| EFI_FILE_MODE_CREATE
;
60 /* Transform the permissions flags from the open() call into the
61 Attributes bits needed by UEFI.
63 The UEFI File attributes are:
64 // ******************************************************
66 // ******************************************************
67 #define EFI_FILE_READ_ONLY 0x0000000000000001
68 #define EFI_FILE_HIDDEN 0x0000000000000002
69 #define EFI_FILE_SYSTEM 0x0000000000000004
70 #define EFI_FILE_RESERVED 0x0000000000000008
71 #define EFI_FILE_DIRECTORY 0x0000000000000010
72 #define EFI_FILE_ARCHIVE 0x0000000000000020
73 #define EFI_FILE_VALID_ATTR 0x0000000000000037
75 The input permission flags consist of two groups:
76 ( S_IRUSR | S_IRGRP | S_IROTH ) -- S_ACC_READ
77 ( S_IWUSR | S_IWGRP | S_IWOTH ) -- S_ACC_WRITE
79 The only thing we can set, at this point, is whether or not
80 this is a SYSTEM file. If the group and other bits are
81 zero and the user bits are non-zero then set SYSTEM. Otherwise
82 the attributes are zero.
84 The attributes can be set later using fcntl().
91 if((mode
& (S_IRWXG
| S_IRWXO
)) == 0) {
92 if((mode
& S_IRWXU
) != 0) {
93 // Only user permissions so set system
94 flags
= EFI_FILE_SYSTEM
;
100 /* Converts the first several EFI status values into the appropriate errno value.
103 EFI2errno( RETURN_STATUS Status
)
111 case RETURN_INVALID_PARAMETER
:
114 case RETURN_UNSUPPORTED
:
117 case RETURN_BAD_BUFFER_SIZE
:
118 case RETURN_BUFFER_TOO_SMALL
:
121 case RETURN_NOT_READY
:
124 case RETURN_WRITE_PROTECTED
:
127 case RETURN_OUT_OF_RESOURCES
: // May be overridden by specific functions
130 case RETURN_VOLUME_FULL
:
133 case RETURN_NOT_FOUND
:
134 case RETURN_NO_MAPPING
:
140 case RETURN_NOT_STARTED
:
143 case RETURN_ALREADY_STARTED
:
149 case RETURN_ICMP_ERROR
:
150 case RETURN_TFTP_ERROR
:
151 case RETURN_PROTOCOL_ERROR
:
154 case RETURN_INCOMPATIBLE_VERSION
:
157 case RETURN_ACCESS_DENIED
:
158 case RETURN_SECURITY_VIOLATION
:
161 /* case RETURN_LOAD_ERROR:
162 case RETURN_DEVICE_ERROR:
163 case RETURN_VOLUME_CORRUPTED:
164 case RETURN_NO_MEDIA:
165 case RETURN_MEDIA_CHANGED:
166 case RETURN_NO_RESPONSE:
167 case RETURN_CRC_ERROR:
168 case RETURN_END_OF_MEDIA:
169 case RETURN_END_OF_FILE:
170 case RETURN_INVALID_LANGUAGE: