cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fallback_platform.c (961B)


      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
     11int 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}