fallback_platform.c 961 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/efi_embedded_fw.h>
  3. #include <linux/property.h>
  4. #include <linux/security.h>
  5. #include <linux/vmalloc.h>
  6. #include "fallback.h"
  7. #include "firmware.h"
  8. int firmware_fallback_platform(struct fw_priv *fw_priv)
  9. {
  10. const u8 *data;
  11. size_t size;
  12. int rc;
  13. if (!(fw_priv->opt_flags & FW_OPT_FALLBACK_PLATFORM))
  14. return -ENOENT;
  15. rc = security_kernel_load_data(LOADING_FIRMWARE, true);
  16. if (rc)
  17. return rc;
  18. rc = efi_get_embedded_fw(fw_priv->fw_name, &data, &size);
  19. if (rc)
  20. return rc; /* rc == -ENOENT when the fw was not found */
  21. if (fw_priv->data && size > fw_priv->allocated_size)
  22. return -ENOMEM;
  23. rc = security_kernel_post_load_data((u8 *)data, size, LOADING_FIRMWARE,
  24. "platform");
  25. if (rc)
  26. return rc;
  27. if (!fw_priv->data)
  28. fw_priv->data = vmalloc(size);
  29. if (!fw_priv->data)
  30. return -ENOMEM;
  31. memcpy(fw_priv->data, data, size);
  32. fw_priv->size = size;
  33. fw_state_done(fw_priv);
  34. return 0;
  35. }