Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/base/firmware_loader/fallback_platform.c
26428 views
1
// SPDX-License-Identifier: GPL-2.0
2
3
#include <linux/efi_embedded_fw.h>
4
#include <linux/property.h>
5
#include <linux/security.h>
6
#include <linux/vmalloc.h>
7
8
#include "fallback.h"
9
#include "firmware.h"
10
11
int firmware_fallback_platform(struct fw_priv *fw_priv)
12
{
13
const u8 *data;
14
size_t size;
15
int rc;
16
17
if (!(fw_priv->opt_flags & FW_OPT_FALLBACK_PLATFORM))
18
return -ENOENT;
19
20
rc = security_kernel_load_data(LOADING_FIRMWARE, true);
21
if (rc)
22
return rc;
23
24
rc = efi_get_embedded_fw(fw_priv->fw_name, &data, &size);
25
if (rc)
26
return rc; /* rc == -ENOENT when the fw was not found */
27
28
if (fw_priv->data && size > fw_priv->allocated_size)
29
return -ENOMEM;
30
31
rc = security_kernel_post_load_data((u8 *)data, size, LOADING_FIRMWARE,
32
"platform");
33
if (rc)
34
return rc;
35
36
if (!fw_priv->data)
37
fw_priv->data = vmalloc(size);
38
if (!fw_priv->data)
39
return -ENOMEM;
40
41
memcpy(fw_priv->data, data, size);
42
fw_priv->size = size;
43
fw_state_done(fw_priv);
44
return 0;
45
}
46
47