@ -303,10 +303,62 @@ static efi_status_t EFIAPI efi_install_protocol_interface(void **handle,
efi_guid_t * protocol , int protocol_interface_type ,
void * protocol_interface )
{
struct list_head * lhandle ;
int i ;
efi_status_t r ;
EFI_ENTRY ( " %p, %p, %d, %p " , handle , protocol , protocol_interface_type ,
protocol_interface ) ;
return EFI_EXIT ( EFI_OUT_OF_RESOURCES ) ;
if ( ! handle | | ! protocol | |
protocol_interface_type ! = EFI_NATIVE_INTERFACE ) {
r = EFI_INVALID_PARAMETER ;
goto out ;
}
/* Create new handle if requested. */
if ( ! * handle ) {
r = EFI_OUT_OF_RESOURCES ;
goto out ;
}
/* Find object. */
list_for_each ( lhandle , & efi_obj_list ) {
struct efi_object * efiobj ;
efiobj = list_entry ( lhandle , struct efi_object , link ) ;
if ( efiobj - > handle ! = * handle )
continue ;
/* Check if protocol is already installed on the handle. */
for ( i = 0 ; i < ARRAY_SIZE ( efiobj - > protocols ) ; i + + ) {
struct efi_handler * handler = & efiobj - > protocols [ i ] ;
if ( ! handler - > guid )
continue ;
if ( ! guidcmp ( handler - > guid , protocol ) ) {
r = EFI_INVALID_PARAMETER ;
goto out ;
}
}
/* Install protocol in first empty slot. */
for ( i = 0 ; i < ARRAY_SIZE ( efiobj - > protocols ) ; i + + ) {
struct efi_handler * handler = & efiobj - > protocols [ i ] ;
if ( handler - > guid )
continue ;
handler - > guid = protocol ;
handler - > protocol_interface = protocol_interface ;
r = EFI_SUCCESS ;
goto out ;
}
r = EFI_OUT_OF_RESOURCES ;
goto out ;
}
r = EFI_INVALID_PARAMETER ;
out :
return EFI_EXIT ( r ) ;
}
static efi_status_t EFIAPI efi_reinstall_protocol_interface ( void * handle ,
efi_guid_t * protocol , void * old_interface ,
void * new_interface )