Path: blob/master/drivers/firmware/efi/libstub/zboot-decompress-zstd.c
26483 views
// SPDX-License-Identifier: GPL-2.012#include <linux/efi.h>3#include <linux/zstd.h>45#include <asm/efi.h>67#include "decompress_sources.h"8#include "efistub.h"910extern unsigned char _gzdata_start[], _gzdata_end[];11extern u32 __aligned(1) payload_size;1213static size_t wksp_size;14static void *wksp;1516efi_status_t efi_zboot_decompress_init(unsigned long *alloc_size)17{18efi_status_t status;1920wksp_size = zstd_dctx_workspace_bound();21status = efi_allocate_pages(wksp_size, (unsigned long *)&wksp, ULONG_MAX);22if (status != EFI_SUCCESS)23return status;2425*alloc_size = payload_size;26return EFI_SUCCESS;27}2829efi_status_t efi_zboot_decompress(u8 *out, unsigned long outlen)30{31zstd_dctx *dctx = zstd_init_dctx(wksp, wksp_size);32size_t ret;33int retval;3435ret = zstd_decompress_dctx(dctx, out, outlen, _gzdata_start,36_gzdata_end - _gzdata_start - 4);37efi_free(wksp_size, (unsigned long)wksp);3839retval = zstd_get_error_code(ret);40if (retval) {41efi_err("ZSTD-decompression failed with status %d\n", retval);42return EFI_LOAD_ERROR;43}4445efi_cache_sync_image((unsigned long)out, outlen);4647return EFI_SUCCESS;48}495051