Path: blob/master/drivers/firmware/efi/libstub/zboot-decompress-gzip.c
26483 views
// SPDX-License-Identifier: GPL-2.012#include <linux/efi.h>3#include <linux/zlib.h>45#include <asm/efi.h>67#include "efistub.h"89#include "inftrees.c"10#include "inffast.c"11#include "inflate.c"1213extern unsigned char _gzdata_start[], _gzdata_end[];14extern u32 __aligned(1) payload_size;1516static struct z_stream_s stream;1718efi_status_t efi_zboot_decompress_init(unsigned long *alloc_size)19{20efi_status_t status;21int rc;2223/* skip the 10 byte header, assume no recorded filename */24stream.next_in = _gzdata_start + 10;25stream.avail_in = _gzdata_end - stream.next_in;2627status = efi_allocate_pages(zlib_inflate_workspacesize(),28(unsigned long *)&stream.workspace,29ULONG_MAX);30if (status != EFI_SUCCESS)31return status;3233rc = zlib_inflateInit2(&stream, -MAX_WBITS);34if (rc != Z_OK) {35efi_err("failed to initialize GZIP decompressor: %d\n", rc);36status = EFI_LOAD_ERROR;37goto out;38}3940*alloc_size = payload_size;41return EFI_SUCCESS;42out:43efi_free(zlib_inflate_workspacesize(), (unsigned long)stream.workspace);44return status;45}4647efi_status_t efi_zboot_decompress(u8 *out, unsigned long outlen)48{49int rc;5051stream.next_out = out;52stream.avail_out = outlen;5354rc = zlib_inflate(&stream, 0);55zlib_inflateEnd(&stream);5657efi_free(zlib_inflate_workspacesize(), (unsigned long)stream.workspace);5859if (rc != Z_STREAM_END) {60efi_err("GZIP decompression failed with status %d\n", rc);61return EFI_LOAD_ERROR;62}6364efi_cache_sync_image((unsigned long)out, outlen);6566return EFI_SUCCESS;67}686970