Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 
0003 #include <linux/efi_embedded_fw.h>
0004 #include <linux/property.h>
0005 #include <linux/security.h>
0006 #include <linux/vmalloc.h>
0007 
0008 #include "fallback.h"
0009 #include "firmware.h"
0010 
0011 int firmware_fallback_platform(struct fw_priv *fw_priv)
0012 {
0013     const u8 *data;
0014     size_t size;
0015     int rc;
0016 
0017     if (!(fw_priv->opt_flags & FW_OPT_FALLBACK_PLATFORM))
0018         return -ENOENT;
0019 
0020     rc = security_kernel_load_data(LOADING_FIRMWARE, true);
0021     if (rc)
0022         return rc;
0023 
0024     rc = efi_get_embedded_fw(fw_priv->fw_name, &data, &size);
0025     if (rc)
0026         return rc; /* rc == -ENOENT when the fw was not found */
0027 
0028     if (fw_priv->data && size > fw_priv->allocated_size)
0029         return -ENOMEM;
0030 
0031     rc = security_kernel_post_load_data((u8 *)data, size, LOADING_FIRMWARE,
0032                         "platform");
0033     if (rc)
0034         return rc;
0035 
0036     if (!fw_priv->data)
0037         fw_priv->data = vmalloc(size);
0038     if (!fw_priv->data)
0039         return -ENOMEM;
0040 
0041     memcpy(fw_priv->data, data, size);
0042     fw_priv->size = size;
0043     fw_state_done(fw_priv);
0044     return 0;
0045 }