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

EFI autoexec script. More...

#include <string.h>
#include <errno.h>
#include <ipxe/timer.h>
#include <ipxe/image.h>
#include <ipxe/netdevice.h>
#include <ipxe/uri.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/efi_utils.h>
#include <ipxe/efi/efi_autoexec.h>
#include <ipxe/efi/mnpnet.h>
#include <usr/imgmgmt.h>
#include <usr/sync.h>

Go to the source code of this file.

Data Structures

struct  efi_autoexec_loader
 An EFI autoexec script loader. More...
 

Macros

#define EFI_AUTOEXEC_TIMEOUT   ( 30 * TICKS_PER_SEC )
 Timeout for autoexec script downloads. More...
 
#define EFI_AUTOEXEC_SYNC_TIMEOUT   ( 1 * TICKS_PER_SEC )
 Timeout for autoexec pending operation completion. More...
 
#define EFI_AUTOEXEC_NAME   "autoexec.ipxe"
 Autoexec script image name. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int efi_autoexec_filesystem (EFI_HANDLE handle, struct image **image)
 Load autoexec script from filesystem. More...
 
static int efi_autoexec_network (EFI_HANDLE handle, struct image **image)
 Load autoexec script via temporary network device. More...
 
int efi_autoexec_load (void)
 Load autoexec script. More...
 

Variables

static struct efi_autoexec_loader efi_autoexec_loaders []
 Autoexec script loaders. More...
 

Detailed Description

EFI autoexec script.

Definition in file efi_autoexec.c.

Macro Definition Documentation

◆ EFI_AUTOEXEC_TIMEOUT

#define EFI_AUTOEXEC_TIMEOUT   ( 30 * TICKS_PER_SEC )

Timeout for autoexec script downloads.

Definition at line 46 of file efi_autoexec.c.

◆ EFI_AUTOEXEC_SYNC_TIMEOUT

#define EFI_AUTOEXEC_SYNC_TIMEOUT   ( 1 * TICKS_PER_SEC )

Timeout for autoexec pending operation completion.

Definition at line 49 of file efi_autoexec.c.

◆ EFI_AUTOEXEC_NAME

#define EFI_AUTOEXEC_NAME   "autoexec.ipxe"

Autoexec script image name.

Definition at line 52 of file efi_autoexec.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ efi_autoexec_filesystem()

static int efi_autoexec_filesystem ( EFI_HANDLE  handle,
struct image **  image 
)
static

Load autoexec script from filesystem.

Parameters
handleSimple filesystem protocol handle
imageImage to fill in
Return values
rcReturn status code

Definition at line 75 of file efi_autoexec.c.

75  {
77  int rc;
78 
79  /* Check that we were loaded from a filesystem */
80  if ( handle != device ) {
81  DBGC ( device, "EFI %s is not the file system handle\n",
82  efi_handle_name ( device ) );
83  return -ENOTTY;
84  }
85 
86  /* Try loading from loaded image directory, if supported */
87  if ( ( rc = imgacquire ( "file:" EFI_AUTOEXEC_NAME,
88  EFI_AUTOEXEC_TIMEOUT, image ) ) == 0 )
89  return 0;
90 
91  /* Try loading from root directory, if supported */
92  if ( ( rc = imgacquire ( "file:/" EFI_AUTOEXEC_NAME,
93  EFI_AUTOEXEC_TIMEOUT, image ) ) == 0 )
94  return 0;
95 
96  return rc;
97 }
EFI_LOADED_IMAGE_PROTOCOL * efi_loaded_image
Loaded image protocol for this image.
Definition: efi_init.c:37
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
#define EFI_AUTOEXEC_TIMEOUT
Timeout for autoexec script downloads.
Definition: efi_autoexec.c:46
A hardware device.
Definition: device.h:73
#define EFI_AUTOEXEC_NAME
Autoexec script image name.
Definition: efi_autoexec.c:52
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:810
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:594
uint16_t handle
Handle.
Definition: smbios.h:16
int imgacquire(const char *name_uri, unsigned long timeout, struct image **image)
Acquire an image.
Definition: imgmgmt.c:141
Definition: efi.h:59
EFI_HANDLE DeviceHandle
The device handle that the EFI Image was loaded from.
Definition: LoadedImage.h:55

References DBGC, EFI_LOADED_IMAGE_PROTOCOL::DeviceHandle, EFI_AUTOEXEC_NAME, EFI_AUTOEXEC_TIMEOUT, efi_handle_name(), efi_loaded_image, ENOTTY, handle, imgacquire(), and rc.

◆ efi_autoexec_network()

static int efi_autoexec_network ( EFI_HANDLE  handle,
struct image **  image 
)
static

Load autoexec script via temporary network device.

Parameters
handleManaged network protocol service binding handle
imageImage to fill in
Return values
rcReturn status code

Definition at line 106 of file efi_autoexec.c.

106  {
108  struct net_device *netdev;
109  int rc;
110 
111  /* Create temporary network device */
112  if ( ( rc = mnptemp_create ( handle, &netdev ) ) != 0 ) {
113  DBGC ( device, "EFI %s could not create net device: %s\n",
114  efi_handle_name ( device ), strerror ( rc ) );
115  goto err_create;
116  }
117 
118  /* Do nothing unless we have a usable current working URI */
119  if ( ! cwuri ) {
120  DBGC ( device, "EFI %s has no current working URI\n",
121  efi_handle_name ( device ) );
122  rc = -ENOTTY;
123  goto err_cwuri;
124  }
125 
126  /* Open network device */
127  if ( ( rc = netdev_open ( netdev ) ) != 0 ) {
128  DBGC ( device, "EFI %s could not open net device: %s\n",
129  efi_handle_name ( device ), strerror ( rc ) );
130  goto err_open;
131  }
132 
133  /* Attempt download */
135  if ( rc != 0 ) {
136  DBGC ( device, "EFI %s could not download %s: %s\n",
138  strerror ( rc ) );
139  }
140 
141  /* Ensure network exchanges have completed */
143 
144  err_open:
145  err_cwuri:
147  err_create:
148  return rc;
149 }
EFI_LOADED_IMAGE_PROTOCOL * efi_loaded_image
Loaded image protocol for this image.
Definition: efi_init.c:37
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
#define EFI_AUTOEXEC_TIMEOUT
Timeout for autoexec script downloads.
Definition: efi_autoexec.c:46
A hardware device.
Definition: device.h:73
#define EFI_AUTOEXEC_NAME
Autoexec script image name.
Definition: efi_autoexec.c:52
void mnptemp_destroy(struct net_device *netdev)
Destroy temporary MNP network device.
Definition: mnpnet.c:551
int sync(unsigned long timeout)
Wait for pending operations to complete.
Definition: sync.c:73
static struct net_device * netdev
Definition: gdbudp.c:52
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
A network device.
Definition: netdevice.h:352
int mnptemp_create(EFI_HANDLE handle, struct net_device **netdev)
Create temporary MNP network device.
Definition: mnpnet.c:514
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:594
#define EFI_AUTOEXEC_SYNC_TIMEOUT
Timeout for autoexec pending operation completion.
Definition: efi_autoexec.c:49
struct uri * cwuri
Current working URI.
Definition: cwuri.c:38
uint16_t handle
Handle.
Definition: smbios.h:16
int netdev_open(struct net_device *netdev)
Open network device.
Definition: netdevice.c:861
int imgacquire(const char *name_uri, unsigned long timeout, struct image **image)
Acquire an image.
Definition: imgmgmt.c:141
Definition: efi.h:59
EFI_HANDLE DeviceHandle
The device handle that the EFI Image was loaded from.
Definition: LoadedImage.h:55

References cwuri, DBGC, EFI_LOADED_IMAGE_PROTOCOL::DeviceHandle, EFI_AUTOEXEC_NAME, EFI_AUTOEXEC_SYNC_TIMEOUT, EFI_AUTOEXEC_TIMEOUT, efi_handle_name(), efi_loaded_image, ENOTTY, handle, imgacquire(), mnptemp_create(), mnptemp_destroy(), netdev, netdev_open(), rc, strerror(), and sync().

◆ efi_autoexec_load()

int efi_autoexec_load ( void  )

Load autoexec script.

Return values
rcReturn status code

Definition at line 168 of file efi_autoexec.c.

168  {
171  struct efi_autoexec_loader *loader;
172  struct image *image;
173  unsigned int i;
174  int rc;
175 
176  /* Use first applicable loader */
177  for ( i = 0 ; i < ( sizeof ( efi_autoexec_loaders ) /
178  sizeof ( efi_autoexec_loaders[0] ) ) ; i ++ ) {
179 
180  /* Locate required protocol for this loader */
181  loader = &efi_autoexec_loaders[i];
182  if ( ( rc = efi_locate_device ( device, loader->protocol,
183  &handle, 0 ) ) != 0 ) {
184  DBGC ( device, "EFI %s found no %s: %s\n",
186  efi_guid_ntoa ( loader->protocol ),
187  strerror ( rc ) );
188  continue;
189  }
190  DBGC ( device, "EFI %s found %s on ",
192  efi_guid_ntoa ( loader->protocol ) );
193  DBGC ( device, "%s\n", efi_handle_name ( handle ) );
194 
195  /* Try loading */
196  if ( ( rc = loader->load ( handle, &image ) ) != 0 )
197  return rc;
198 
199  /* Discard zero-length images */
200  if ( ! image->len ) {
201  DBGC ( device, "EFI %s discarding zero-length %s\n",
204  return -ENOENT;
205  }
206 
207  DBGC ( device, "EFI %s loaded %s (%zd bytes)\n",
209  return 0;
210  }
211 
212  return -ENOENT;
213 }
EFI_LOADED_IMAGE_PROTOCOL * efi_loaded_image
Loaded image protocol for this image.
Definition: efi_init.c:37
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
#define ENOENT
No such file or directory.
Definition: errno.h:514
An executable image.
Definition: image.h:24
EFI_GUID * protocol
Required protocol GUID.
Definition: efi_autoexec.c:57
A hardware device.
Definition: device.h:73
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:810
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
size_t len
Length of raw file image.
Definition: image.h:43
static struct efi_autoexec_loader efi_autoexec_loaders[]
Autoexec script loaders.
Definition: efi_autoexec.c:152
int efi_locate_device(EFI_HANDLE device, EFI_GUID *protocol, EFI_HANDLE *parent, unsigned int skip)
Locate parent device supporting a given protocol.
Definition: efi_utils.c:45
void unregister_image(struct image *image)
Unregister executable image.
Definition: image.c:322
int(* load)(EFI_HANDLE handle, struct image **image)
Load autoexec script.
Definition: efi_autoexec.c:65
uint16_t handle
Handle.
Definition: smbios.h:16
char * name
Name.
Definition: image.h:34
An EFI autoexec script loader.
Definition: efi_autoexec.c:55
Definition: efi.h:59
EFI_HANDLE DeviceHandle
The device handle that the EFI Image was loaded from.
Definition: LoadedImage.h:55

References DBGC, EFI_LOADED_IMAGE_PROTOCOL::DeviceHandle, efi_autoexec_loaders, efi_guid_ntoa(), efi_handle_name(), efi_loaded_image, efi_locate_device(), ENOENT, handle, image::len, efi_autoexec_loader::load, image::name, efi_autoexec_loader::protocol, rc, strerror(), and unregister_image().

Referenced by efi_probe().

Variable Documentation

◆ efi_autoexec_loaders

struct efi_autoexec_loader efi_autoexec_loaders[]
static
Initial value:
= {
{
},
{
},
}
EFI_GUID efi_managed_network_service_binding_protocol_guid
Managed network service binding protocol GUID.
Definition: efi_guid.c:256
static int efi_autoexec_filesystem(EFI_HANDLE handle, struct image **image)
Load autoexec script from filesystem.
Definition: efi_autoexec.c:75
EFI_GUID efi_simple_file_system_protocol_guid
Simple file system protocol GUID.
Definition: efi_guid.c:304
static int efi_autoexec_network(EFI_HANDLE handle, struct image **image)
Load autoexec script via temporary network device.
Definition: efi_autoexec.c:106

Autoexec script loaders.

Definition at line 152 of file efi_autoexec.c.

Referenced by efi_autoexec_load().