EFI_GUID guid;
/** Variable containing pointer to protocol structure */
void **protocol;
+ /** Protocol is required */
+ int required;
};
/** EFI protocol table */
.protocol = ( ( void ** ) ( void * ) \
( ( (_ptr) == ( ( _protocol ** ) (_ptr) ) ) ? \
(_ptr) : (_ptr) ) ), \
+ .required = 1, \
+ }
+
+/** Declare an EFI protocol to be requested by iPXE
+ *
+ * @v _protocol EFI protocol name
+ * @v _ptr Pointer to protocol instance
+ */
+#define EFI_REQUEST_PROTOCOL( _protocol, _ptr ) \
+ struct efi_protocol __ ## _protocol __efi_protocol = { \
+ .guid = _protocol ## _GUID, \
+ .protocol = ( ( void ** ) ( void * ) \
+ ( ( (_ptr) == ( ( _protocol ** ) (_ptr) ) ) ? \
+ (_ptr) : (_ptr) ) ), \
+ .required = 0, \
}
/** An EFI configuration table used by iPXE */
} else {
DBGC ( systab, "EFI does not provide protocol %s\n",
efi_guid_ntoa ( &prot->guid ) );
- /* All protocols are required */
- return efirc;
+ /* Fail if protocol is required */
+ if ( prot->required )
+ return efirc;
}
}