mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
961 B
45 lines
961 B
// SPDX-License-Identifier: GPL-2.0 |
|
|
|
#include <linux/efi_embedded_fw.h> |
|
#include <linux/property.h> |
|
#include <linux/security.h> |
|
#include <linux/vmalloc.h> |
|
|
|
#include "fallback.h" |
|
#include "firmware.h" |
|
|
|
int firmware_fallback_platform(struct fw_priv *fw_priv) |
|
{ |
|
const u8 *data; |
|
size_t size; |
|
int rc; |
|
|
|
if (!(fw_priv->opt_flags & FW_OPT_FALLBACK_PLATFORM)) |
|
return -ENOENT; |
|
|
|
rc = security_kernel_load_data(LOADING_FIRMWARE, true); |
|
if (rc) |
|
return rc; |
|
|
|
rc = efi_get_embedded_fw(fw_priv->fw_name, &data, &size); |
|
if (rc) |
|
return rc; /* rc == -ENOENT when the fw was not found */ |
|
|
|
if (fw_priv->data && size > fw_priv->allocated_size) |
|
return -ENOMEM; |
|
|
|
rc = security_kernel_post_load_data((u8 *)data, size, LOADING_FIRMWARE, |
|
"platform"); |
|
if (rc) |
|
return rc; |
|
|
|
if (!fw_priv->data) |
|
fw_priv->data = vmalloc(size); |
|
if (!fw_priv->data) |
|
return -ENOMEM; |
|
|
|
memcpy(fw_priv->data, data, size); |
|
fw_priv->size = size; |
|
fw_state_done(fw_priv); |
|
return 0; |
|
}
|
|
|