iPXE
Macros | Functions
efi_path.h File Reference

EFI device paths. More...

#include <ipxe/interface.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/Protocol/DevicePath.h>

Go to the source code of this file.

Macros

#define efi_describe_TYPE(object_type)   typeof ( EFI_DEVICE_PATH_PROTOCOL * ( object_type ) )
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static void efi_path_terminate (EFI_DEVICE_PATH_PROTOCOL *end)
 Terminate device path. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_path_next (EFI_DEVICE_PATH_PROTOCOL *path)
 Find next element in device path. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_path_prev (EFI_DEVICE_PATH_PROTOCOL *path, EFI_DEVICE_PATH_PROTOCOL *curr)
 Find previous element of device path. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_path_end (EFI_DEVICE_PATH_PROTOCOL *path)
 Find end of device path. More...
 
size_t efi_path_len (EFI_DEVICE_PATH_PROTOCOL *path)
 Find length of device path (excluding terminator) More...
 
int efi_path_check (EFI_DEVICE_PATH_PROTOCOL *path, size_t max)
 Check that device path is well-formed. More...
 
void * efi_path_mac (EFI_DEVICE_PATH_PROTOCOL *path)
 Get MAC address from device path. More...
 
unsigned int efi_path_vlan (EFI_DEVICE_PATH_PROTOCOL *path)
 Get VLAN tag from device path. More...
 
int efi_path_guid (EFI_DEVICE_PATH_PROTOCOL *path, union uuid *uuid)
 Get partition GUID from device path. More...
 
struct uriefi_path_uri (EFI_DEVICE_PATH_PROTOCOL *path)
 Parse URI from device path. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_paths (EFI_DEVICE_PATH_PROTOCOL *first,...)
 Concatenate EFI device paths. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_netdev_path (struct net_device *netdev)
 Construct EFI device path for network device. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_uri_path (struct uri *uri)
 Construct EFI device path for URI. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_iscsi_path (struct iscsi_session *iscsi)
 Construct EFI device path for iSCSI device. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_aoe_path (struct aoe_device *aoedev)
 Construct EFI device path for AoE device. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_fcp_path (struct fcp_description *desc)
 Construct EFI device path for Fibre Channel device. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_ib_srp_path (struct ib_srp_device *ib_srp)
 Construct EFI device path for Infiniband SRP device. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_usb_path (struct usb_function *func)
 Construct EFI device path for USB function. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_load_path (EFI_LOAD_OPTION *load, size_t len)
 Get EFI device path from load option. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_boot_path (unsigned int number)
 Get EFI device path for numbered boot option. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_current_boot_path (void)
 Get EFI device path for current boot option. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_describe (struct interface *interface)
 Describe object as an EFI device path. More...
 

Detailed Description

EFI device paths.

Definition in file efi_path.h.

Macro Definition Documentation

◆ efi_describe_TYPE

#define efi_describe_TYPE (   object_type)    typeof ( EFI_DEVICE_PATH_PROTOCOL * ( object_type ) )

Definition at line 68 of file efi_path.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ efi_path_terminate()

static void efi_path_terminate ( EFI_DEVICE_PATH_PROTOCOL end)
inlinestatic

Terminate device path.

Parameters
endEnd of device path to fill in

Definition at line 30 of file efi_path.h.

30  {
31 
32  end->Type = END_DEVICE_PATH_TYPE;
34  end->Length[0] = sizeof ( *end );
35  end->Length[1] = 0;
36 }
#define END_DEVICE_PATH_TYPE
Definition: DevicePath.h:1393
#define END_ENTIRE_DEVICE_PATH_SUBTYPE
Definition: DevicePath.h:1394
uint32_t end
Ending offset.
Definition: netvsc.h:18

References end, END_DEVICE_PATH_TYPE, and END_ENTIRE_DEVICE_PATH_SUBTYPE.

Referenced by efi_aoe_path(), efi_block_exec(), efi_fcp_path(), efi_ib_srp_path(), efi_image_path(), efi_iscsi_path(), efi_locate_device(), efi_netdev_path(), efi_paths(), efi_snp_hii_install(), efi_uri_path(), and efi_usb_path().

◆ efi_path_next()

Find next element in device path.

Parameters
pathDevice path, or NULL
nextNext element in device path, or NULL if at end

Definition at line 118 of file efi_path.c.

118  {
119 
120  /* Check for non-existent device path */
121  if ( ! path )
122  return NULL;
123 
124  /* Check for end of device path */
125  if ( path->Type == END_DEVICE_PATH_TYPE )
126  return NULL;
127 
128  /* Move to next component of the device path */
129  path = ( ( ( void * ) path ) +
130  /* There's this amazing new-fangled thing known as
131  * a UINT16, but who wants to use one of those? */
132  ( ( path->Length[1] << 8 ) | path->Length[0] ) );
133 
134  return path;
135 }
#define END_DEVICE_PATH_TYPE
Definition: DevicePath.h:1393
UINT8 Length[2]
Specific Device Path data.
Definition: DevicePath.h:58
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References END_DEVICE_PATH_TYPE, EFI_DEVICE_PATH_PROTOCOL::Length, NULL, and EFI_DEVICE_PATH_PROTOCOL::Type.

Referenced by efi_local_open_path(), efi_path_check(), efi_path_fetch(), efi_path_guid(), efi_path_mac(), efi_path_prev(), efi_path_uri(), and efi_path_vlan().

◆ efi_path_prev()

Find previous element of device path.

Parameters
pathDevice path, or NULL for no path
currCurrent element in device path, or NULL for end of path
Return values
prevPrevious element in device path, or NULL

Definition at line 144 of file efi_path.c.

145  {
147 
148  /* Find immediately preceding element */
149  while ( ( tmp = efi_path_next ( path ) ) != curr ) {
150  path = tmp;
151  }
152 
153  return path;
154 }
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
unsigned long tmp
Definition: linux_pci.h:64
EFI_DEVICE_PATH_PROTOCOL * efi_path_next(EFI_DEVICE_PATH_PROTOCOL *path)
Find next element in device path.
Definition: efi_path.c:118

References efi_path_next(), and tmp.

Referenced by efi_locate_device(), and efi_path_end().

◆ efi_path_end()

Find end of device path.

Parameters
pathDevice path, or NULL
Return values
path_endEnd of device path, or NULL

Definition at line 162 of file efi_path.c.

162  {
163 
164  return efi_path_prev ( path, NULL );
165 }
EFI_DEVICE_PATH_PROTOCOL * efi_path_prev(EFI_DEVICE_PATH_PROTOCOL *path, EFI_DEVICE_PATH_PROTOCOL *curr)
Find previous element of device path.
Definition: efi_path.c:144
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References efi_path_prev(), and NULL.

Referenced by efi_block_exec(), efi_path_len(), and usbio_open().

◆ efi_path_len()

size_t efi_path_len ( EFI_DEVICE_PATH_PROTOCOL path)

Find length of device path (excluding terminator)

Parameters
pathDevice path, or NULL
Return values
path_lenLength of device path

Definition at line 173 of file efi_path.c.

173  {
175 
176  return ( ( ( void * ) end ) - ( ( void * ) path ) );
177 }
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:58
EFI_DEVICE_PATH_PROTOCOL * efi_path_end(EFI_DEVICE_PATH_PROTOCOL *path)
Find end of device path.
Definition: efi_path.c:162

References efi_path_end(), and end.

Referenced by efi_block_match(), efi_devpath_text(), efi_ib_srp_path(), efi_image_path(), efi_init(), efi_iscsi_path(), efi_local_open_path(), efi_locate_device(), efi_netdev_path(), efi_paths(), efi_snp_hii_install(), efi_usb_path(), efidev_alloc(), and usbio_path().

◆ efi_path_check()

int efi_path_check ( EFI_DEVICE_PATH_PROTOCOL path,
size_t  max 
)

Check that device path is well-formed.

Parameters
pathDevice path, or NULL
maxMaximum device path length
Return values
rcReturn status code

Definition at line 186 of file efi_path.c.

186  {
188  size_t remaining = max;
189  size_t len;
190 
191  /* Check that path terminates within maximum length */
192  for ( ; ; path = next ) {
193  if ( remaining < sizeof ( *path ) )
194  return -EINVAL;
195  next = efi_path_next ( path );
196  if ( ! next )
197  break;
198  len = ( ( ( void * ) next ) - ( ( void * ) path ) );
199  if ( remaining < len )
200  return -EINVAL;
201  }
202 
203  return 0;
204 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
#define max(x, y)
Definition: ath.h:40
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
ring len
Length.
Definition: dwmac.h:231
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
EFI_DEVICE_PATH_PROTOCOL * efi_path_next(EFI_DEVICE_PATH_PROTOCOL *path)
Find next element in device path.
Definition: efi_path.c:118

References efi_path_next(), EINVAL, len, max, and next.

Referenced by efi_load_path().

◆ efi_path_mac()

void* efi_path_mac ( EFI_DEVICE_PATH_PROTOCOL path)

Get MAC address from device path.

Parameters
pathDevice path
Return values
macMAC address, or NULL if not found

Definition at line 212 of file efi_path.c.

212  {
215 
216  /* Search for MAC address path */
217  for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
218  if ( ( path->Type == MESSAGING_DEVICE_PATH ) &&
219  ( path->SubType == MSG_MAC_ADDR_DP ) ) {
221  Header );
222  return &mac->MacAddress;
223  }
224  }
225 
226  /* No MAC address found */
227  return NULL;
228 }
#define MSG_MAC_ADDR_DP
MAC Address Device Path SubType.
Definition: DevicePath.h:552
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:24
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
EFI_DEVICE_PATH_PROTOCOL * efi_path_next(EFI_DEVICE_PATH_PROTOCOL *path)
Find next element in device path.
Definition: efi_path.c:118
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition: DevicePath.h:53
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
PACKED union @541::@555 Header
Definition: Acpi10.h:155

References container_of, efi_path_next(), Header, mac, MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, next, NULL, EFI_DEVICE_PATH_PROTOCOL::SubType, and EFI_DEVICE_PATH_PROTOCOL::Type.

Referenced by efi_path_net_probe().

◆ efi_path_vlan()

unsigned int efi_path_vlan ( EFI_DEVICE_PATH_PROTOCOL path)

Get VLAN tag from device path.

Parameters
pathDevice path
Return values
tagVLAN tag, or 0 if not a VLAN

Definition at line 236 of file efi_path.c.

236  {
238  VLAN_DEVICE_PATH *vlan;
239 
240  /* Search for VLAN device path */
241  for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
242  if ( ( path->Type == MESSAGING_DEVICE_PATH ) &&
243  ( path->SubType == MSG_VLAN_DP ) ) {
244  vlan = container_of ( path, VLAN_DEVICE_PATH, Header );
245  return vlan->VlanId;
246  }
247  }
248 
249  /* No VLAN device path found */
250  return 0;
251 }
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
UINT16 VlanId
VLAN identifier (0-4094).
Definition: DevicePath.h:972
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
EFI_DEVICE_PATH_PROTOCOL * efi_path_next(EFI_DEVICE_PATH_PROTOCOL *path)
Find next element in device path.
Definition: efi_path.c:118
#define MSG_VLAN_DP
VLAN Device Path SubType.
Definition: DevicePath.h:966
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition: DevicePath.h:53
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
PACKED union @541::@555 Header
Definition: Acpi10.h:155

References container_of, efi_path_next(), Header, MESSAGING_DEVICE_PATH, MSG_VLAN_DP, next, EFI_DEVICE_PATH_PROTOCOL::SubType, EFI_DEVICE_PATH_PROTOCOL::Type, and VLAN_DEVICE_PATH::VlanId.

Referenced by efi_cachedhcp_record(), efi_path_net_probe(), and efi_set_autoboot_ll_addr().

◆ efi_path_guid()

int efi_path_guid ( EFI_DEVICE_PATH_PROTOCOL path,
union uuid guid 
)

Get partition GUID from device path.

Parameters
pathDevice path
guidPartition GUID to fill in
Return values
rcReturn status code

Definition at line 260 of file efi_path.c.

260  {
263  int rc;
264 
265  /* Search for most specific partition device path */
266  rc = -ENOENT;
267  for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
268 
269  /* Skip non-harddrive device paths */
270  if ( path->Type != MEDIA_DEVICE_PATH )
271  continue;
272  if ( path->SubType != MEDIA_HARDDRIVE_DP )
273  continue;
274 
275  /* Skip non-GUID signatures */
276  hd = container_of ( path, HARDDRIVE_DEVICE_PATH, Header );
277  if ( hd->SignatureType != SIGNATURE_TYPE_GUID )
278  continue;
279 
280  /* Extract GUID */
281  memcpy ( guid, hd->Signature, sizeof ( *guid ) );
282  uuid_mangle ( guid );
283 
284  /* Record success, but continue searching in case
285  * there exists a more specific GUID (e.g. a partition
286  * GUID rather than a disk GUID).
287  */
288  rc = 0;
289  }
290 
291  return rc;
292 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
UINT8 SignatureType
Type of Disk Signature: (Unused values reserved).
Definition: DevicePath.h:1058
#define ENOENT
No such file or directory.
Definition: errno.h:514
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
static void uuid_mangle(union uuid *uuid)
Change UUID endianness.
Definition: uuid.h:43
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
#define MEDIA_HARDDRIVE_DP
Hard Drive Media Device Path SubType.
Definition: DevicePath.h:1016
#define MEDIA_DEVICE_PATH
Definition: DevicePath.h:1011
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
EFI_DEVICE_PATH_PROTOCOL * efi_path_next(EFI_DEVICE_PATH_PROTOCOL *path)
Find next element in device path.
Definition: efi_path.c:118
uint64_t guid
GUID.
Definition: edd.h:30
UINT8 Signature[16]
Signature unique to this partition: If SignatureType is 0, this field has to be initialized with 16 z...
Definition: DevicePath.h:1045
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition: DevicePath.h:53
The Hard Drive Media Device Path is used to represent a partition on a hard drive.
Definition: DevicePath.h:1021
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
#define SIGNATURE_TYPE_GUID
Definition: DevicePath.h:1066
PACKED union @541::@555 Header
Definition: Acpi10.h:155

References container_of, efi_path_next(), ENOENT, guid, Header, MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, memcpy(), next, rc, HARDDRIVE_DEVICE_PATH::Signature, SIGNATURE_TYPE_GUID, HARDDRIVE_DEVICE_PATH::SignatureType, EFI_DEVICE_PATH_PROTOCOL::SubType, EFI_DEVICE_PATH_PROTOCOL::Type, and uuid_mangle().

Referenced by efi_block_match().

◆ efi_path_uri()

struct uri* efi_path_uri ( EFI_DEVICE_PATH_PROTOCOL path)

Parse URI from device path.

Parameters
pathDevice path
Return values
uriURI, or NULL if not a URI

Definition at line 300 of file efi_path.c.

300  {
302  URI_DEVICE_PATH *uripath;
303  char *uristring;
304  struct uri *uri;
305  size_t len;
306 
307  /* Search for URI device path */
308  for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
309  if ( ( path->Type == MESSAGING_DEVICE_PATH ) &&
310  ( path->SubType == MSG_URI_DP ) ) {
311 
312  /* Calculate path length */
313  uripath = container_of ( path, URI_DEVICE_PATH,
314  Header );
315  len = ( ( ( path->Length[1] << 8 ) | path->Length[0] )
316  - offsetof ( typeof ( *uripath ), Uri ) );
317 
318  /* Parse URI */
319  uristring = zalloc ( len + 1 /* NUL */ );
320  if ( ! uristring )
321  return NULL;
322  memcpy ( uristring, uripath->Uri, len );
323  uri = parse_uri ( uristring );
324  free ( uristring );
325 
326  return uri;
327  }
328  }
329 
330  /* No URI path found */
331  return NULL;
332 }
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
#define offsetof(type, field)
Get offset of a field within a structure.
Definition: stddef.h:24
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
#define MSG_URI_DP
Uniform Resource Identifiers (URI) Device Path SubType.
Definition: DevicePath.h:881
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
ring len
Length.
Definition: dwmac.h:231
const char * path
Path (after URI decoding)
Definition: uri.h:80
CHAR8 Uri[]
Instance of the URI pursuant to RFC 3986.
Definition: DevicePath.h:887
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
EFI_DEVICE_PATH_PROTOCOL * efi_path_next(EFI_DEVICE_PATH_PROTOCOL *path)
Find next element in device path.
Definition: efi_path.c:118
A Uniform Resource Identifier.
Definition: uri.h:64
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition: acpi.c:47
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct uri * parse_uri(const char *uri_string)
Parse URI.
Definition: uri.c:296
PACKED union @541::@555 Header
Definition: Acpi10.h:155

References container_of, efi_path_next(), free, Header, len, memcpy(), MESSAGING_DEVICE_PATH, MSG_URI_DP, next, NULL, offsetof, parse_uri(), uri::path, typeof(), URI_DEVICE_PATH::Uri, and zalloc().

Referenced by efi_init_application().

◆ efi_paths()

EFI_DEVICE_PATH_PROTOCOL* efi_paths ( EFI_DEVICE_PATH_PROTOCOL first,
  ... 
)

Concatenate EFI device paths.

Parameters
...List of device paths (NULL terminated)
Return values
pathConcatenated device path, or NULL on error

The caller is responsible for eventually calling free() on the allocated device path.

Definition at line 343 of file efi_path.c.

343  {
348  va_list args;
349  size_t len;
350 
351  /* Calculate device path length */
352  va_start ( args, first );
353  len = 0;
354  src = first;
355  while ( src ) {
356  len += efi_path_len ( src );
357  src = va_arg ( args, EFI_DEVICE_PATH_PROTOCOL * );
358  }
359  va_end ( args );
360 
361  /* Allocate device path */
362  path = zalloc ( len + sizeof ( *end ) );
363  if ( ! path )
364  return NULL;
365 
366  /* Populate device path */
367  va_start ( args, first );
368  dst = path;
369  src = first;
370  while ( src ) {
371  len = efi_path_len ( src );
372  memcpy ( dst, src, len );
373  dst = ( ( ( void * ) dst ) + len );
374  src = va_arg ( args, EFI_DEVICE_PATH_PROTOCOL * );
375  }
376  va_end ( args );
377  end = dst;
379 
380  return path;
381 }
#define va_end(ap)
Definition: stdarg.h:9
uint32_t first
First block in range.
Definition: pccrr.h:14
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_path.c:173
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition: efi_path.h:30
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define va_arg(ap, type)
Definition: stdarg.h:8
static const void * src
Definition: string.h:47
ring len
Length.
Definition: dwmac.h:231
const char * path
Path (after URI decoding)
Definition: uri.h:80
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:58
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
__builtin_va_list va_list
Definition: stdarg.h:6
#define va_start(ap, last)
Definition: stdarg.h:7
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References efi_path_len(), efi_path_terminate(), end, first, len, memcpy(), NULL, uri::path, src, va_arg, va_end, va_start, and zalloc().

Referenced by efi_aoe_path().

◆ efi_netdev_path()

EFI_DEVICE_PATH_PROTOCOL* efi_netdev_path ( struct net_device netdev)

Construct EFI device path for network device.

Parameters
netdevNetwork device
Return values
pathEFI device path, or NULL on error

The caller is responsible for eventually calling free() on the allocated device path.

Definition at line 410 of file efi_path.c.

410  {
411  EFI_DEVICE_PATH_PROTOCOL *parent;
413  MAC_ADDR_DEVICE_PATH *macpath;
414  VLAN_DEVICE_PATH *vlanpath;
416  unsigned int tag;
417  size_t prefix_len;
418  size_t len;
419 
420  /* Get parent EFI device path */
421  parent = efi_parent_path ( netdev->dev );
422 
423  /* Calculate device path length */
424  prefix_len = efi_path_len ( parent );
425  len = ( prefix_len + sizeof ( *macpath ) + sizeof ( *vlanpath ) +
426  sizeof ( *end ) );
427 
428  /* Allocate device path */
429  path = zalloc ( len );
430  if ( ! path )
431  return NULL;
432 
433  /* Construct device path */
434  memcpy ( path, parent, prefix_len );
435  macpath = ( ( ( void * ) path ) + prefix_len );
436  macpath->Header.Type = MESSAGING_DEVICE_PATH;
437  macpath->Header.SubType = MSG_MAC_ADDR_DP;
438  macpath->Header.Length[0] = sizeof ( *macpath );
440  sizeof ( macpath->MacAddress ) );
441  memcpy ( &macpath->MacAddress, netdev->ll_addr,
443  macpath->IfType = ntohs ( netdev->ll_protocol->ll_proto );
444  if ( ( tag = vlan_tag ( netdev ) ) ) {
445  vlanpath = ( ( ( void * ) macpath ) + sizeof ( *macpath ) );
446  vlanpath->Header.Type = MESSAGING_DEVICE_PATH;
447  vlanpath->Header.SubType = MSG_VLAN_DP;
448  vlanpath->Header.Length[0] = sizeof ( *vlanpath );
449  vlanpath->VlanId = tag;
450  end = ( ( ( void * ) vlanpath ) + sizeof ( *vlanpath ) );
451  } else {
452  end = ( ( ( void * ) macpath ) + sizeof ( *macpath ) );
453  }
455 
456  return path;
457 }
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:198
static EFI_DEVICE_PATH_PROTOCOL * efi_parent_path(struct device *dev)
Construct EFI parent device path.
Definition: efi_path.c:389
UINT8 IfType
Network interface type(i.e.
Definition: DevicePath.h:562
EFI_MAC_ADDRESS MacAddress
The MAC address for a network interface padded with 0s.
Definition: DevicePath.h:558
#define MSG_MAC_ADDR_DP
MAC Address Device Path SubType.
Definition: DevicePath.h:552
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_path.c:173
#define ntohs(value)
Definition: byteswap.h:136
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:554
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition: efi_path.h:30
void * memcpy(void *dest, const void *src, size_t len) __nonnull
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
ring len
Length.
Definition: dwmac.h:231
const char * path
Path (after URI decoding)
Definition: uri.h:80
static struct net_device * netdev
Definition: gdbudp.c:52
UINT16 VlanId
VLAN identifier (0-4094).
Definition: DevicePath.h:972
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:58
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
uint16_t ll_proto
Link-layer protocol.
Definition: netdevice.h:194
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
#define MSG_VLAN_DP
VLAN Device Path SubType.
Definition: DevicePath.h:966
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:968
UINT8 Length[2]
Specific Device Path data.
Definition: DevicePath.h:58
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition: DevicePath.h:53
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387
static unsigned int vlan_tag(struct net_device *netdev)
Get the VLAN tag.
Definition: vlan.h:73
uint64_t tag
Identity tag.
Definition: edd.h:30
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:372

References assert(), net_device::dev, efi_parent_path(), efi_path_len(), efi_path_terminate(), end, MAC_ADDR_DEVICE_PATH::Header, VLAN_DEVICE_PATH::Header, MAC_ADDR_DEVICE_PATH::IfType, len, EFI_DEVICE_PATH_PROTOCOL::Length, net_device::ll_addr, ll_protocol::ll_addr_len, ll_protocol::ll_proto, net_device::ll_protocol, MAC_ADDR_DEVICE_PATH::MacAddress, memcpy(), MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, MSG_VLAN_DP, netdev, ntohs, NULL, efi_device::path, EFI_DEVICE_PATH_PROTOCOL::SubType, tag, EFI_DEVICE_PATH_PROTOCOL::Type, vlan_tag(), VLAN_DEVICE_PATH::VlanId, and zalloc().

Referenced by efi_aoe_path(), efi_iscsi_path(), and efi_snp_probe().

◆ efi_uri_path()

EFI_DEVICE_PATH_PROTOCOL* efi_uri_path ( struct uri uri)

Construct EFI device path for URI.

Parameters
uriURI
Return values
pathEFI device path, or NULL on error

The caller is responsible for eventually calling free() on the allocated device path.

Definition at line 468 of file efi_path.c.

468  {
471  URI_DEVICE_PATH *uripath;
472  size_t uri_len;
473  size_t uripath_len;
474  size_t len;
475 
476  /* Calculate device path length */
477  uri_len = ( format_uri ( uri, NULL, 0 ) + 1 /* NUL */ );
478  uripath_len = ( sizeof ( *uripath ) + uri_len );
479  len = ( uripath_len + sizeof ( *end ) );
480 
481  /* Allocate device path */
482  path = zalloc ( len );
483  if ( ! path )
484  return NULL;
485 
486  /* Construct device path */
487  uripath = ( ( void * ) path );
488  uripath->Header.Type = MESSAGING_DEVICE_PATH;
489  uripath->Header.SubType = MSG_URI_DP;
490  uripath->Header.Length[0] = ( uripath_len & 0xff );
491  uripath->Header.Length[1] = ( uripath_len >> 8 );
492  format_uri ( uri, uripath->Uri, uri_len );
493  end = ( ( ( void * ) path ) + uripath_len );
495 
496  return path;
497 }
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition: efi_path.h:30
#define MSG_URI_DP
Uniform Resource Identifiers (URI) Device Path SubType.
Definition: DevicePath.h:881
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:883
ring len
Length.
Definition: dwmac.h:231
const char * path
Path (after URI decoding)
Definition: uri.h:80
size_t format_uri(const struct uri *uri, char *buf, size_t len)
Format URI.
Definition: uri.c:471
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:58
CHAR8 Uri[]
Instance of the URI pursuant to RFC 3986.
Definition: DevicePath.h:887
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
UINT8 Length[2]
Specific Device Path data.
Definition: DevicePath.h:58
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition: DevicePath.h:53
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
A Uniform Resource Identifier.
Definition: uri.h:64
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References efi_path_terminate(), end, format_uri(), URI_DEVICE_PATH::Header, len, EFI_DEVICE_PATH_PROTOCOL::Length, MESSAGING_DEVICE_PATH, MSG_URI_DP, NULL, efi_device::path, EFI_DEVICE_PATH_PROTOCOL::SubType, EFI_DEVICE_PATH_PROTOCOL::Type, URI_DEVICE_PATH::Uri, and zalloc().

Referenced by http_efi_describe().

◆ efi_iscsi_path()

EFI_DEVICE_PATH_PROTOCOL* efi_iscsi_path ( struct iscsi_session iscsi)

Construct EFI device path for iSCSI device.

Parameters
iscsiiSCSI session
Return values
pathEFI device path, or NULL on error

Definition at line 505 of file efi_path.c.

505  {
506  struct sockaddr_tcpip *st_target;
507  struct net_device *netdev;
508  EFI_DEVICE_PATH_PROTOCOL *netpath;
511  ISCSI_DEVICE_PATH *iscsipath;
512  char *name;
513  size_t prefix_len;
514  size_t name_len;
515  size_t iscsi_len;
516  size_t len;
517 
518  /* Get network device associated with target address */
519  st_target = ( ( struct sockaddr_tcpip * ) &iscsi->target_sockaddr );
520  netdev = tcpip_netdev ( st_target );
521  if ( ! netdev )
522  goto err_netdev;
523 
524  /* Get network device path */
525  netpath = efi_netdev_path ( netdev );
526  if ( ! netpath )
527  goto err_netpath;
528 
529  /* Calculate device path length */
530  prefix_len = efi_path_len ( netpath );
531  name_len = ( strlen ( iscsi->target_iqn ) + 1 /* NUL */ );
532  iscsi_len = ( sizeof ( *iscsipath ) + name_len );
533  len = ( prefix_len + iscsi_len + sizeof ( *end ) );
534 
535  /* Allocate device path */
536  path = zalloc ( len );
537  if ( ! path )
538  goto err_alloc;
539 
540  /* Construct device path */
541  memcpy ( path, netpath, prefix_len );
542  iscsipath = ( ( ( void * ) path ) + prefix_len );
543  iscsipath->Header.Type = MESSAGING_DEVICE_PATH;
544  iscsipath->Header.SubType = MSG_ISCSI_DP;
545  iscsipath->Header.Length[0] = iscsi_len;
547  memcpy ( &iscsipath->Lun, &iscsi->lun, sizeof ( iscsipath->Lun ) );
548  name = ( ( ( void * ) iscsipath ) + sizeof ( *iscsipath ) );
549  memcpy ( name, iscsi->target_iqn, name_len );
550  end = ( ( ( void * ) name ) + name_len );
552 
553  /* Free temporary paths */
554  free ( netpath );
555 
556  return path;
557 
558  err_alloc:
559  free ( netpath );
560  err_netpath:
561  err_netdev:
562  return NULL;
563 }
TCP/IP socket address.
Definition: tcpip.h:75
const char * name
Definition: ath9k_hw.c:1984
struct net_device * tcpip_netdev(struct sockaddr_tcpip *st_dest)
Determine transmitting network device.
Definition: tcpip.c:114
#define ISCSI_LOGIN_OPTION_AUTHMETHOD_NON
Definition: DevicePath.h:959
struct sockaddr target_sockaddr
Target socket address (for boot firmware table)
Definition: iscsi.h:661
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_path.c:173
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
UINT16 LoginOption
iSCSI Login Options.
Definition: DevicePath.h:937
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition: efi_path.h:30
void * memcpy(void *dest, const void *src, size_t len) __nonnull
ring len
Length.
Definition: dwmac.h:231
static struct net_device * netdev
Definition: gdbudp.c:52
UINT64 Lun
iSCSI Logical Unit Number.
Definition: DevicePath.h:941
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:58
EFI_DEVICE_PATH_PROTOCOL * efi_netdev_path(struct net_device *netdev)
Construct EFI device path for network device.
Definition: efi_path.c:410
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
struct scsi_lun lun
SCSI LUN (for boot firmware table)
Definition: iscsi.h:663
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
A network device.
Definition: netdevice.h:352
#define MSG_ISCSI_DP
iSCSI Device Path SubType
Definition: DevicePath.h:927
size_t strlen(const char *src)
Get length of string.
Definition: string.c:243
char * target_iqn
Target IQN.
Definition: iscsi.h:562
UINT8 Length[2]
Specific Device Path data.
Definition: DevicePath.h:58
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition: DevicePath.h:53
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:929

References efi_netdev_path(), efi_path_len(), efi_path_terminate(), end, free, ISCSI_DEVICE_PATH::Header, ISCSI_LOGIN_OPTION_AUTHMETHOD_NON, len, EFI_DEVICE_PATH_PROTOCOL::Length, ISCSI_DEVICE_PATH::LoginOption, iscsi_session::lun, ISCSI_DEVICE_PATH::Lun, memcpy(), MESSAGING_DEVICE_PATH, MSG_ISCSI_DP, name, netdev, NULL, strlen(), EFI_DEVICE_PATH_PROTOCOL::SubType, iscsi_session::target_iqn, iscsi_session::target_sockaddr, tcpip_netdev(), EFI_DEVICE_PATH_PROTOCOL::Type, and zalloc().

◆ efi_aoe_path()

EFI_DEVICE_PATH_PROTOCOL* efi_aoe_path ( struct aoe_device aoedev)

Construct EFI device path for AoE device.

Parameters
aoedevAoE device
Return values
pathEFI device path, or NULL on error

Definition at line 571 of file efi_path.c.

571  {
572  struct {
573  SATA_DEVICE_PATH sata;
575  } satapath;
576  EFI_DEVICE_PATH_PROTOCOL *netpath;
578 
579  /* Get network device path */
580  netpath = efi_netdev_path ( aoedev->netdev );
581  if ( ! netpath )
582  goto err_netdev;
583 
584  /* Construct SATA path */
585  memset ( &satapath, 0, sizeof ( satapath ) );
586  satapath.sata.Header.Type = MESSAGING_DEVICE_PATH;
587  satapath.sata.Header.SubType = MSG_SATA_DP;
588  satapath.sata.Header.Length[0] = sizeof ( satapath.sata );
589  satapath.sata.HBAPortNumber = aoedev->major;
590  satapath.sata.PortMultiplierPortNumber = aoedev->minor;
591  efi_path_terminate ( &satapath.end );
592 
593  /* Construct overall device path */
594  path = efi_paths ( netpath, &satapath, NULL );
595  if ( ! path )
596  goto err_paths;
597 
598  /* Free temporary paths */
599  free ( netpath );
600 
601  return path;
602 
603  err_paths:
604  free ( netpath );
605  err_netdev:
606  return NULL;
607 }
uint16_t major
Major number.
Definition: aoe.h:125
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition: efi_path.h:30
EFI_DEVICE_PATH_PROTOCOL * efi_paths(EFI_DEVICE_PATH_PROTOCOL *first,...)
Concatenate EFI device paths.
Definition: efi_path.c:343
#define MSG_SATA_DP
SATA Device Path SubType.
Definition: DevicePath.h:512
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:58
EFI_DEVICE_PATH_PROTOCOL * efi_netdev_path(struct net_device *netdev)
Construct EFI device path for network device.
Definition: efi_path.c:410
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
uint8_t minor
Minor number.
Definition: aoe.h:127
struct net_device * netdev
Network device.
Definition: aoe.h:120
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
void * memset(void *dest, int character, size_t len) __nonnull

References efi_netdev_path(), efi_path_terminate(), efi_paths(), end, free, aoe_device::major, memset(), MESSAGING_DEVICE_PATH, aoe_device::minor, MSG_SATA_DP, aoe_device::netdev, and NULL.

◆ efi_fcp_path()

EFI_DEVICE_PATH_PROTOCOL* efi_fcp_path ( struct fcp_description desc)

Construct EFI device path for Fibre Channel device.

Parameters
descFCP device description
Return values
pathEFI device path, or NULL on error

Definition at line 615 of file efi_path.c.

615  {
616  struct {
619  } __attribute__ (( packed )) *path;
620 
621  /* Allocate device path */
622  path = zalloc ( sizeof ( *path ) );
623  if ( ! path )
624  return NULL;
625 
626  /* Construct device path */
627  path->fc.Header.Type = MESSAGING_DEVICE_PATH;
628  path->fc.Header.SubType = MSG_FIBRECHANNELEX_DP;
629  path->fc.Header.Length[0] = sizeof ( path->fc );
630  memcpy ( path->fc.WWN, &desc->wwn, sizeof ( path->fc.WWN ) );
631  memcpy ( path->fc.Lun, &desc->lun, sizeof ( path->fc.Lun ) );
632  efi_path_terminate ( &path->end );
633 
634  return &path->fc.Header;
635 }
#define MSG_FIBRECHANNELEX_DP
Fibre Channel Ex SubType.
Definition: DevicePath.h:384
#define __attribute__(x)
Definition: compiler.h:10
u16 fc
802.11 Frame Control field
Definition: ieee80211.h:14
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition: efi_path.h:30
struct ena_llq_option desc
Descriptor counts.
Definition: ena.h:20
void * memcpy(void *dest, const void *src, size_t len) __nonnull
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:58
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References __attribute__, desc, efi_path_terminate(), end, fc, memcpy(), MESSAGING_DEVICE_PATH, MSG_FIBRECHANNELEX_DP, NULL, and zalloc().

Referenced by fcpdev_efi_describe().

◆ efi_ib_srp_path()

EFI_DEVICE_PATH_PROTOCOL* efi_ib_srp_path ( struct ib_srp_device ib_srp)

Construct EFI device path for Infiniband SRP device.

Parameters
ib_srpInfiniband SRP device
Return values
pathEFI device path, or NULL on error

Definition at line 643 of file efi_path.c.

643  {
644  const struct ipxe_ib_sbft *sbft = &ib_srp->sbft;
645  union ib_srp_target_port_id *id =
647  srp );
648  EFI_DEVICE_PATH_PROTOCOL *parent;
650  INFINIBAND_DEVICE_PATH *ibpath;
652  size_t prefix_len;
653  size_t len;
654 
655  /* Get parent EFI device path */
656  parent = efi_parent_path ( ib_srp->ibdev->dev );
657 
658  /* Calculate device path length */
659  prefix_len = efi_path_len ( parent );
660  len = ( prefix_len + sizeof ( *ibpath ) + sizeof ( *end ) );
661 
662  /* Allocate device path */
663  path = zalloc ( len );
664  if ( ! path )
665  return NULL;
666 
667  /* Construct device path */
668  memcpy ( path, parent, prefix_len );
669  ibpath = ( ( ( void * ) path ) + prefix_len );
671  ibpath->Header.SubType = MSG_INFINIBAND_DP;
672  ibpath->Header.Length[0] = sizeof ( *ibpath );
674  memcpy ( ibpath->PortGid, &sbft->ib.dgid, sizeof ( ibpath->PortGid ) );
675  memcpy ( &ibpath->ServiceId, &sbft->ib.service_id,
676  sizeof ( ibpath->ServiceId ) );
677  memcpy ( &ibpath->TargetPortId, &id->ib.ioc_guid,
678  sizeof ( ibpath->TargetPortId ) );
679  memcpy ( &ibpath->DeviceId, &id->ib.id_ext,
680  sizeof ( ibpath->DeviceId ) );
681  end = ( ( ( void * ) ibpath ) + sizeof ( *ibpath ) );
683 
684  return path;
685 }
union srp_port_id srp
SRP version of port identifier.
Definition: ib_srp.h:34
struct ipxe_ib_sbft sbft
Boot firmware table parameters.
Definition: ib_srp.h:90
static EFI_DEVICE_PATH_PROTOCOL * efi_parent_path(struct device *dev)
Construct EFI parent device path.
Definition: efi_path.c:389
#define INFINIBAND_RESOURCE_FLAG_STORAGE_PROTOCOL
Definition: DevicePath.h:688
SRP target port identifier for Infiniband.
Definition: ib_srp.h:32
struct device * dev
Underlying device.
Definition: infiniband.h:410
union srp_port_id target
Target port identifier.
Definition: srp.h:819
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_path.c:173
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:655
union ib_gid dgid
Destination GID.
Definition: ib_srp.h:51
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
UINT32 ResourceFlags
Flags to help identify/manage InfiniBand device path elements: Bit 0 - IOC/Service (0b = IOC,...
Definition: DevicePath.h:665
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition: efi_path.h:30
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
ring len
Length.
Definition: dwmac.h:231
struct sbft_srp_subtable srp
The SRP subtable.
Definition: ib_srp.h:69
An Infiniband SRP sBFT created by iPXE.
Definition: ib_srp.h:63
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:58
union ib_guid service_id
Service ID.
Definition: ib_srp.h:53
uint8_t id
Request identifier.
Definition: ena.h:12
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
UINT64 DeviceId
64-bit persistent ID of remote device.
Definition: DevicePath.h:682
#define MSG_INFINIBAND_DP
InfiniBand Device Path SubType.
Definition: DevicePath.h:653
UINT64 TargetPortId
64-bit persistent ID of remote IOC port.
Definition: DevicePath.h:678
UINT64 ServiceId
64-bit unique identifier to remote IOC or server process.
Definition: DevicePath.h:674
UINT8 Length[2]
Specific Device Path data.
Definition: DevicePath.h:58
UINT8 PortGid[16]
128-bit Global Identifier for remote fabric port.
Definition: DevicePath.h:669
struct ib_device * ibdev
Infiniband device.
Definition: ib_srp.h:85
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition: DevicePath.h:53
struct sbft_ib_subtable ib
The Infiniband subtable.
Definition: ib_srp.h:71
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References container_of, ib_device::dev, INFINIBAND_DEVICE_PATH::DeviceId, sbft_ib_subtable::dgid, efi_parent_path(), efi_path_len(), efi_path_terminate(), end, INFINIBAND_DEVICE_PATH::Header, ipxe_ib_sbft::ib, ib_srp_device::ibdev, id, INFINIBAND_RESOURCE_FLAG_STORAGE_PROTOCOL, len, EFI_DEVICE_PATH_PROTOCOL::Length, memcpy(), MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, NULL, INFINIBAND_DEVICE_PATH::PortGid, INFINIBAND_DEVICE_PATH::ResourceFlags, ib_srp_device::sbft, sbft_ib_subtable::service_id, INFINIBAND_DEVICE_PATH::ServiceId, ib_srp_target_port_id::srp, ipxe_ib_sbft::srp, EFI_DEVICE_PATH_PROTOCOL::SubType, sbft_srp_subtable::target, INFINIBAND_DEVICE_PATH::TargetPortId, EFI_DEVICE_PATH_PROTOCOL::Type, and zalloc().

◆ efi_usb_path()

EFI_DEVICE_PATH_PROTOCOL* efi_usb_path ( struct usb_function func)

Construct EFI device path for USB function.

Parameters
funcUSB function
Return values
pathEFI device path, or NULL on error

The caller is responsible for eventually calling free() on the allocated device path.

Definition at line 696 of file efi_path.c.

696  {
697  struct usb_device *usb = func->usb;
698  EFI_DEVICE_PATH_PROTOCOL *parent;
701  USB_DEVICE_PATH *usbpath;
702  unsigned int count;
703  size_t prefix_len;
704  size_t len;
705 
706  /* Sanity check */
707  assert ( func->desc.count >= 1 );
708 
709  /* Get parent EFI device path */
710  parent = efi_parent_path ( &func->dev );
711 
712  /* Calculate device path length */
713  count = ( usb_depth ( usb ) + 1 );
714  prefix_len = efi_path_len ( parent );
715  len = ( prefix_len + ( count * sizeof ( *usbpath ) ) +
716  sizeof ( *end ) );
717 
718  /* Allocate device path */
719  path = zalloc ( len );
720  if ( ! path )
721  return NULL;
722 
723  /* Construct device path */
724  memcpy ( path, parent, prefix_len );
725  end = ( ( ( void * ) path ) + len - sizeof ( *end ) );
727  usbpath = ( ( ( void * ) end ) - sizeof ( *usbpath ) );
728  usbpath->InterfaceNumber = func->interface[0];
729  for ( ; usb ; usbpath--, usb = usb->port->hub->usb ) {
730  usbpath->Header.Type = MESSAGING_DEVICE_PATH;
731  usbpath->Header.SubType = MSG_USB_DP;
732  usbpath->Header.Length[0] = sizeof ( *usbpath );
733  usbpath->ParentPortNumber = ( usb->port->address - 1 );
734  }
735 
736  return path;
737 }
uint8_t interface[0]
List of interface numbers.
Definition: usb.h:696
static EFI_DEVICE_PATH_PROTOCOL * efi_parent_path(struct device *dev)
Construct EFI parent device path.
Definition: efi_path.c:389
unsigned int count
Number of interfaces.
Definition: usb.h:664
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_path.c:173
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:323
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition: efi_path.h:30
struct usb_device * usb
Underlying USB device, if any.
Definition: usb.h:846
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct usb_port * port
USB port.
Definition: usb.h:726
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
ring len
Length.
Definition: dwmac.h:231
UINT8 ParentPortNumber
USB Parent Port Number.
Definition: DevicePath.h:426
static unsigned int count
Number of entries.
Definition: dwmac.h:225
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:58
A USB device.
Definition: usb.h:722
static unsigned int usb_depth(struct usb_device *usb)
Get USB depth.
Definition: usb.h:1268
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:422
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
UINT8 InterfaceNumber
USB Interface Number.
Definition: DevicePath.h:430
struct usb_device * usb
USB device.
Definition: usb.h:677
UINT8 Length[2]
Specific Device Path data.
Definition: DevicePath.h:58
struct usb_hub * hub
USB hub.
Definition: usb.h:814
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition: DevicePath.h:53
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:46
struct usb_function_descriptor desc
Function descriptor.
Definition: usb.h:679
struct device dev
Generic device.
Definition: usb.h:681
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define MSG_USB_DP
USB Device Path SubType.
Definition: DevicePath.h:420

References assert(), count, usb_function_descriptor::count, usb_function::desc, usb_function::dev, efi_parent_path(), efi_path_len(), efi_path_terminate(), end, USB_DEVICE_PATH::Header, usb_port::hub, usb_function::interface, USB_DEVICE_PATH::InterfaceNumber, len, EFI_DEVICE_PATH_PROTOCOL::Length, memcpy(), MESSAGING_DEVICE_PATH, MSG_USB_DP, NULL, USB_DEVICE_PATH::ParentPortNumber, usb_device::port, EFI_DEVICE_PATH_PROTOCOL::SubType, EFI_DEVICE_PATH_PROTOCOL::Type, usb_function::usb, usb_hub::usb, usb_depth(), and zalloc().

Referenced by efi_usb_install(), and usbblk_efi_describe().

◆ efi_load_path()

EFI_DEVICE_PATH_PROTOCOL* efi_load_path ( EFI_LOAD_OPTION load,
size_t  len 
)

Get EFI device path from load option.

Parameters
loadEFI load option
lenLength of EFI load option
Return values
pathEFI device path, or NULL on error

The caller is responsible for eventually calling free() on the allocated device path.

Definition at line 749 of file efi_path.c.

750  {
753  CHAR16 *wdesc;
754  size_t path_max;
755  size_t wmax;
756  size_t wlen;
757 
758  /* Check basic structure size */
759  if ( len < sizeof ( *load ) ) {
760  DBGC ( load, "EFI load option too short for header:\n" );
761  DBGC_HDA ( load, 0, load, len );
762  return NULL;
763  }
764 
765  /* Get length of description */
766  wdesc = ( ( ( void * ) load ) + sizeof ( *load ) );
767  wmax = ( ( len - sizeof ( *load ) ) / sizeof ( wdesc[0] ) );
768  wlen = wcsnlen ( wdesc, wmax );
769  if ( wlen == wmax ) {
770  DBGC ( load, "EFI load option has unterminated "
771  "description:\n" );
772  DBGC_HDA ( load, 0, load, len );
773  return NULL;
774  }
775 
776  /* Get inline device path */
777  path = ( ( ( void * ) load ) + sizeof ( *load ) +
778  ( wlen * sizeof ( wdesc[0] ) ) + 2 /* wNUL */ );
779  path_max = ( len - sizeof ( *load ) - ( wlen * sizeof ( wdesc[0] ) )
780  - 2 /* wNUL */ );
781  if ( load->FilePathListLength > path_max ) {
782  DBGC ( load, "EFI load option too short for path(s):\n" );
783  DBGC_HDA ( load, 0, load, len );
784  return NULL;
785  }
786 
787  /* Check path length */
788  if ( efi_path_check ( path, path_max ) != 0 ) {
789  DBGC ( load, "EFI load option has unterminated device "
790  "path:\n" );
791  DBGC_HDA ( load, 0, load, len );
792  return NULL;
793  }
794 
795  /* Allocate copy of path */
796  copy = malloc ( path_max );
797  if ( ! copy )
798  return NULL;
799  memcpy ( copy, path, path_max );
800 
801  return copy;
802 }
UINT16 FilePathListLength
Length in bytes of the FilePathList.
Definition: UefiSpec.h:2148
size_t wcsnlen(const wchar_t *string, size_t max)
Calculate length of wide-character string.
Definition: wchar.c:42
#define DBGC(...)
Definition: compiler.h:505
unsigned short CHAR16
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define DBGC_HDA(...)
Definition: compiler.h:506
int efi_path_check(EFI_DEVICE_PATH_PROTOCOL *path, size_t max)
Check that device path is well-formed.
Definition: efi_path.c:186
ring len
Length.
Definition: dwmac.h:231
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:620
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References DBGC, DBGC_HDA, efi_path_check(), _EFI_LOAD_OPTION::FilePathListLength, len, malloc(), memcpy(), NULL, and wcsnlen().

Referenced by efi_boot_path().

◆ efi_boot_path()

EFI_DEVICE_PATH_PROTOCOL* efi_boot_path ( unsigned int  number)

Get EFI device path for numbered boot option.

Parameters
numberBoot option number
Return values
pathEFI device path, or NULL on error

The caller is responsible for eventually calling free() on the allocated device path.

Definition at line 813 of file efi_path.c.

813  {
816  CHAR16 wname[ 9 /* "BootXXXX" + wNUL */ ];
817  EFI_LOAD_OPTION *load;
818  EFI_DEVICE_PATH *path;
819  UINT32 attrs;
820  UINTN size;
821  EFI_STATUS efirc;
822  int rc;
823 
824  /* Construct variable name */
825  efi_snprintf ( wname, ( sizeof ( wname ) / sizeof ( wname[0] ) ),
826  "Boot%04X", number );
827 
828  /* Get variable length */
829  size = 0;
830  if ( ( efirc = rs->GetVariable ( wname, guid, &attrs, &size,
831  NULL ) != EFI_BUFFER_TOO_SMALL ) ) {
832  rc = -EEFI ( efirc );
833  DBGC ( rs, "EFI could not get size of %ls: %s\n",
834  wname, strerror ( rc ) );
835  goto err_size;
836  }
837 
838  /* Allocate temporary buffer for EFI_LOAD_OPTION */
839  load = malloc ( size );
840  if ( ! load ) {
841  rc = -ENOMEM;
842  goto err_alloc;
843  }
844 
845  /* Read variable */
846  if ( ( efirc = rs->GetVariable ( wname, guid, &attrs, &size,
847  load ) != 0 ) ) {
848  rc = -EEFI ( efirc );
849  DBGC ( rs, "EFI could not read %ls: %s\n",
850  wname, strerror ( rc ) );
851  goto err_read;
852  }
853  DBGC2 ( rs, "EFI boot option %ls is:\n", wname );
854  DBGC2_HDA ( rs, 0, load, size );
855 
856  /* Get device path from load option */
857  path = efi_load_path ( load, size );
858  if ( ! path ) {
859  rc = -EINVAL;
860  DBGC ( rs, "EFI could not parse %ls: %s\n",
861  wname, strerror ( rc ) );
862  goto err_path;
863  }
864 
865  /* Free temporary buffer */
866  free ( load );
867 
868  return path;
869 
870  err_path:
871  err_read:
872  free ( load );
873  err_alloc:
874  err_size:
875  return NULL;
876 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
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:174
128 bit buffer containing a unique identifier value.
Definition: Base.h:215
uint16_t size
Buffer size.
Definition: dwmac.h:14
#define DBGC(...)
Definition: compiler.h:505
unsigned int UINT32
Definition: ProcessorBind.h:98
unsigned short CHAR16
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
#define EFI_BUFFER_TOO_SMALL
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:119
#define ENOMEM
Not enough space.
Definition: errno.h:534
int efi_snprintf(wchar_t *wbuf, size_t wsize, const char *fmt,...)
Write a formatted string to a buffer.
Definition: efi_strings.c:106
EFI_GUID efi_global_variable
Global variable GUID.
Definition: efi_guid.c:468
EFI_GET_VARIABLE GetVariable
Definition: UefiSpec.h:1902
#define DBGC2_HDA(...)
Definition: compiler.h:523
EFI Runtime Services Table.
Definition: UefiSpec.h:1879
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
UINT64 UINTN
Unsigned value of native width.
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:620
uint64_t guid
GUID.
Definition: edd.h:30
EFI_RUNTIME_SERVICES * RuntimeServices
A pointer to the EFI Runtime Services Table.
Definition: UefiSpec.h:2094
#define DBGC2(...)
Definition: compiler.h:522
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
EFI_SYSTEM_TABLE * efi_systab
EFI_DEVICE_PATH_PROTOCOL * efi_load_path(EFI_LOAD_OPTION *load, size_t len)
Get EFI device path from load option.
Definition: efi_path.c:749
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References DBGC, DBGC2, DBGC2_HDA, EEFI, EFI_BUFFER_TOO_SMALL, efi_global_variable, efi_load_path(), efi_snprintf(), efi_systab, EINVAL, ENOMEM, free, EFI_RUNTIME_SERVICES::GetVariable, guid, malloc(), NULL, rc, EFI_SYSTEM_TABLE::RuntimeServices, size, and strerror().

Referenced by efi_current_boot_path().

◆ efi_current_boot_path()

EFI_DEVICE_PATH_PROTOCOL* efi_current_boot_path ( void  )

Get EFI device path for current boot option.

Return values
pathEFI device path, or NULL on error

The caller is responsible for eventually calling free() on the allocated device path.

Definition at line 886 of file efi_path.c.

886  {
889  CHAR16 wname[] = L"BootCurrent";
890  UINT16 current;
891  UINT32 attrs;
892  UINTN size;
893  EFI_STATUS efirc;
894  int rc;
895 
896  /* Read current boot option index */
897  size = sizeof ( current );
898  if ( ( efirc = rs->GetVariable ( wname, guid, &attrs, &size,
899  &current ) != 0 ) ) {
900  rc = -EEFI ( efirc );
901  DBGC ( rs, "EFI could not read %ls: %s\n",
902  wname, strerror ( rc ) );
903  return NULL;
904  }
905 
906  /* Get device path from this boot option */
907  return efi_boot_path ( current );
908 }
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:174
128 bit buffer containing a unique identifier value.
Definition: Base.h:215
uint16_t size
Buffer size.
Definition: dwmac.h:14
#define DBGC(...)
Definition: compiler.h:505
unsigned int UINT32
Definition: ProcessorBind.h:98
unsigned short CHAR16
EFI_DEVICE_PATH_PROTOCOL * efi_boot_path(unsigned int number)
Get EFI device path for numbered boot option.
Definition: efi_path.c:813
EFI_GUID efi_global_variable
Global variable GUID.
Definition: efi_guid.c:468
EFI_GET_VARIABLE GetVariable
Definition: UefiSpec.h:1902
unsigned short UINT16
EFI Runtime Services Table.
Definition: UefiSpec.h:1879
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
UINT64 UINTN
Unsigned value of native width.
uint64_t guid
GUID.
Definition: edd.h:30
EFI_RUNTIME_SERVICES * RuntimeServices
A pointer to the EFI Runtime Services Table.
Definition: UefiSpec.h:2094
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

References DBGC, EEFI, efi_boot_path(), efi_global_variable, efi_systab, EFI_RUNTIME_SERVICES::GetVariable, guid, NULL, rc, EFI_SYSTEM_TABLE::RuntimeServices, size, and strerror().

Referenced by efi_init_application().

◆ efi_describe()

EFI_DEVICE_PATH_PROTOCOL* efi_describe ( struct interface intf)

Describe object as an EFI device path.

Parameters
intfInterface
Return values
pathEFI device path, or NULL

The caller is responsible for eventually calling free() on the allocated device path.

Definition at line 919 of file efi_path.c.

919  {
920  struct interface *dest;
921  efi_describe_TYPE ( void * ) *op =
923  void *object = intf_object ( dest );
925 
926  if ( op ) {
927  path = op ( object );
928  } else {
929  path = NULL;
930  }
931 
932  intf_put ( dest );
933  return path;
934 }
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:45
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
Definition: interface.c:159
struct interface * intf
Original interface.
Definition: interface.h:158
An object interface.
Definition: interface.h:124
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
EFI_DEVICE_PATH_PROTOCOL * efi_describe(struct interface *intf)
Describe object as an EFI device path.
Definition: efi_path.c:919
void intf_put(struct interface *intf)
Decrement reference count on an object interface.
Definition: interface.c:149
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:150
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define intf_get_dest_op(intf, type, dest)
Get object interface destination and operation method.
Definition: interface.h:269
#define efi_describe_TYPE(object_type)
Definition: efi_path.h:68

References dest, efi_describe(), efi_describe_TYPE, interface::intf, intf_get_dest_op, intf_object(), intf_put(), NULL, and op.

Referenced by efi_block_hook(), and efi_describe().