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)
 
 FILE_SECBOOT (PERMITTED)
 
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 47 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 50 of file efi_autoexec.c.

◆ EFI_AUTOEXEC_NAME

#define EFI_AUTOEXEC_NAME   "autoexec.ipxe"

Autoexec script image name.

Definition at line 53 of file efi_autoexec.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ 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 76 of file efi_autoexec.c.

76  {
78  int rc;
79 
80  /* Check that we were loaded from a filesystem */
81  if ( handle != device ) {
82  DBGC ( device, "EFI %s is not the file system handle\n",
83  efi_handle_name ( device ) );
84  return -ENOTTY;
85  }
86 
87  /* Try loading from loaded image directory, if supported */
88  if ( ( rc = imgacquire ( "file:" EFI_AUTOEXEC_NAME,
89  EFI_AUTOEXEC_TIMEOUT, image ) ) == 0 )
90  return 0;
91 
92  /* Try loading from root directory, if supported */
93  if ( ( rc = imgacquire ( "file:/" EFI_AUTOEXEC_NAME,
94  EFI_AUTOEXEC_TIMEOUT, image ) ) == 0 )
95  return 0;
96 
97  return rc;
98 }
EFI_LOADED_IMAGE_PROTOCOL * efi_loaded_image
Loaded image protocol for this image.
Definition: efi_init.c:39
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:47
A hardware device.
Definition: device.h:77
#define EFI_AUTOEXEC_NAME
Autoexec script image name.
Definition: efi_autoexec.c:53
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:652
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:595
uint16_t handle
Handle.
Definition: smbios.h:17
int imgacquire(const char *name_uri, unsigned long timeout, struct image **image)
Acquire an image.
Definition: imgmgmt.c:143
Definition: efi.h:62
EFI_HANDLE DeviceHandle
The device handle that the EFI Image was loaded from.
Definition: LoadedImage.h:56

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 107 of file efi_autoexec.c.

107  {
109  struct net_device *netdev;
110  int rc;
111 
112  /* Create temporary network device */
113  if ( ( rc = mnptemp_create ( handle, &netdev ) ) != 0 ) {
114  DBGC ( device, "EFI %s could not create net device: %s\n",
115  efi_handle_name ( device ), strerror ( rc ) );
116  goto err_create;
117  }
118 
119  /* Do nothing unless we have a usable current working URI */
120  if ( ! cwuri ) {
121  DBGC ( device, "EFI %s has no current working URI\n",
122  efi_handle_name ( device ) );
123  rc = -ENOTTY;
124  goto err_cwuri;
125  }
126 
127  /* Open network device */
128  if ( ( rc = netdev_open ( netdev ) ) != 0 ) {
129  DBGC ( device, "EFI %s could not open net device: %s\n",
130  efi_handle_name ( device ), strerror ( rc ) );
131  goto err_open;
132  }
133 
134  /* Attempt download */
136  if ( rc != 0 ) {
137  DBGC ( device, "EFI %s could not download %s: %s\n",
139  strerror ( rc ) );
140  }
141 
142  /* Ensure network exchanges have completed */
144 
145  err_open:
146  err_cwuri:
148  err_create:
149  return rc;
150 }
EFI_LOADED_IMAGE_PROTOCOL * efi_loaded_image
Loaded image protocol for this image.
Definition: efi_init.c:39
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:47
A hardware device.
Definition: device.h:77
#define EFI_AUTOEXEC_NAME
Autoexec script image name.
Definition: efi_autoexec.c:53
void mnptemp_destroy(struct net_device *netdev)
Destroy temporary MNP network device.
Definition: mnpnet.c:541
int sync(unsigned long timeout)
Wait for pending operations to complete.
Definition: sync.c:74
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:652
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
A network device.
Definition: netdevice.h:353
int mnptemp_create(EFI_HANDLE handle, struct net_device **netdev)
Create temporary MNP network device.
Definition: mnpnet.c:504
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:595
#define EFI_AUTOEXEC_SYNC_TIMEOUT
Timeout for autoexec pending operation completion.
Definition: efi_autoexec.c:50
struct uri * cwuri
Current working URI.
Definition: cwuri.c:39
uint16_t handle
Handle.
Definition: smbios.h:17
int netdev_open(struct net_device *netdev)
Open network device.
Definition: netdevice.c:862
int imgacquire(const char *name_uri, unsigned long timeout, struct image **image)
Acquire an image.
Definition: imgmgmt.c:143
Definition: efi.h:62
EFI_HANDLE DeviceHandle
The device handle that the EFI Image was loaded from.
Definition: LoadedImage.h:56

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 169 of file efi_autoexec.c.

169  {
172  struct efi_autoexec_loader *loader;
173  struct image *image;
174  unsigned int i;
175  int rc;
176 
177  /* Use first applicable loader */
178  for ( i = 0 ; i < ( sizeof ( efi_autoexec_loaders ) /
179  sizeof ( efi_autoexec_loaders[0] ) ) ; i ++ ) {
180 
181  /* Locate required protocol for this loader */
182  loader = &efi_autoexec_loaders[i];
183  if ( ( rc = efi_locate_device ( device, loader->protocol,
184  &handle, 0 ) ) != 0 ) {
185  DBGC ( device, "EFI %s found no %s: %s\n",
187  efi_guid_ntoa ( loader->protocol ),
188  strerror ( rc ) );
189  continue;
190  }
191  DBGC ( device, "EFI %s found %s on ",
193  efi_guid_ntoa ( loader->protocol ) );
194  DBGC ( device, "%s\n", efi_handle_name ( handle ) );
195 
196  /* Try loading */
197  if ( ( rc = loader->load ( handle, &image ) ) != 0 )
198  return rc;
199 
200  /* Discard zero-length images */
201  if ( ! image->len ) {
202  DBGC ( device, "EFI %s discarding zero-length %s\n",
205  return -ENOENT;
206  }
207 
208  DBGC ( device, "EFI %s loaded %s (%zd bytes)\n",
210  return 0;
211  }
212 
213  return -ENOENT;
214 }
EFI_LOADED_IMAGE_PROTOCOL * efi_loaded_image
Loaded image protocol for this image.
Definition: efi_init.c:39
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:515
An executable image.
Definition: image.h:24
EFI_GUID * protocol
Required protocol GUID.
Definition: efi_autoexec.c:58
A hardware device.
Definition: device.h:77
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:652
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
size_t len
Length of raw file image.
Definition: image.h:56
static struct efi_autoexec_loader efi_autoexec_loaders[]
Autoexec script loaders.
Definition: efi_autoexec.c:153
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:46
const char * efi_guid_ntoa(CONST EFI_GUID *guid)
Convert GUID to a printable string.
Definition: efi_guid.c:726
void unregister_image(struct image *image)
Unregister executable image.
Definition: image.c:358
int(* load)(EFI_HANDLE handle, struct image **image)
Load autoexec script.
Definition: efi_autoexec.c:66
uint16_t handle
Handle.
Definition: smbios.h:17
char * name
Name.
Definition: image.h:38
An EFI autoexec script loader.
Definition: efi_autoexec.c:56
Definition: efi.h:62
EFI_HANDLE DeviceHandle
The device handle that the EFI Image was loaded from.
Definition: LoadedImage.h:56

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:285
static int efi_autoexec_filesystem(EFI_HANDLE handle, struct image **image)
Load autoexec script from filesystem.
Definition: efi_autoexec.c:76
EFI_GUID efi_simple_file_system_protocol_guid
Simple file system protocol GUID.
Definition: efi_guid.c:337
static int efi_autoexec_network(EFI_HANDLE handle, struct image **image)
Load autoexec script via temporary network device.
Definition: efi_autoexec.c:107

Autoexec script loaders.

Definition at line 153 of file efi_autoexec.c.

Referenced by efi_autoexec_load().