iPXE
Data Structures | Macros | Functions | Variables
efi_file.c File Reference

EFI file protocols. More...

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <wchar.h>
#include <ipxe/image.h>
#include <ipxe/cpio.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/Protocol/SimpleFileSystem.h>
#include <ipxe/efi/Protocol/BlockIo.h>
#include <ipxe/efi/Protocol/DiskIo.h>
#include <ipxe/efi/Protocol/LoadFile2.h>
#include <ipxe/efi/Guid/FileInfo.h>
#include <ipxe/efi/Guid/FileSystemInfo.h>
#include <ipxe/efi/efi_strings.h>
#include <ipxe/efi/efi_path.h>
#include <ipxe/efi/efi_file.h>

Go to the source code of this file.

Data Structures

struct  efi_file_reader
 An EFI virtual file reader. More...
 
struct  efi_file
 An EFI file. More...
 
struct  efi_file_path
 An EFI fixed device path file. More...
 

Macros

#define EFI_MEDIA_ID_MAGIC   0x69505845
 EFI media ID. More...
 
#define LINUX_INITRD_VENDOR_GUID
 Linux initrd fixed device path vendor GUID. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static void efi_file_free (struct refcnt *refcnt)
 Free EFI file. More...
 
static const char * efi_file_name (struct efi_file *file)
 Get EFI file name (for debugging) More...
 
static struct imageefi_file_find (const char *name)
 Find EFI file image. More...
 
static size_t efi_file_len (struct efi_file *file)
 Get length of EFI file. More...
 
static size_t efi_file_read_chunk (struct efi_file_reader *reader, userptr_t data, size_t len)
 Read chunk of EFI file. More...
 
static size_t efi_file_read_image (struct efi_file_reader *reader)
 Read from image-backed file. More...
 
static size_t efi_file_read_initrd (struct efi_file_reader *reader)
 Read from magic initrd file. More...
 
static EFI_STATUS efi_file_open_fixed (struct efi_file *file, const wchar_t *wname, EFI_FILE_PROTOCOL **new)
 Open fixed file. More...
 
static void efi_file_image (struct efi_file *file, struct image *image)
 Associate file with image. More...
 
static EFI_STATUS efi_file_open_image (struct image *image, const wchar_t *wname, EFI_FILE_PROTOCOL **new)
 Open image-backed file. More...
 
static EFI_STATUS EFIAPI efi_file_open (EFI_FILE_PROTOCOL *this, EFI_FILE_PROTOCOL **new, CHAR16 *wname, UINT64 mode, UINT64 attributes __unused)
 Open file. More...
 
static EFI_STATUS EFIAPI efi_file_close (EFI_FILE_PROTOCOL *this)
 Close file. More...
 
static EFI_STATUS EFIAPI efi_file_delete (EFI_FILE_PROTOCOL *this)
 Close and delete file. More...
 
static EFI_STATUS efi_file_varlen (UINT64 *base, size_t base_len, const char *name, UINTN *len, VOID *data)
 Return variable-length data structure. More...
 
static EFI_STATUS efi_file_info (struct efi_file *file, UINTN *len, VOID *data)
 Return file information structure. More...
 
static EFI_STATUS efi_file_read_dir (struct efi_file *file, UINTN *len, VOID *data)
 Read directory entry. More...
 
static EFI_STATUS EFIAPI efi_file_read (EFI_FILE_PROTOCOL *this, UINTN *len, VOID *data)
 Read from file. More...
 
static EFI_STATUS EFIAPI efi_file_write (EFI_FILE_PROTOCOL *this, UINTN *len, VOID *data __unused)
 Write to file. More...
 
static EFI_STATUS EFIAPI efi_file_set_position (EFI_FILE_PROTOCOL *this, UINT64 position)
 Set file position. More...
 
static EFI_STATUS EFIAPI efi_file_get_position (EFI_FILE_PROTOCOL *this, UINT64 *position)
 Get file position. More...
 
static EFI_STATUS EFIAPI efi_file_get_info (EFI_FILE_PROTOCOL *this, EFI_GUID *type, UINTN *len, VOID *data)
 Get file information. More...
 
static EFI_STATUS EFIAPI efi_file_set_info (EFI_FILE_PROTOCOL *this, EFI_GUID *type, UINTN len __unused, VOID *data __unused)
 Set file information. More...
 
static EFI_STATUS EFIAPI efi_file_flush (EFI_FILE_PROTOCOL *this)
 Flush file modified data. More...
 
static EFI_STATUS EFIAPI efi_file_load (EFI_LOAD_FILE2_PROTOCOL *this, EFI_DEVICE_PATH_PROTOCOL *path __unused, BOOLEAN boot __unused, UINTN *len, VOID *data)
 Load file. More...
 
static EFI_STATUS EFIAPI efi_file_open_volume (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *filesystem __unused, EFI_FILE_PROTOCOL **file)
 Open root directory. More...
 
static EFI_STATUS EFIAPI efi_block_io_reset (EFI_BLOCK_IO_PROTOCOL *this __unused, BOOLEAN extended)
 Dummy block I/O reset. More...
 
static EFI_STATUS EFIAPI efi_block_io_read_blocks (EFI_BLOCK_IO_PROTOCOL *this __unused, UINT32 MediaId, EFI_LBA lba, UINTN len, VOID *data)
 Dummy block I/O read. More...
 
static EFI_STATUS EFIAPI efi_block_io_write_blocks (EFI_BLOCK_IO_PROTOCOL *this __unused, UINT32 MediaId, EFI_LBA lba, UINTN len, VOID *data)
 Dummy block I/O write. More...
 
static EFI_STATUS EFIAPI efi_block_io_flush_blocks (EFI_BLOCK_IO_PROTOCOL *this __unused)
 Dummy block I/O flush. More...
 
static EFI_STATUS EFIAPI efi_disk_io_read_disk (EFI_DISK_IO_PROTOCOL *this __unused, UINT32 MediaId, UINT64 offset, UINTN len, VOID *data)
 Dummy disk I/O read. More...
 
static EFI_STATUS EFIAPI efi_disk_io_write_disk (EFI_DISK_IO_PROTOCOL *this __unused, UINT32 MediaId, UINT64 offset, UINTN len, VOID *data)
 Dummy disk I/O write. More...
 
static int efi_file_path_claim (struct efi_file_path *file)
 Claim use of fixed device path. More...
 
static int efi_file_path_install (struct efi_file_path *file)
 Install fixed device path file. More...
 
static void efi_file_path_uninstall (struct efi_file_path *file)
 Uninstall fixed device path file. More...
 
int efi_file_install (EFI_HANDLE handle)
 Install EFI simple file system protocol. More...
 
void efi_file_uninstall (EFI_HANDLE handle)
 Uninstall EFI simple file system protocol. More...
 

Variables

static struct efi_file efi_file_root
 Root directory. More...
 
static struct efi_file_path efi_file_initrd
 Magic initrd file. More...
 
struct {
   VENDOR_DEVICE_PATH   vendor
 
   EFI_DEVICE_PATH_PROTOCOL   end
 
efi_file_initrd_path
 Linux initrd fixed device path. More...
 
static EFI_SIMPLE_FILE_SYSTEM_PROTOCOL efi_simple_file_system_protocol
 EFI simple file system protocol. More...
 
static EFI_BLOCK_IO_MEDIA efi_block_io_media
 Dummy block I/O media. More...
 
static EFI_BLOCK_IO_PROTOCOL efi_block_io_protocol
 Dummy EFI block I/O protocol. More...
 
static EFI_DISK_IO_PROTOCOL efi_disk_io_protocol
 Dummy EFI disk I/O protocol. More...
 

Detailed Description

EFI file protocols.

Definition in file efi_file.c.

Macro Definition Documentation

◆ EFI_MEDIA_ID_MAGIC

#define EFI_MEDIA_ID_MAGIC   0x69505845

EFI media ID.

Definition at line 54 of file efi_file.c.

◆ LINUX_INITRD_VENDOR_GUID

#define LINUX_INITRD_VENDOR_GUID
Value:
{ 0x5568e427, 0x68fc, 0x4f3d, \
{ 0xac, 0x74, 0xca, 0x55, 0x52, 0x31, 0xcc, 0x68 } }

Linux initrd fixed device path vendor GUID.

Definition at line 57 of file efi_file.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ efi_file_free()

static void efi_file_free ( struct refcnt refcnt)
static

Free EFI file.

Parameters
refcntReference count

Definition at line 114 of file efi_file.c.

114  {
115  struct efi_file *file =
116  container_of ( refcnt, struct efi_file, refcnt );
117 
118  image_put ( file->image );
119  free ( file );
120 }
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
A reference counter.
Definition: refcnt.h:26
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:229
An EFI file.
Definition: efi_file.c:74

References container_of, efi_file::file, free, and image_put().

Referenced by efi_file_open_image().

◆ efi_file_name()

static const char* efi_file_name ( struct efi_file file)
static

Get EFI file name (for debugging)

Parameters
fileEFI file
Return values
nameName

Definition at line 128 of file efi_file.c.

128  {
129 
130  return ( file == &efi_file_root ? "<root>" : file->name );
131 }
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106

References efi_file_root, and efi_file::file.

Referenced by efi_file_close(), efi_file_delete(), efi_file_flush(), efi_file_get_info(), efi_file_load(), efi_file_open(), efi_file_open_fixed(), efi_file_open_image(), efi_file_path_claim(), efi_file_path_install(), efi_file_path_uninstall(), efi_file_read(), efi_file_read_initrd(), efi_file_set_info(), efi_file_set_position(), and efi_file_write().

◆ efi_file_find()

static struct image* efi_file_find ( const char *  name)
static

Find EFI file image.

Parameters
nameFilename
Return values
imageImage, or NULL

Definition at line 139 of file efi_file.c.

139  {
140  struct image *image;
141 
142  /* Find image */
143  for_each_image ( image ) {
144  if ( strcasecmp ( image->name, name ) == 0 )
145  return image;
146  }
147 
148  return NULL;
149 }
const char * name
Definition: ath9k_hw.c:1984
int strcasecmp(const char *first, const char *second)
Compare case-insensitive strings.
Definition: string.c:208
An executable image.
Definition: image.h:24
#define for_each_image(image)
Iterate over all registered images.
Definition: image.h:172
char * name
Name.
Definition: image.h:34
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References for_each_image, image::name, name, NULL, and strcasecmp().

Referenced by efi_file_open().

◆ efi_file_len()

static size_t efi_file_len ( struct efi_file file)
static

Get length of EFI file.

Parameters
fileEFI file
Return values
lenLength of file

Definition at line 157 of file efi_file.c.

157  {
158  struct efi_file_reader reader;
159 
160  /* If this is the root directory, then treat as length zero */
161  if ( ! file->read )
162  return 0;
163 
164  /* Initialise reader */
165  reader.file = file;
166  reader.pos = 0;
167  reader.data = NULL;
168  reader.len = 0;
169 
170  /* Perform dummy read to determine file length */
171  file->read ( &reader );
172 
173  return reader.pos;
174 }
An EFI virtual file reader.
Definition: efi_file.c:62
size_t pos
Current file position.
Definition: efi_file.c:86
struct efi_file * file
EFI file.
Definition: efi_file.c:64
size_t(* read)(struct efi_file_reader *reader)
Read from file.
Definition: efi_file.c:93
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References efi_file_reader::data, efi_file_reader::file, efi_file_reader::len, NULL, efi_file_reader::pos, and efi_file::read.

Referenced by efi_file_info(), efi_file_load(), and efi_file_set_position().

◆ efi_file_read_chunk()

static size_t efi_file_read_chunk ( struct efi_file_reader reader,
userptr_t  data,
size_t  len 
)
static

Read chunk of EFI file.

Parameters
readerEFI file reader
dataInput data, or UNULL to zero-fill
lenLength of input data
Return values
lenLength of output data

Definition at line 184 of file efi_file.c.

185  {
186  struct efi_file *file = reader->file;
187  size_t offset;
188 
189  /* Calculate offset into input data */
190  offset = ( file->pos - reader->pos );
191 
192  /* Consume input data range */
193  reader->pos += len;
194 
195  /* Calculate output length */
196  if ( offset < len ) {
197  len -= offset;
198  } else {
199  len = 0;
200  }
201  if ( len > reader->len )
202  len = reader->len;
203 
204  /* Copy or zero output data */
205  if ( data ) {
206  copy_from_user ( reader->data, data, offset, len );
207  } else {
208  memset ( reader->data, 0, len );
209  }
210 
211  /* Consume output buffer */
212  file->pos += len;
213  reader->data += len;
214  reader->len -= len;
215 
216  return len;
217 }
void * data
Output data buffer.
Definition: efi_file.c:68
static __always_inline void copy_from_user(void *dest, userptr_t src, off_t src_off, size_t len)
Copy data from user buffer.
Definition: uaccess.h:411
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
struct efi_file * file
EFI file.
Definition: efi_file.c:64
size_t len
Length of output data buffer.
Definition: efi_file.c:70
size_t pos
Position within virtual file.
Definition: efi_file.c:66
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
uint32_t len
Length.
Definition: ena.h:14
An EFI file.
Definition: efi_file.c:74
void * memset(void *dest, int character, size_t len) __nonnull

References copy_from_user(), data, efi_file_reader::data, efi_file_reader::file, efi_file::file, len, efi_file_reader::len, memset(), offset, and efi_file_reader::pos.

Referenced by efi_file_read_image(), and efi_file_read_initrd().

◆ efi_file_read_image()

static size_t efi_file_read_image ( struct efi_file_reader reader)
static

Read from image-backed file.

Parameters
readerEFI file reader
Return values
lenLength read

Definition at line 225 of file efi_file.c.

225  {
226  struct efi_file *file = reader->file;
227  struct image *image = file->image;
228 
229  /* Read from file */
230  return efi_file_read_chunk ( reader, image->data, image->len );
231 }
userptr_t data
Raw file image.
Definition: image.h:41
An executable image.
Definition: image.h:24
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
struct efi_file * file
EFI file.
Definition: efi_file.c:64
static size_t efi_file_read_chunk(struct efi_file_reader *reader, userptr_t data, size_t len)
Read chunk of EFI file.
Definition: efi_file.c:184
size_t len
Length of raw file image.
Definition: image.h:43
struct image * image
Image (if any)
Definition: efi_file.c:82
An EFI file.
Definition: efi_file.c:74

References image::data, efi_file_read_chunk(), efi_file_reader::file, efi_file::file, efi_file::image, and image::len.

Referenced by efi_file_image().

◆ efi_file_read_initrd()

static size_t efi_file_read_initrd ( struct efi_file_reader reader)
static

Read from magic initrd file.

Parameters
readerEFI file reader
Return values
lenLength read

Definition at line 239 of file efi_file.c.

239  {
240  struct efi_file *file = reader->file;
241  struct cpio_header cpio;
242  struct image *image;
243  const char *name;
244  size_t pad_len;
245  size_t cpio_len;
246  size_t name_len;
247  size_t len;
248  unsigned int i;
249 
250  /* Read from file */
251  len = 0;
252  for_each_image ( image ) {
253 
254  /* Skip hidden images */
255  if ( image->flags & IMAGE_HIDDEN )
256  continue;
257 
258  /* Pad to alignment boundary */
259  pad_len = ( ( -reader->pos ) & ( INITRD_ALIGN - 1 ) );
260  if ( pad_len ) {
261  DBGC ( file, "EFIFILE %s [%#08zx,%#08zx) pad\n",
262  efi_file_name ( file ), reader->pos,
263  ( reader->pos + pad_len ) );
264  }
265  len += efi_file_read_chunk ( reader, UNULL, pad_len );
266 
267  /* Read CPIO header(s), if applicable */
268  name = cpio_name ( image );
269  for ( i = 0 ; ( cpio_len = cpio_header ( image, i, &cpio ) );
270  i++ ) {
271  name_len = ( cpio_len - sizeof ( cpio ) );
272  pad_len = cpio_pad_len ( cpio_len );
273  DBGC ( file, "EFIFILE %s [%#08zx,%#08zx) %s header\n",
274  efi_file_name ( file ), reader->pos,
275  ( reader->pos + cpio_len + pad_len ),
276  image->name );
277  len += efi_file_read_chunk ( reader,
278  virt_to_user ( &cpio ),
279  sizeof ( cpio ) );
280  len += efi_file_read_chunk ( reader,
281  virt_to_user ( name ),
282  name_len );
283  len += efi_file_read_chunk ( reader, UNULL, pad_len );
284  }
285 
286  /* Read file data */
287  DBGC ( file, "EFIFILE %s [%#08zx,%#08zx) %s\n",
288  efi_file_name ( file ), reader->pos,
289  ( reader->pos + image->len ), image->name );
290  len += efi_file_read_chunk ( reader, image->data, image->len );
291  }
292 
293  return len;
294 }
unsigned int flags
Flags.
Definition: image.h:36
const char * name
Definition: ath9k_hw.c:1984
userptr_t data
Raw file image.
Definition: image.h:41
A CPIO archive header.
Definition: cpio.h:20
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
static size_t cpio_pad_len(size_t len)
Get CPIO header zero-padding length.
Definition: cpio.h:84
struct efi_file * file
EFI file.
Definition: efi_file.c:64
size_t cpio_header(struct image *image, unsigned int index, struct cpio_header *cpio)
Construct CPIO header for image, if applicable.
Definition: cpio.c:151
static size_t efi_file_read_chunk(struct efi_file_reader *reader, userptr_t data, size_t len)
Read chunk of EFI file.
Definition: efi_file.c:184
#define for_each_image(image)
Iterate over all registered images.
Definition: image.h:172
size_t len
Length of raw file image.
Definition: image.h:43
#define IMAGE_HIDDEN
Image will be hidden from enumeration.
Definition: image.h:73
size_t pos
Position within virtual file.
Definition: efi_file.c:66
long pad_len
Definition: bigint.h:30
#define INITRD_ALIGN
Alignment for CPIO archives within an initrd.
Definition: cpio.h:64
#define UNULL
Equivalent of NULL for user pointers.
Definition: uaccess.h:42
userptr_t virt_to_user(volatile const void *addr)
Convert virtual address to user pointer.
char * name
Name.
Definition: image.h:34
uint32_t len
Length.
Definition: ena.h:14
An EFI file.
Definition: efi_file.c:74
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128
static const char * cpio_name(struct image *image)
Get CPIO image name.
Definition: cpio.h:73

References cpio_header(), cpio_name(), cpio_pad_len(), image::data, DBGC, efi_file_name(), efi_file_read_chunk(), efi_file_reader::file, efi_file::file, image::flags, for_each_image, IMAGE_HIDDEN, INITRD_ALIGN, len, image::len, image::name, name, pad_len, efi_file_reader::pos, UNULL, and virt_to_user().

◆ efi_file_open_fixed()

static EFI_STATUS efi_file_open_fixed ( struct efi_file file,
const wchar_t wname,
EFI_FILE_PROTOCOL **  new 
)
static

Open fixed file.

Parameters
fileEFI file
wnameFilename
newNew EFI file
Return values
efircEFI status code

Definition at line 304 of file efi_file.c.

306  {
307 
308  /* Increment reference count */
309  ref_get ( &file->refcnt );
310 
311  /* Return opened file */
312  *new = &file->file;
313 
314  DBGC ( file, "EFIFILE %s opened via %ls\n",
315  efi_file_name ( file ), wname );
316  return 0;
317 }
struct refcnt refcnt
Reference count.
Definition: efi_file.c:76
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
#define ref_get(refcnt)
Get additional reference to object.
Definition: refcnt.h:92
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References DBGC, efi_file_name(), efi_file::file, ref_get, and efi_file::refcnt.

Referenced by efi_file_open(), and efi_file_open_volume().

◆ efi_file_image()

static void efi_file_image ( struct efi_file file,
struct image image 
)
static

Associate file with image.

Parameters
fileEFI file
imageImage

Definition at line 325 of file efi_file.c.

325  {
326 
327  file->image = image;
328  file->name = image->name;
329  file->read = efi_file_read_image;
330 }
An executable image.
Definition: image.h:24
static size_t efi_file_read_image(struct efi_file_reader *reader)
Read from image-backed file.
Definition: efi_file.c:225
struct image * image
Image (if any)
Definition: efi_file.c:82
size_t(* read)(struct efi_file_reader *reader)
Read from file.
Definition: efi_file.c:93
char * name
Name.
Definition: image.h:34
const char * name
Filename.
Definition: efi_file.c:84

References efi_file_read_image(), efi_file::image, image::name, efi_file::name, and efi_file::read.

Referenced by efi_file_open_image(), and efi_file_read_dir().

◆ efi_file_open_image()

static EFI_STATUS efi_file_open_image ( struct image image,
const wchar_t wname,
EFI_FILE_PROTOCOL **  new 
)
static

Open image-backed file.

Parameters
imageImage
wnameFilename
newNew EFI file
Return values
efircEFI status code

Definition at line 340 of file efi_file.c.

342  {
343  struct efi_file *file;
344 
345  /* Allocate and initialise file */
346  file = zalloc ( sizeof ( *file ) );
347  if ( ! file )
348  return EFI_OUT_OF_RESOURCES;
349  ref_init ( &file->refcnt, efi_file_free );
350  memcpy ( &file->file, &efi_file_root.file, sizeof ( file->file ) );
351  memcpy ( &file->load, &efi_file_root.load, sizeof ( file->load ) );
353 
354  /* Return opened file */
355  *new = &file->file;
356 
357  DBGC ( file, "EFIFILE %s opened via %ls\n",
358  efi_file_name ( file ), wname );
359  return 0;
360 }
static void efi_file_free(struct refcnt *refcnt)
Free EFI file.
Definition: efi_file.c:114
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
static struct image * image_get(struct image *image)
Increment reference count on an image.
Definition: image.h:219
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
#define EFI_OUT_OF_RESOURCES
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:123
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:640
EFI_LOAD_FILE2_PROTOCOL load
EFI load file protocol.
Definition: efi_file.c:80
An EFI file.
Definition: efi_file.c:74
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128
static void efi_file_image(struct efi_file *file, struct image *image)
Associate file with image.
Definition: efi_file.c:325

References DBGC, efi_file_free(), efi_file_image(), efi_file_name(), efi_file_root, EFI_OUT_OF_RESOURCES, efi_file::file, image_get(), efi_file::load, memcpy(), ref_init, and zalloc().

Referenced by efi_file_open().

◆ efi_file_open()

static EFI_STATUS EFIAPI efi_file_open ( EFI_FILE_PROTOCOL this,
EFI_FILE_PROTOCOL **  new,
CHAR16 wname,
UINT64  mode,
UINT64 attributes  __unused 
)
static

Open file.

Parameters
thisEFI file
Return values
newNew EFI file
Parameters
wnameFilename
modeFile mode
attributesFile attributes (for newly-created files)
Return values
efircEFI status code

Definition at line 373 of file efi_file.c.

374  {
375  struct efi_file *file = container_of ( this, struct efi_file, file );
376  char buf[ wcslen ( wname ) + 1 /* NUL */ ];
377  struct image *image;
378  char *name;
379  char *sep;
380 
381  /* Convert name to ASCII */
382  snprintf ( buf, sizeof ( buf ), "%ls", wname );
383  name = buf;
384 
385  /* Initial '\' indicates opening from the root directory */
386  while ( *name == '\\' ) {
387  file = &efi_file_root;
388  name++;
389  }
390 
391  /* Allow root directory itself to be opened */
392  if ( ( name[0] == '\0' ) || ( name[0] == '.' ) )
393  return efi_file_open_fixed ( &efi_file_root, wname, new );
394 
395  /* Fail unless opening from the root */
396  if ( file != &efi_file_root ) {
397  DBGC ( file, "EFIFILE %s is not a directory\n",
398  efi_file_name ( file ) );
399  return EFI_NOT_FOUND;
400  }
401 
402  /* Fail unless opening read-only */
403  if ( mode != EFI_FILE_MODE_READ ) {
404  DBGC ( file, "EFIFILE %s cannot be opened in mode %#08llx\n",
405  name, mode );
406  return EFI_WRITE_PROTECTED;
407  }
408 
409  /* Allow registered images to be opened */
410  if ( ( image = efi_file_find ( name ) ) != NULL )
411  return efi_file_open_image ( image, wname, new );
412 
413  /* Allow magic initrd to be opened */
414  if ( strcasecmp ( name, efi_file_initrd.file.name ) == 0 ) {
415  return efi_file_open_fixed ( &efi_file_initrd.file, wname,
416  new );
417  }
418 
419  /* Allow currently selected image to be opened as "grub*.efi",
420  * to work around buggy versions of the UEFI shim.
421  */
422  if ( ( strncasecmp ( name, "grub", 4 ) == 0 ) &&
423  ( ( sep = strrchr ( name, '.' ) ) != NULL ) &&
424  ( strcasecmp ( sep, ".efi" ) == 0 ) &&
425  ( ( image = find_image_tag ( &selected_image ) ) != NULL ) ) {
426  return efi_file_open_image ( image, wname, new );
427  }
428 
429  DBGC ( file, "EFIFILE %ls does not exist\n", wname );
430  return EFI_NOT_FOUND;
431 }
struct image_tag selected_image
const char * name
Definition: ath9k_hw.c:1984
char * strrchr(const char *src, int character)
Find rightmost character within a string.
Definition: string.c:289
static EFI_STATUS efi_file_open_image(struct image *image, const wchar_t *wname, EFI_FILE_PROTOCOL **new)
Open image-backed file.
Definition: efi_file.c:340
#define DBGC(...)
Definition: compiler.h:505
int strcasecmp(const char *first, const char *second)
Compare case-insensitive strings.
Definition: string.c:208
int strncasecmp(const char *first, const char *second, size_t max)
Compare case-insensitive strings.
Definition: string.c:221
An executable image.
Definition: image.h:24
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
size_t wcslen(const wchar_t *string)
Calculate length of wide-character string.
Definition: wchar.c:41
struct image * find_image_tag(struct image_tag *tag)
Find image by tag.
Definition: image.c:357
static struct efi_file_path efi_file_initrd
Magic initrd file.
Definition: efi_file.c:107
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static EFI_STATUS efi_file_open_fixed(struct efi_file *file, const wchar_t *wname, EFI_FILE_PROTOCOL **new)
Open fixed file.
Definition: efi_file.c:304
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106
#define EFI_WRITE_PROTECTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:122
#define EFI_NOT_FOUND
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:128
#define EFI_FILE_MODE_READ
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
static struct image * efi_file_find(const char *name)
Find EFI file image.
Definition: efi_file.c:139
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
An EFI file.
Definition: efi_file.c:74
const char * name
Filename.
Definition: efi_file.c:84
struct efi_file file
EFI file.
Definition: efi_file.c:99
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References container_of, DBGC, efi_file_find(), efi_file_initrd, EFI_FILE_MODE_READ, efi_file_name(), efi_file_open_fixed(), efi_file_open_image(), efi_file_root, EFI_NOT_FOUND, EFI_WRITE_PROTECTED, efi_file::file, efi_file_path::file, find_image_tag(), efi_file::name, name, NULL, selected_image, snprintf(), strcasecmp(), strncasecmp(), strrchr(), and wcslen().

◆ efi_file_close()

static EFI_STATUS EFIAPI efi_file_close ( EFI_FILE_PROTOCOL this)
static

Close file.

Parameters
thisEFI file
Return values
efircEFI status code

Definition at line 439 of file efi_file.c.

439  {
440  struct efi_file *file = container_of ( this, struct efi_file, file );
441 
442  /* Close file */
443  DBGC ( file, "EFIFILE %s closed\n", efi_file_name ( file ) );
444  ref_put ( &file->refcnt );
445 
446  return 0;
447 }
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
An EFI file.
Definition: efi_file.c:74
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References container_of, DBGC, efi_file_name(), efi_file::file, and ref_put.

Referenced by efi_file_delete().

◆ efi_file_delete()

static EFI_STATUS EFIAPI efi_file_delete ( EFI_FILE_PROTOCOL this)
static

Close and delete file.

Parameters
thisEFI file
Return values
efircEFI status code

Definition at line 455 of file efi_file.c.

455  {
456  struct efi_file *file = container_of ( this, struct efi_file, file );
457 
458  DBGC ( file, "EFIFILE %s cannot be deleted\n", efi_file_name ( file ) );
459 
460  /* Close file */
461  efi_file_close ( this );
462 
463  /* Warn of failure to delete */
465 }
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static EFI_STATUS EFIAPI efi_file_close(EFI_FILE_PROTOCOL *this)
Close file.
Definition: efi_file.c:439
#define EFI_WARN_DELETE_FAILURE
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:150
An EFI file.
Definition: efi_file.c:74
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References container_of, DBGC, efi_file_close(), efi_file_name(), EFI_WARN_DELETE_FAILURE, and efi_file::file.

◆ efi_file_varlen()

static EFI_STATUS efi_file_varlen ( UINT64 base,
size_t  base_len,
const char *  name,
UINTN len,
VOID data 
)
static

Return variable-length data structure.

Parameters
baseBase data structure (starting with UINT64)
base_lenLength of base data structure
nameName to append to base data structure
lenLength of data buffer
dataData buffer
Return values
efircEFI status code

Definition at line 477 of file efi_file.c.

478  {
479  size_t name_len;
480 
481  /* Calculate structure length */
482  name_len = strlen ( name );
483  *base = ( base_len + ( name_len + 1 /* NUL */ ) * sizeof ( wchar_t ) );
484  if ( *len < *base ) {
485  *len = *base;
486  return EFI_BUFFER_TOO_SMALL;
487  }
488 
489  /* Copy data to buffer */
490  *len = *base;
491  memcpy ( data, base, base_len );
492  efi_snprintf ( ( data + base_len ), ( name_len + 1 /* NUL */ ),
493  "%s", name );
494 
495  return 0;
496 }
uint32_t base
Base.
Definition: librm.h:252
const char * name
Definition: ath9k_hw.c:1984
#define EFI_BUFFER_TOO_SMALL
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:119
void * memcpy(void *dest, const void *src, size_t len) __nonnull
int efi_snprintf(wchar_t *wbuf, size_t wsize, const char *fmt,...)
Write a formatted string to a buffer.
Definition: efi_strings.c:106
size_t strlen(const char *src)
Get length of string.
Definition: string.c:243
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14

References base, data, EFI_BUFFER_TOO_SMALL, efi_snprintf(), len, memcpy(), name, and strlen().

Referenced by efi_file_get_info(), and efi_file_info().

◆ efi_file_info()

static EFI_STATUS efi_file_info ( struct efi_file file,
UINTN len,
VOID data 
)
static

Return file information structure.

Parameters
fileEFI file
lenLength of data buffer
dataData buffer
Return values
efircEFI status code

Definition at line 506 of file efi_file.c.

507  {
509  size_t file_len;
510 
511  /* Get file length */
512  file_len = efi_file_len ( file );
513 
514  /* Populate file information */
515  memset ( &info, 0, sizeof ( info ) );
516  info.FileSize = file_len;
517  info.PhysicalSize = file_len;
518  info.Attribute = EFI_FILE_READ_ONLY;
519  if ( file == &efi_file_root )
520  info.Attribute |= EFI_FILE_DIRECTORY;
521 
523  file->name, len, data );
524 }
u32 info
Definition: ar9003_mac.h:67
#define EFI_FILE_READ_ONLY
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
#define EFI_FILE_DIRECTORY
#define SIZE_OF_EFI_FILE_INFO
The FileName field of the EFI_FILE_INFO data structure is variable length.
Definition: FileInfo.h:64
static size_t efi_file_len(struct efi_file *file)
Get length of EFI file.
Definition: efi_file.c:157
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106
static EFI_STATUS efi_file_varlen(UINT64 *base, size_t base_len, const char *name, UINTN *len, VOID *data)
Return variable-length data structure.
Definition: efi_file.c:477
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14
void * memset(void *dest, int character, size_t len) __nonnull

References data, EFI_FILE_DIRECTORY, efi_file_len(), EFI_FILE_READ_ONLY, efi_file_root, efi_file_varlen(), efi_file::file, info, len, memset(), and SIZE_OF_EFI_FILE_INFO.

Referenced by efi_file_get_info(), and efi_file_read_dir().

◆ efi_file_read_dir()

static EFI_STATUS efi_file_read_dir ( struct efi_file file,
UINTN len,
VOID data 
)
static

Read directory entry.

Parameters
fileEFI file
lenLength to read
dataData buffer
Return values
efircEFI status code

Definition at line 534 of file efi_file.c.

535  {
536  EFI_STATUS efirc;
537  struct efi_file entry;
538  struct image *image;
539  unsigned int index;
540 
541  /* Construct directory entries for image-backed files */
542  index = file->pos;
543  for_each_image ( image ) {
544 
545  /* Skip hidden images */
546  if ( image->flags & IMAGE_HIDDEN )
547  continue;
548 
549  /* Skip preceding images */
550  if ( index-- )
551  continue;
552 
553  /* Construct directory entry */
554  efi_file_image ( &entry, image );
555  efirc = efi_file_info ( &entry, len, data );
556  if ( efirc == 0 )
557  file->pos++;
558  return efirc;
559  }
560 
561  /* No more entries */
562  *len = 0;
563  return 0;
564 }
unsigned int flags
Flags.
Definition: image.h:36
long index
Definition: bigint.h:62
An executable image.
Definition: image.h:24
static EFI_STATUS efi_file_info(struct efi_file *file, UINTN *len, VOID *data)
Return file information structure.
Definition: efi_file.c:506
size_t pos
Current file position.
Definition: efi_file.c:86
#define for_each_image(image)
Iterate over all registered images.
Definition: image.h:172
#define IMAGE_HIDDEN
Image will be hidden from enumeration.
Definition: image.h:73
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14
An EFI file.
Definition: efi_file.c:74
static void efi_file_image(struct efi_file *file, struct image *image)
Associate file with image.
Definition: efi_file.c:325

References data, efi_file_image(), efi_file_info(), image::flags, for_each_image, IMAGE_HIDDEN, index, len, and efi_file::pos.

Referenced by efi_file_read().

◆ efi_file_read()

static EFI_STATUS EFIAPI efi_file_read ( EFI_FILE_PROTOCOL this,
UINTN len,
VOID data 
)
static

Read from file.

Parameters
thisEFI file
lenLength to read
dataData buffer
Return values
efircEFI status code

Definition at line 574 of file efi_file.c.

575  {
576  struct efi_file *file = container_of ( this, struct efi_file, file );
577  struct efi_file_reader reader;
578  size_t pos = file->pos;
579 
580  /* If this is the root directory, then construct a directory entry */
581  if ( ! file->read )
582  return efi_file_read_dir ( file, len, data );
583 
584  /* Initialise reader */
585  reader.file = file;
586  reader.pos = 0;
587  reader.data = data;
588  reader.len = *len;
589 
590  /* Read from the file */
591  DBGC ( file, "EFIFILE %s read [%#08zx,%#08zx)\n",
592  efi_file_name ( file ), pos, ( ( size_t ) ( pos + *len ) ) );
593  *len = file->read ( &reader );
594  assert ( ( pos + *len ) == file->pos );
595 
596  return 0;
597 }
An EFI virtual file reader.
Definition: efi_file.c:62
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
size_t pos
Current file position.
Definition: efi_file.c:86
struct efi_file * file
EFI file.
Definition: efi_file.c:64
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static EFI_STATUS efi_file_read_dir(struct efi_file *file, UINTN *len, VOID *data)
Read directory entry.
Definition: efi_file.c:534
size_t pos
Position within virtual file.
Definition: efi_file.c:66
uint8_t data[48]
Additional event data.
Definition: ena.h:22
size_t(* read)(struct efi_file_reader *reader)
Read from file.
Definition: efi_file.c:93
uint32_t len
Length.
Definition: ena.h:14
An EFI file.
Definition: efi_file.c:74
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References assert(), container_of, data, efi_file_reader::data, DBGC, efi_file_name(), efi_file_read_dir(), efi_file_reader::file, efi_file::file, len, efi_file_reader::len, efi_file_reader::pos, efi_file::pos, and efi_file::read.

Referenced by efi_file_load().

◆ efi_file_write()

static EFI_STATUS EFIAPI efi_file_write ( EFI_FILE_PROTOCOL this,
UINTN len,
VOID *data  __unused 
)
static

Write to file.

Parameters
thisEFI file
lenLength to write
dataData buffer
Return values
efircEFI status code

Definition at line 607 of file efi_file.c.

608  {
609  struct efi_file *file = container_of ( this, struct efi_file, file );
610 
611  DBGC ( file, "EFIFILE %s cannot write [%#08zx, %#08zx)\n",
612  efi_file_name ( file ), file->pos,
613  ( ( size_t ) ( file->pos + *len ) ) );
614  return EFI_WRITE_PROTECTED;
615 }
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
#define EFI_WRITE_PROTECTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:122
uint32_t len
Length.
Definition: ena.h:14
An EFI file.
Definition: efi_file.c:74
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References container_of, DBGC, efi_file_name(), EFI_WRITE_PROTECTED, efi_file::file, and len.

◆ efi_file_set_position()

static EFI_STATUS EFIAPI efi_file_set_position ( EFI_FILE_PROTOCOL this,
UINT64  position 
)
static

Set file position.

Parameters
thisEFI file
positionNew file position
Return values
efircEFI status code

Definition at line 624 of file efi_file.c.

625  {
626  struct efi_file *file = container_of ( this, struct efi_file, file );
627  size_t len;
628 
629  /* Get file length */
630  len = efi_file_len ( file );
631 
632  /* Check for the magic end-of-file value */
633  if ( position == 0xffffffffffffffffULL )
634  position = len;
635 
636  /* Fail if we attempt to seek past the end of the file (since
637  * we do not support writes).
638  */
639  if ( position > len ) {
640  DBGC ( file, "EFIFILE %s cannot seek to %#08llx of %#08zx\n",
641  efi_file_name ( file ), position, len );
642  return EFI_UNSUPPORTED;
643  }
644 
645  /* Set position */
646  file->pos = position;
647  DBGC ( file, "EFIFILE %s position set to %#08zx\n",
648  efi_file_name ( file ), file->pos );
649 
650  return 0;
651 }
#define EFI_UNSUPPORTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:117
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
static size_t efi_file_len(struct efi_file *file)
Get length of EFI file.
Definition: efi_file.c:157
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
uint32_t len
Length.
Definition: ena.h:14
An EFI file.
Definition: efi_file.c:74
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References container_of, DBGC, efi_file_len(), efi_file_name(), EFI_UNSUPPORTED, efi_file::file, and len.

◆ efi_file_get_position()

static EFI_STATUS EFIAPI efi_file_get_position ( EFI_FILE_PROTOCOL this,
UINT64 position 
)
static

Get file position.

Parameters
thisEFI file
Return values
positionNew file position
efircEFI status code

Definition at line 660 of file efi_file.c.

661  {
662  struct efi_file *file = container_of ( this, struct efi_file, file );
663 
664  *position = file->pos;
665  return 0;
666 }
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
An EFI file.
Definition: efi_file.c:74

References container_of, and efi_file::file.

◆ efi_file_get_info()

static EFI_STATUS EFIAPI efi_file_get_info ( EFI_FILE_PROTOCOL this,
EFI_GUID type,
UINTN len,
VOID data 
)
static

Get file information.

Parameters
thisEFI file
typeType of information
lenBuffer size
dataBuffer
Return values
efircEFI status code

Definition at line 677 of file efi_file.c.

679  {
680  struct efi_file *file = container_of ( this, struct efi_file, file );
681  EFI_FILE_SYSTEM_INFO fsinfo;
682  struct image *image;
683 
684  /* Determine information to return */
685  if ( memcmp ( type, &efi_file_info_id, sizeof ( *type ) ) == 0 ) {
686 
687  /* Get file information */
688  DBGC ( file, "EFIFILE %s get file information\n",
689  efi_file_name ( file ) );
690  return efi_file_info ( file, len, data );
691 
692  } else if ( memcmp ( type, &efi_file_system_info_id,
693  sizeof ( *type ) ) == 0 ) {
694 
695  /* Get file system information */
696  DBGC ( file, "EFIFILE %s get file system information\n",
697  efi_file_name ( file ) );
698  memset ( &fsinfo, 0, sizeof ( fsinfo ) );
699  fsinfo.ReadOnly = 1;
701  fsinfo.VolumeSize += image->len;
702  return efi_file_varlen ( &fsinfo.Size,
704  len, data );
705  } else {
706 
707  DBGC ( file, "EFIFILE %s cannot get information of type %s\n",
708  efi_file_name ( file ), efi_guid_ntoa ( type ) );
709  return EFI_UNSUPPORTED;
710  }
711 }
#define EFI_UNSUPPORTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:117
BOOLEAN ReadOnly
TRUE if the volume only supports read access.
EFI_GUID efi_file_system_info_id
File system information GUID.
Definition: efi_guid.c:398
uint32_t type
Operating system type.
Definition: ena.h:12
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
static EFI_STATUS efi_file_info(struct efi_file *file, UINTN *len, VOID *data)
Return file information structure.
Definition: efi_file.c:506
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
#define for_each_image(image)
Iterate over all registered images.
Definition: image.h:172
const char * efi_guid_ntoa(CONST EFI_GUID *guid)
Convert GUID to a printable string.
Definition: efi_debug.c:256
static EFI_STATUS efi_file_varlen(UINT64 *base, size_t base_len, const char *name, UINTN *len, VOID *data)
Return variable-length data structure.
Definition: efi_file.c:477
size_t len
Length of raw file image.
Definition: image.h:43
UINT64 VolumeSize
The number of bytes managed by the file system.
EFI_GUID efi_file_info_id
File information GUID.
Definition: efi_guid.c:395
uint8_t data[48]
Additional event data.
Definition: ena.h:22
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114
uint32_t len
Length.
Definition: ena.h:14
UINT64 Size
The size of the EFI_FILE_SYSTEM_INFO structure, including the Null-terminated VolumeLabel string.
An EFI file.
Definition: efi_file.c:74
#define SIZE_OF_EFI_FILE_SYSTEM_INFO
The VolumeLabel field of the EFI_FILE_SYSTEM_INFO data structure is variable length.
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128
void * memset(void *dest, int character, size_t len) __nonnull

References container_of, data, DBGC, efi_file_info(), efi_file_info_id, efi_file_name(), efi_file_system_info_id, efi_file_varlen(), efi_guid_ntoa(), EFI_UNSUPPORTED, efi_file::file, for_each_image, len, image::len, memcmp(), memset(), EFI_FILE_SYSTEM_INFO::ReadOnly, EFI_FILE_SYSTEM_INFO::Size, SIZE_OF_EFI_FILE_SYSTEM_INFO, type, and EFI_FILE_SYSTEM_INFO::VolumeSize.

◆ efi_file_set_info()

static EFI_STATUS EFIAPI efi_file_set_info ( EFI_FILE_PROTOCOL this,
EFI_GUID type,
UINTN len  __unused,
VOID *data  __unused 
)
static

Set file information.

Parameters
thisEFI file
typeType of information
lenBuffer size
dataBuffer
Return values
efircEFI status code

Definition at line 723 of file efi_file.c.

724  {
725  struct efi_file *file = container_of ( this, struct efi_file, file );
726 
727  DBGC ( file, "EFIFILE %s cannot set information of type %s\n",
729  return EFI_WRITE_PROTECTED;
730 }
uint32_t type
Operating system type.
Definition: ena.h:12
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
#define EFI_WRITE_PROTECTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:122
const char * efi_guid_ntoa(CONST EFI_GUID *guid)
Convert GUID to a printable string.
Definition: efi_debug.c:256
An EFI file.
Definition: efi_file.c:74
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References container_of, DBGC, efi_file_name(), efi_guid_ntoa(), EFI_WRITE_PROTECTED, efi_file::file, and type.

◆ efi_file_flush()

static EFI_STATUS EFIAPI efi_file_flush ( EFI_FILE_PROTOCOL this)
static

Flush file modified data.

Parameters
thisEFI file
typeType of information
lenBuffer size
dataBuffer
Return values
efircEFI status code

Definition at line 741 of file efi_file.c.

741  {
742  struct efi_file *file = container_of ( this, struct efi_file, file );
743 
744  DBGC ( file, "EFIFILE %s flushed\n", efi_file_name ( file ) );
745  return 0;
746 }
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
An EFI file.
Definition: efi_file.c:74
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References container_of, DBGC, efi_file_name(), and efi_file::file.

◆ efi_file_load()

static EFI_STATUS EFIAPI efi_file_load ( EFI_LOAD_FILE2_PROTOCOL this,
EFI_DEVICE_PATH_PROTOCOL *path  __unused,
BOOLEAN boot  __unused,
UINTN len,
VOID data 
)
static

Load file.

Parameters
thisEFI file loader
pathFile path
bootBoot policy
lenBuffer size
dataBuffer, or NULL
Return values
efircEFI status code

Definition at line 759 of file efi_file.c.

761  {
762  struct efi_file *file = container_of ( this, struct efi_file, load );
763  size_t max_len;
764  size_t file_len;
765  EFI_STATUS efirc;
766 
767  /* Calculate maximum length */
768  max_len = ( data ? *len : 0 );
769  DBGC ( file, "EFIFILE %s load at %p+%#zx\n",
770  efi_file_name ( file ), data, max_len );
771 
772  /* Check buffer size */
773  file_len = efi_file_len ( file );
774  if ( file_len > max_len ) {
775  *len = file_len;
776  return EFI_BUFFER_TOO_SMALL;
777  }
778 
779  /* Read from file */
780  if ( ( efirc = efi_file_read ( &file->file, len, data ) ) != 0 )
781  return efirc;
782 
783  return 0;
784 }
#define DBGC(...)
Definition: compiler.h:505
static EFI_STATUS EFIAPI efi_file_read(EFI_FILE_PROTOCOL *this, UINTN *len, VOID *data)
Read from file.
Definition: efi_file.c:574
#define EFI_BUFFER_TOO_SMALL
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:119
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
static size_t efi_file_len(struct efi_file *file)
Get length of EFI file.
Definition: efi_file.c:157
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
EFI_LOAD_FILE2_PROTOCOL load
EFI load file protocol.
Definition: efi_file.c:80
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14
An EFI file.
Definition: efi_file.c:74
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References container_of, data, DBGC, EFI_BUFFER_TOO_SMALL, efi_file_len(), efi_file_name(), efi_file_read(), efi_file::file, len, and efi_file::load.

◆ efi_file_open_volume()

static EFI_STATUS EFIAPI efi_file_open_volume ( EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *filesystem  __unused,
EFI_FILE_PROTOCOL **  file 
)
static

Open root directory.

Parameters
filesystemEFI simple file system
Return values
fileEFI file handle
efircEFI status code

Definition at line 864 of file efi_file.c.

865  {
866 
867  DBGC ( &efi_file_root, "EFIFILE open volume\n" );
868  return efi_file_open_fixed ( &efi_file_root, L"<volume>", file );
869 }
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
static EFI_STATUS efi_file_open_fixed(struct efi_file *file, const wchar_t *wname, EFI_FILE_PROTOCOL **new)
Open fixed file.
Definition: efi_file.c:304
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106

References DBGC, efi_file_open_fixed(), efi_file_root, and efi_file_path::file.

◆ efi_block_io_reset()

static EFI_STATUS EFIAPI efi_block_io_reset ( EFI_BLOCK_IO_PROTOCOL *this  __unused,
BOOLEAN  extended 
)
static

Dummy block I/O reset.

Definition at line 879 of file efi_file.c.

879  {
880 
881  DBGC ( &efi_file_root, "EFIFILE block %sreset\n",
882  ( extended ? "extended " : "" ) );
883  return 0;
884 }
#define DBGC(...)
Definition: compiler.h:505
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106

References DBGC, and efi_file_root.

◆ efi_block_io_read_blocks()

static EFI_STATUS EFIAPI efi_block_io_read_blocks ( EFI_BLOCK_IO_PROTOCOL *this  __unused,
UINT32  MediaId,
EFI_LBA  lba,
UINTN  len,
VOID data 
)
static

Dummy block I/O read.

Definition at line 888 of file efi_file.c.

889  {
890 
891  DBGC ( &efi_file_root, "EFIFILE block read ID %#08x LBA %#08llx -> "
892  "%p+%zx\n", MediaId, ( ( unsigned long long ) lba ),
893  data, ( ( size_t ) len ) );
894  return EFI_NO_MEDIA;
895 }
#define DBGC(...)
Definition: compiler.h:505
#define EFI_NO_MEDIA
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:126
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106
uint64_t lba
Starting block number.
Definition: int13.h:22
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14

References data, DBGC, efi_file_root, EFI_NO_MEDIA, lba, and len.

◆ efi_block_io_write_blocks()

static EFI_STATUS EFIAPI efi_block_io_write_blocks ( EFI_BLOCK_IO_PROTOCOL *this  __unused,
UINT32  MediaId,
EFI_LBA  lba,
UINTN  len,
VOID data 
)
static

Dummy block I/O write.

Definition at line 899 of file efi_file.c.

901  {
902 
903  DBGC ( &efi_file_root, "EFIFILE block write ID %#08x LBA %#08llx <- "
904  "%p+%zx\n", MediaId, ( ( unsigned long long ) lba ),
905  data, ( ( size_t ) len ) );
906  return EFI_NO_MEDIA;
907 }
#define DBGC(...)
Definition: compiler.h:505
#define EFI_NO_MEDIA
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:126
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106
uint64_t lba
Starting block number.
Definition: int13.h:22
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14

References data, DBGC, efi_file_root, EFI_NO_MEDIA, lba, and len.

◆ efi_block_io_flush_blocks()

static EFI_STATUS EFIAPI efi_block_io_flush_blocks ( EFI_BLOCK_IO_PROTOCOL *this  __unused)
static

Dummy block I/O flush.

Definition at line 911 of file efi_file.c.

911  {
912 
913  DBGC ( &efi_file_root, "EFIFILE block flush\n" );
914  return 0;
915 }
#define DBGC(...)
Definition: compiler.h:505
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106

References DBGC, and efi_file_root.

◆ efi_disk_io_read_disk()

static EFI_STATUS EFIAPI efi_disk_io_read_disk ( EFI_DISK_IO_PROTOCOL *this  __unused,
UINT32  MediaId,
UINT64  offset,
UINTN  len,
VOID data 
)
static

Dummy disk I/O read.

Definition at line 937 of file efi_file.c.

938  {
939 
940  DBGC ( &efi_file_root, "EFIFILE disk read ID %#08x offset %#08llx -> "
941  "%p+%zx\n", MediaId, ( ( unsigned long long ) offset ),
942  data, ( ( size_t ) len ) );
943  return EFI_NO_MEDIA;
944 }
#define DBGC(...)
Definition: compiler.h:505
#define EFI_NO_MEDIA
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:126
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
uint32_t len
Length.
Definition: ena.h:14

References data, DBGC, efi_file_root, EFI_NO_MEDIA, len, and offset.

◆ efi_disk_io_write_disk()

static EFI_STATUS EFIAPI efi_disk_io_write_disk ( EFI_DISK_IO_PROTOCOL *this  __unused,
UINT32  MediaId,
UINT64  offset,
UINTN  len,
VOID data 
)
static

Dummy disk I/O write.

Definition at line 948 of file efi_file.c.

949  {
950 
951  DBGC ( &efi_file_root, "EFIFILE disk write ID %#08x offset %#08llx <- "
952  "%p+%zx\n", MediaId, ( ( unsigned long long ) offset ),
953  data, ( ( size_t ) len ) );
954  return EFI_NO_MEDIA;
955 }
#define DBGC(...)
Definition: compiler.h:505
#define EFI_NO_MEDIA
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:126
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
uint32_t len
Length.
Definition: ena.h:14

References data, DBGC, efi_file_root, EFI_NO_MEDIA, len, and offset.

◆ efi_file_path_claim()

static int efi_file_path_claim ( struct efi_file_path file)
static

Claim use of fixed device path.

Parameters
fileFixed device path file
Return values
rcReturn status code

The design choice in Linux of using a single fixed device path is unfortunately messy to support, since device paths must be unique within a system. When multiple bootloaders are used (e.g. GRUB loading iPXE loading Linux) then only one bootloader can ever install the device path onto a handle. Bootloaders must therefore be prepared to locate an existing handle and uninstall its device path protocol instance before installing a new handle with the required device path.

Definition at line 979 of file efi_file.c.

979  {
983  VOID *old;
984  EFI_STATUS efirc;
985  int rc;
986 
987  /* Sanity check */
988  assert ( file->handle == NULL );
989 
990  /* Locate handle with this device path, if any */
991  end = file->path;
992  if ( ( ( efirc = bs->LocateDevicePath ( &efi_device_path_protocol_guid,
993  &end, &handle ) ) != 0 ) ||
994  ( end->Type != END_DEVICE_PATH_TYPE ) ) {
995  return 0;
996  }
997 
998  /* Locate device path protocol on this handle */
999  if ( ( ( efirc = bs->HandleProtocol ( handle,
1001  &old ) ) != 0 ) ) {
1002  rc = -EEFI ( efirc );
1003  DBGC ( file, "EFIFILE %s could not locate %s: %s\n",
1004  efi_file_name ( &file->file ),
1005  efi_devpath_text ( file->path ), strerror ( rc ) );
1006  return rc;
1007  }
1008 
1009  /* Uninstall device path protocol, leaving other protocols untouched */
1010  if ( ( efirc = bs->UninstallMultipleProtocolInterfaces (
1011  handle,
1013  NULL ) ) != 0 ) {
1014  rc = -EEFI ( efirc );
1015  DBGC ( file, "EFIFILE %s could not claim %s: %s\n",
1016  efi_file_name ( &file->file ),
1017  efi_devpath_text ( file->path ), strerror ( rc ) );
1018  return rc;
1019  }
1020 
1021  DBGC ( file, "EFIFILE %s claimed %s",
1022  efi_file_name ( &file->file ), efi_devpath_text ( file->path ) );
1023  DBGC ( file, " from %s\n", efi_handle_name ( handle ) );
1024  return 0;
1025 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2098
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:171
#define END_DEVICE_PATH_TYPE
Definition: DevicePath.h:1393
#define DBGC(...)
Definition: compiler.h:505
int old
Definition: bitops.h:64
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
EFI_HANDLE_PROTOCOL HandleProtocol
Definition: UefiSpec.h:1967
const char * efi_devpath_text(EFI_DEVICE_PATH_PROTOCOL *path)
Get textual representation of device path.
Definition: efi_debug.c:463
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:810
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1930
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2010
EFI_GUID efi_device_path_protocol_guid
Device path protocol GUID.
Definition: efi_guid.c:144
#define VOID
Undeclared type.
Definition: Base.h:271
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_file.c:812
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
EFI_SYSTEM_TABLE * efi_systab
uint16_t handle
Handle.
Definition: smbios.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
Definition: efi.h:59
EFI_LOCATE_DEVICE_PATH LocateDevicePath
Definition: UefiSpec.h:1971
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References assert(), EFI_SYSTEM_TABLE::BootServices, DBGC, EEFI, efi_device_path_protocol_guid, efi_devpath_text(), efi_file_name(), efi_handle_name(), efi_systab, end, END_DEVICE_PATH_TYPE, efi_file::file, efi_file_path::file, handle, EFI_BOOT_SERVICES::HandleProtocol, EFI_BOOT_SERVICES::LocateDevicePath, NULL, old, rc, strerror(), EFI_DEVICE_PATH_PROTOCOL::Type, EFI_BOOT_SERVICES::UninstallMultipleProtocolInterfaces, and VOID.

Referenced by efi_file_install().

◆ efi_file_path_install()

static int efi_file_path_install ( struct efi_file_path file)
static

Install fixed device path file.

Parameters
fileFixed device path file
Return values
rcReturn status code

Linux 5.7 added the ability to autodetect an initrd by searching for a handle via a fixed vendor-specific "Linux initrd device path" and then locating and using the EFI_LOAD_FILE2_PROTOCOL instance on that handle.

Definition at line 1038 of file efi_file.c.

1038  {
1040  EFI_STATUS efirc;
1041  int rc;
1042 
1043  /* Sanity check */
1044  assert ( file->handle == NULL );
1045 
1046  /* Create a new handle with this device path */
1047  if ( ( efirc = bs->InstallMultipleProtocolInterfaces (
1048  &file->handle,
1050  &efi_load_file2_protocol_guid, &file->file.load,
1051  NULL ) ) != 0 ) {
1052  rc = -EEFI ( efirc );
1053  DBGC ( file, "EFIFILE %s could not install %s: %s\n",
1054  efi_file_name ( &file->file ),
1055  efi_devpath_text ( file->path ), strerror ( rc ) );
1056  return rc;
1057  }
1058 
1059  DBGC ( file, "EFIFILE %s installed as %s\n",
1060  efi_file_name ( &file->file ), efi_devpath_text ( file->path ) );
1061  return 0;
1062 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2098
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:171
#define DBGC(...)
Definition: compiler.h:505
EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2009
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
const char * efi_devpath_text(EFI_DEVICE_PATH_PROTOCOL *path)
Get textual representation of device path.
Definition: efi_debug.c:463
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI_GUID efi_load_file2_protocol_guid
Load file 2 protocol GUID.
Definition: efi_guid.c:240
EFI Boot Services Table.
Definition: UefiSpec.h:1930
EFI_GUID efi_device_path_protocol_guid
Device path protocol GUID.
Definition: efi_guid.c:144
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
EFI_SYSTEM_TABLE * efi_systab
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References assert(), EFI_SYSTEM_TABLE::BootServices, DBGC, EEFI, efi_device_path_protocol_guid, efi_devpath_text(), efi_file_name(), efi_load_file2_protocol_guid, efi_systab, efi_file::file, efi_file_path::file, EFI_BOOT_SERVICES::InstallMultipleProtocolInterfaces, NULL, rc, and strerror().

Referenced by efi_file_install().

◆ efi_file_path_uninstall()

static void efi_file_path_uninstall ( struct efi_file_path file)
static

Uninstall fixed device path file.

Parameters
fileFixed device path file
Return values
rcReturn status code

Definition at line 1070 of file efi_file.c.

1070  {
1072  EFI_STATUS efirc;
1073  int rc;
1074 
1075  /* Do nothing if file is already uninstalled */
1076  if ( ! file->handle )
1077  return;
1078 
1079  /* Uninstall protocols. Do this via two separate calls, in
1080  * case another executable has already uninstalled the device
1081  * path protocol from our handle.
1082  */
1083  if ( ( efirc = bs->UninstallMultipleProtocolInterfaces (
1084  file->handle,
1086  NULL ) ) != 0 ) {
1087  rc = -EEFI ( efirc );
1088  DBGC ( file, "EFIFILE %s could not uninstall %s: %s\n",
1089  efi_file_name ( &file->file ),
1090  efi_devpath_text ( file->path ), strerror ( rc ) );
1091  /* Continue uninstalling */
1092  }
1093  if ( ( efirc = bs->UninstallMultipleProtocolInterfaces (
1094  file->handle,
1095  &efi_load_file2_protocol_guid, &file->file.load,
1096  NULL ) ) != 0 ) {
1097  rc = -EEFI ( efirc );
1098  DBGC ( file, "EFIFILE %s could not uninstall %s: %s\n",
1099  efi_file_name ( &file->file ),
1101  strerror ( rc ) );
1102  /* Continue uninstalling */
1103  }
1104 
1105  /* Mark handle as uninstalled */
1106  file->handle = NULL;
1107 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2098
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:171
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_PROTOCOL file
EFI file protocol.
Definition: efi_file.c:78
const char * efi_devpath_text(EFI_DEVICE_PATH_PROTOCOL *path)
Get textual representation of device path.
Definition: efi_debug.c:463
const char * efi_guid_ntoa(CONST EFI_GUID *guid)
Convert GUID to a printable string.
Definition: efi_debug.c:256
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI_GUID efi_load_file2_protocol_guid
Load file 2 protocol GUID.
Definition: efi_guid.c:240
EFI Boot Services Table.
Definition: UefiSpec.h:1930
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2010
EFI_GUID efi_device_path_protocol_guid
Device path protocol GUID.
Definition: efi_guid.c:144
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
EFI_SYSTEM_TABLE * efi_systab
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static const char * efi_file_name(struct efi_file *file)
Get EFI file name (for debugging)
Definition: efi_file.c:128

References EFI_SYSTEM_TABLE::BootServices, DBGC, EEFI, efi_device_path_protocol_guid, efi_devpath_text(), efi_file_name(), efi_guid_ntoa(), efi_load_file2_protocol_guid, efi_systab, efi_file::file, efi_file_path::file, NULL, rc, strerror(), and EFI_BOOT_SERVICES::UninstallMultipleProtocolInterfaces.

Referenced by efi_file_install(), and efi_file_uninstall().

◆ efi_file_install()

int efi_file_install ( EFI_HANDLE  handle)

Install EFI simple file system protocol.

Parameters
handleEFI handle
Return values
rcReturn status code

Definition at line 1115 of file efi_file.c.

1115  {
1117  union {
1118  EFI_DISK_IO_PROTOCOL *diskio;
1119  void *interface;
1120  } diskio;
1121  struct image *image;
1122  EFI_STATUS efirc;
1123  int rc;
1124 
1125  /* Reset root directory state */
1126  efi_file_root.pos = 0;
1127 
1128  /* Install the simple file system protocol, block I/O
1129  * protocol, and disk I/O protocol. We don't have a block
1130  * device, but large parts of the EDK2 codebase make the
1131  * assumption that file systems are normally attached to block
1132  * devices, and so we create a dummy block device on the same
1133  * handle just to keep things looking normal.
1134  */
1135  if ( ( efirc = bs->InstallMultipleProtocolInterfaces (
1136  &handle,
1142  &efi_simple_file_system_protocol, NULL ) ) != 0 ) {
1143  rc = -EEFI ( efirc );
1144  DBGC ( handle, "Could not install simple file system "
1145  "protocols: %s\n", strerror ( rc ) );
1146  goto err_install;
1147  }
1148 
1149  /* The FAT filesystem driver has a bug: if a block device
1150  * contains no FAT filesystem but does have an
1151  * EFI_SIMPLE_FILE_SYSTEM_PROTOCOL instance, the FAT driver
1152  * will assume that it must have previously installed the
1153  * EFI_SIMPLE_FILE_SYSTEM_PROTOCOL. This causes the FAT
1154  * driver to claim control of our device, and to refuse to
1155  * stop driving it, which prevents us from later uninstalling
1156  * correctly.
1157  *
1158  * Work around this bug by opening the disk I/O protocol
1159  * ourselves, thereby preventing the FAT driver from opening
1160  * it.
1161  *
1162  * Note that the alternative approach of opening the block I/O
1163  * protocol (and thereby in theory preventing DiskIo from
1164  * attaching to the block I/O protocol) causes an endless loop
1165  * of calls to our DRIVER_STOP method when starting the EFI
1166  * shell. I have no idea why this is.
1167  */
1168  if ( ( efirc = bs->OpenProtocol ( handle, &efi_disk_io_protocol_guid,
1169  &diskio.interface, efi_image_handle,
1170  handle,
1171  EFI_OPEN_PROTOCOL_BY_DRIVER ) ) != 0){
1172  rc = -EEFI ( efirc );
1173  DBGC ( handle, "Could not open disk I/O protocol: %s\n",
1174  strerror ( rc ) );
1176  goto err_open;
1177  }
1178  assert ( diskio.diskio == &efi_disk_io_protocol );
1179 
1180  /* Claim Linux initrd fixed device path */
1181  if ( ( rc = efi_file_path_claim ( &efi_file_initrd ) ) != 0 )
1182  goto err_initrd_claim;
1183 
1184  /* Install Linux initrd fixed device path file if non-empty */
1185  for_each_image ( image ) {
1186  if ( image->flags & IMAGE_HIDDEN )
1187  continue;
1188  if ( ( rc = efi_file_path_install ( &efi_file_initrd ) ) != 0 )
1189  goto err_initrd_install;
1190  break;
1191  }
1192 
1193  return 0;
1194 
1196  err_initrd_install:
1197  err_initrd_claim:
1200  err_open:
1202  handle,
1209  err_install:
1210  return rc;
1211 }
unsigned int flags
Flags.
Definition: image.h:36
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2098
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:171
static int efi_file_path_install(struct efi_file_path *file)
Install fixed device path file.
Definition: efi_file.c:1038
static void efi_file_path_uninstall(struct efi_file_path *file)
Uninstall fixed device path file.
Definition: efi_file.c:1070
static EFI_BLOCK_IO_PROTOCOL efi_block_io_protocol
Dummy EFI block I/O protocol.
Definition: efi_file.c:926
#define DBGC(...)
Definition: compiler.h:505
#define EFI_OPEN_PROTOCOL_BY_DRIVER
Definition: UefiSpec.h:1357
EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2009
#define DBGC_EFI_OPENERS(...)
Definition: efi.h:322
An executable image.
Definition: image.h:24
EFI_CLOSE_PROTOCOL CloseProtocol
Definition: UefiSpec.h:2000
static EFI_DISK_IO_PROTOCOL efi_disk_io_protocol
Dummy EFI disk I/O protocol.
Definition: efi_file.c:958
EFI_GUID efi_disk_io_protocol_guid
Disk I/O protocol GUID.
Definition: efi_guid.c:164
size_t pos
Current file position.
Definition: efi_file.c:86
static struct efi_file_path efi_file_initrd
Magic initrd file.
Definition: efi_file.c:107
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
An object interface.
Definition: interface.h:124
EFI_GUID efi_simple_file_system_protocol_guid
Simple file system protocol GUID.
Definition: efi_guid.c:304
static struct efi_file efi_file_root
Root directory.
Definition: efi_file.c:106
This protocol is used to abstract Block I/O interfaces.
Definition: DiskIo.h:100
#define for_each_image(image)
Iterate over all registered images.
Definition: image.h:172
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1930
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:34
#define IMAGE_HIDDEN
Image will be hidden from enumeration.
Definition: image.h:73
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2010
EFI_GUID efi_block_io_protocol_guid
Block I/O protocol GUID.
Definition: efi_guid.c:120
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
EFI_SYSTEM_TABLE * efi_systab
EFI_OPEN_PROTOCOL OpenProtocol
Definition: UefiSpec.h:1999
static int efi_file_path_claim(struct efi_file_path *file)
Claim use of fixed device path.
Definition: efi_file.c:979
static EFI_SIMPLE_FILE_SYSTEM_PROTOCOL efi_simple_file_system_protocol
EFI simple file system protocol.
Definition: efi_file.c:872
uint16_t handle
Handle.
Definition: smbios.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References assert(), EFI_SYSTEM_TABLE::BootServices, EFI_BOOT_SERVICES::CloseProtocol, DBGC, DBGC_EFI_OPENERS, EEFI, efi_block_io_protocol, efi_block_io_protocol_guid, efi_disk_io_protocol, efi_disk_io_protocol_guid, efi_file_initrd, efi_file_path_claim(), efi_file_path_install(), efi_file_path_uninstall(), efi_file_root, efi_image_handle, EFI_OPEN_PROTOCOL_BY_DRIVER, efi_simple_file_system_protocol, efi_simple_file_system_protocol_guid, efi_systab, image::flags, for_each_image, handle, IMAGE_HIDDEN, EFI_BOOT_SERVICES::InstallMultipleProtocolInterfaces, NULL, EFI_BOOT_SERVICES::OpenProtocol, efi_file::pos, rc, strerror(), and EFI_BOOT_SERVICES::UninstallMultipleProtocolInterfaces.

Referenced by efi_image_exec().

◆ efi_file_uninstall()

void efi_file_uninstall ( EFI_HANDLE  handle)

Uninstall EFI simple file system protocol.

Parameters
handleEFI handle

Definition at line 1218 of file efi_file.c.

1218  {
1220  EFI_STATUS efirc;
1221  int rc;
1222 
1223  /* Uninstall Linux initrd fixed device path file */
1225 
1226  /* Close our own disk I/O protocol */
1229 
1230  /* We must install the file system protocol first, since
1231  * otherwise the EDK2 code will attempt to helpfully uninstall
1232  * it when the block I/O protocol is uninstalled, leading to a
1233  * system lock-up.
1234  */
1235  if ( ( efirc = bs->UninstallMultipleProtocolInterfaces (
1236  handle,
1242  &efi_block_io_protocol, NULL ) ) != 0 ) {
1243  rc = -EEFI ( efirc );
1244  DBGC ( handle, "Could not uninstall simple file system "
1245  "protocols: %s\n", strerror ( rc ) );
1246  /* Oh dear */
1247  }
1248 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2098
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:171
static void efi_file_path_uninstall(struct efi_file_path *file)
Uninstall fixed device path file.
Definition: efi_file.c:1070
static EFI_BLOCK_IO_PROTOCOL efi_block_io_protocol
Dummy EFI block I/O protocol.
Definition: efi_file.c:926
#define DBGC(...)
Definition: compiler.h:505
EFI_CLOSE_PROTOCOL CloseProtocol
Definition: UefiSpec.h:2000
static EFI_DISK_IO_PROTOCOL efi_disk_io_protocol
Dummy EFI disk I/O protocol.
Definition: efi_file.c:958
EFI_GUID efi_disk_io_protocol_guid
Disk I/O protocol GUID.
Definition: efi_guid.c:164
static struct efi_file_path efi_file_initrd
Magic initrd file.
Definition: efi_file.c:107
EFI_GUID efi_simple_file_system_protocol_guid
Simple file system protocol GUID.
Definition: efi_guid.c:304
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1930
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:34
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2010
EFI_GUID efi_block_io_protocol_guid
Block I/O protocol GUID.
Definition: efi_guid.c:120
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
EFI_SYSTEM_TABLE * efi_systab
static EFI_SIMPLE_FILE_SYSTEM_PROTOCOL efi_simple_file_system_protocol
EFI simple file system protocol.
Definition: efi_file.c:872
uint16_t handle
Handle.
Definition: smbios.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References EFI_SYSTEM_TABLE::BootServices, EFI_BOOT_SERVICES::CloseProtocol, DBGC, EEFI, efi_block_io_protocol, efi_block_io_protocol_guid, efi_disk_io_protocol, efi_disk_io_protocol_guid, efi_file_initrd, efi_file_path_uninstall(), efi_image_handle, efi_simple_file_system_protocol, efi_simple_file_system_protocol_guid, efi_systab, handle, NULL, rc, strerror(), and EFI_BOOT_SERVICES::UninstallMultipleProtocolInterfaces.

Referenced by efi_image_exec().

Variable Documentation

◆ efi_file_root

static struct efi_file efi_file_root
static
Initial value:
= {
.refcnt = REF_INIT ( ref_no_free ),
.file = {
.Open = efi_file_open,
.Close = efi_file_close,
.Delete = efi_file_delete,
.Read = efi_file_read,
.Write = efi_file_write,
.GetPosition = efi_file_get_position,
.SetPosition = efi_file_set_position,
.GetInfo = efi_file_get_info,
.SetInfo = efi_file_set_info,
.Flush = efi_file_flush,
},
.load = {
.LoadFile = efi_file_load,
},
.image = NULL,
.name = "",
}
static EFI_STATUS EFIAPI efi_file_set_info(EFI_FILE_PROTOCOL *this, EFI_GUID *type, UINTN len __unused, VOID *data __unused)
Set file information.
Definition: efi_file.c:723
static EFI_STATUS EFIAPI efi_file_open(EFI_FILE_PROTOCOL *this, EFI_FILE_PROTOCOL **new, CHAR16 *wname, UINT64 mode, UINT64 attributes __unused)
Open file.
Definition: efi_file.c:373
static EFI_STATUS EFIAPI efi_file_get_info(EFI_FILE_PROTOCOL *this, EFI_GUID *type, UINTN *len, VOID *data)
Get file information.
Definition: efi_file.c:677
static EFI_STATUS EFIAPI efi_file_get_position(EFI_FILE_PROTOCOL *this, UINT64 *position)
Get file position.
Definition: efi_file.c:660
static EFI_STATUS EFIAPI efi_file_read(EFI_FILE_PROTOCOL *this, UINTN *len, VOID *data)
Read from file.
Definition: efi_file.c:574
static EFI_STATUS EFIAPI efi_file_load(EFI_LOAD_FILE2_PROTOCOL *this, EFI_DEVICE_PATH_PROTOCOL *path __unused, BOOLEAN boot __unused, UINTN *len, VOID *data)
Load file.
Definition: efi_file.c:759
static EFI_STATUS EFIAPI efi_file_set_position(EFI_FILE_PROTOCOL *this, UINT64 position)
Set file position.
Definition: efi_file.c:624
static EFI_STATUS EFIAPI efi_file_close(EFI_FILE_PROTOCOL *this)
Close file.
Definition: efi_file.c:439
static EFI_STATUS EFIAPI efi_file_flush(EFI_FILE_PROTOCOL *this)
Flush file modified data.
Definition: efi_file.c:741
static EFI_STATUS EFIAPI efi_file_write(EFI_FILE_PROTOCOL *this, UINTN *len, VOID *data __unused)
Write to file.
Definition: efi_file.c:607
#define EFI_FILE_PROTOCOL_REVISION
static EFI_STATUS EFIAPI efi_file_delete(EFI_FILE_PROTOCOL *this)
Close and delete file.
Definition: efi_file.c:455
#define REF_INIT(free_fn)
Initialise a static reference counter.
Definition: refcnt.h:77
void ref_no_free(struct refcnt *refcnt __unused)
Do not free reference-counted object.
Definition: refcnt.c:101
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

Root directory.

Definition at line 106 of file efi_file.c.

Referenced by efi_block_io_flush_blocks(), efi_block_io_read_blocks(), efi_block_io_reset(), efi_block_io_write_blocks(), efi_disk_io_read_disk(), efi_disk_io_write_disk(), efi_file_info(), efi_file_install(), efi_file_name(), efi_file_open(), efi_file_open_image(), and efi_file_open_volume().

◆ efi_file_initrd

static struct efi_file_path efi_file_initrd
static
Initial value:
= {
.file = {
.refcnt = REF_INIT ( ref_no_free ),
.file = {
.Open = efi_file_open,
.Close = efi_file_close,
.Delete = efi_file_delete,
.Read = efi_file_read,
.Write = efi_file_write,
.GetPosition = efi_file_get_position,
.SetPosition = efi_file_set_position,
.GetInfo = efi_file_get_info,
.SetInfo = efi_file_set_info,
.Flush = efi_file_flush,
},
.load = {
.LoadFile = efi_file_load,
},
.image = NULL,
.name = "initrd.magic",
},
.path = &efi_file_initrd_path.vendor.Header,
}
static EFI_STATUS EFIAPI efi_file_set_info(EFI_FILE_PROTOCOL *this, EFI_GUID *type, UINTN len __unused, VOID *data __unused)
Set file information.
Definition: efi_file.c:723
static EFI_STATUS EFIAPI efi_file_open(EFI_FILE_PROTOCOL *this, EFI_FILE_PROTOCOL **new, CHAR16 *wname, UINT64 mode, UINT64 attributes __unused)
Open file.
Definition: efi_file.c:373
static EFI_STATUS EFIAPI efi_file_get_info(EFI_FILE_PROTOCOL *this, EFI_GUID *type, UINTN *len, VOID *data)
Get file information.
Definition: efi_file.c:677
static EFI_STATUS EFIAPI efi_file_get_position(EFI_FILE_PROTOCOL *this, UINT64 *position)
Get file position.
Definition: efi_file.c:660
static EFI_STATUS EFIAPI efi_file_read(EFI_FILE_PROTOCOL *this, UINTN *len, VOID *data)
Read from file.
Definition: efi_file.c:574
static EFI_STATUS EFIAPI efi_file_load(EFI_LOAD_FILE2_PROTOCOL *this, EFI_DEVICE_PATH_PROTOCOL *path __unused, BOOLEAN boot __unused, UINTN *len, VOID *data)
Load file.
Definition: efi_file.c:759
static struct @429 efi_file_initrd_path
Linux initrd fixed device path.
static EFI_STATUS EFIAPI efi_file_set_position(EFI_FILE_PROTOCOL *this, UINT64 position)
Set file position.
Definition: efi_file.c:624
static EFI_STATUS EFIAPI efi_file_close(EFI_FILE_PROTOCOL *this)
Close file.
Definition: efi_file.c:439
static EFI_STATUS EFIAPI efi_file_flush(EFI_FILE_PROTOCOL *this)
Flush file modified data.
Definition: efi_file.c:741
static EFI_STATUS EFIAPI efi_file_write(EFI_FILE_PROTOCOL *this, UINTN *len, VOID *data __unused)
Write to file.
Definition: efi_file.c:607
#define EFI_FILE_PROTOCOL_REVISION
static EFI_STATUS EFIAPI efi_file_delete(EFI_FILE_PROTOCOL *this)
Close and delete file.
Definition: efi_file.c:455
#define REF_INIT(free_fn)
Initialise a static reference counter.
Definition: refcnt.h:77
static size_t efi_file_read_initrd(struct efi_file_reader *reader)
Read from magic initrd file.
Definition: efi_file.c:239
void ref_no_free(struct refcnt *refcnt __unused)
Do not free reference-counted object.
Definition: refcnt.c:101
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

Magic initrd file.

Definition at line 107 of file efi_file.c.

Referenced by efi_file_install(), efi_file_open(), and efi_file_uninstall().

◆ vendor

Definition at line 811 of file efi_file.c.

◆ end

Definition at line 812 of file efi_file.c.

Referenced by efi_file_path_claim().

◆ efi_file_initrd_path

struct { ... } efi_file_initrd_path
Initial value:
= {
.vendor = {
.Header = {
.SubType = MEDIA_VENDOR_DP,
.Length[0] = sizeof ( efi_file_initrd_path.vendor ),
},
},
.end = {
.Length[0] = sizeof ( efi_file_initrd_path.end ),
},
}
#define END_DEVICE_PATH_TYPE
Definition: DevicePath.h:1393
#define MEDIA_VENDOR_DP
Media vendor device path subtype.
Definition: DevicePath.h:1095
static struct @429 efi_file_initrd_path
Linux initrd fixed device path.
#define LINUX_INITRD_VENDOR_GUID
Linux initrd fixed device path vendor GUID.
Definition: efi_file.c:57
#define MEDIA_DEVICE_PATH
Definition: DevicePath.h:1011
#define END_ENTIRE_DEVICE_PATH_SUBTYPE
Definition: DevicePath.h:1394

Linux initrd fixed device path.

◆ efi_simple_file_system_protocol

EFI_SIMPLE_FILE_SYSTEM_PROTOCOL efi_simple_file_system_protocol
static
Initial value:
= {
.OpenVolume = efi_file_open_volume,
}
static EFI_STATUS EFIAPI efi_file_open_volume(EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *filesystem __unused, EFI_FILE_PROTOCOL **file)
Open root directory.
Definition: efi_file.c:864
#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION

EFI simple file system protocol.

Definition at line 872 of file efi_file.c.

Referenced by efi_file_install(), and efi_file_uninstall().

◆ efi_block_io_media

EFI_BLOCK_IO_MEDIA efi_block_io_media
static
Initial value:
= {
.MediaId = EFI_MEDIA_ID_MAGIC,
.MediaPresent = TRUE,
.ReadOnly = TRUE,
.BlockSize = 1,
}
#define TRUE
Definition: tlan.h:46
#define EFI_MEDIA_ID_MAGIC
EFI media ID.
Definition: efi_file.c:54

Dummy block I/O media.

Definition at line 918 of file efi_file.c.

◆ efi_block_io_protocol

EFI_BLOCK_IO_PROTOCOL efi_block_io_protocol
static
Initial value:
= {
.Media = &efi_block_io_media,
.ReadBlocks = efi_block_io_read_blocks,
.WriteBlocks = efi_block_io_write_blocks,
.FlushBlocks = efi_block_io_flush_blocks,
}
static EFI_STATUS EFIAPI efi_block_io_read_blocks(EFI_BLOCK_IO_PROTOCOL *this __unused, UINT32 MediaId, EFI_LBA lba, UINTN len, VOID *data)
Dummy block I/O read.
Definition: efi_file.c:888
static EFI_STATUS EFIAPI efi_block_io_write_blocks(EFI_BLOCK_IO_PROTOCOL *this __unused, UINT32 MediaId, EFI_LBA lba, UINTN len, VOID *data)
Dummy block I/O write.
Definition: efi_file.c:899
static EFI_STATUS EFIAPI efi_block_io_reset(EFI_BLOCK_IO_PROTOCOL *this __unused, BOOLEAN extended)
Dummy block I/O reset.
Definition: efi_file.c:879
static EFI_STATUS EFIAPI efi_block_io_flush_blocks(EFI_BLOCK_IO_PROTOCOL *this __unused)
Dummy block I/O flush.
Definition: efi_file.c:911
#define EFI_BLOCK_IO_PROTOCOL_REVISION
Definition: BlockIo.h:204
static EFI_BLOCK_IO_MEDIA efi_block_io_media
Dummy block I/O media.
Definition: efi_file.c:918

Dummy EFI block I/O protocol.

Definition at line 926 of file efi_file.c.

Referenced by efi_file_install(), and efi_file_uninstall().

◆ efi_disk_io_protocol

EFI_DISK_IO_PROTOCOL efi_disk_io_protocol
static
Initial value:
= {
.ReadDisk = efi_disk_io_read_disk,
.WriteDisk = efi_disk_io_write_disk,
}
static EFI_STATUS EFIAPI efi_disk_io_read_disk(EFI_DISK_IO_PROTOCOL *this __unused, UINT32 MediaId, UINT64 offset, UINTN len, VOID *data)
Dummy disk I/O read.
Definition: efi_file.c:937
static EFI_STATUS EFIAPI efi_disk_io_write_disk(EFI_DISK_IO_PROTOCOL *this __unused, UINT32 MediaId, UINT64 offset, UINTN len, VOID *data)
Dummy disk I/O write.
Definition: efi_file.c:948
#define EFI_DISK_IO_PROTOCOL_REVISION
Definition: DiskIo.h:90

Dummy EFI disk I/O protocol.

Definition at line 958 of file efi_file.c.

Referenced by efi_file_install(), and efi_file_uninstall().