0001
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;
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 }