File Index
Files and directories
Sign in
FILE

zboot-decompress-gzip.c

File preview with syntax highlighting.

linux-6.19.14/drivers/firmware/efi/libstub/zboot-decompress-gzip.c C
 1// SPDX-License-Identifier: GPL-2.0
 2
 3#include <linux/efi.h>
 4#include <linux/zlib.h>
 5
 6#include <asm/efi.h>
 7
 8#include "efistub.h"
 9
10#include "inftrees.c"
11#include "inffast.c"
12#include "inflate.c"
13
14extern unsigned char _gzdata_start[], _gzdata_end[];
15extern u32 __aligned(1) payload_size;
16
17static struct z_stream_s stream;
18
19efi_status_t efi_zboot_decompress_init(unsigned long *alloc_size)
20{
21	efi_status_t status;
22	int rc;
23
24	/* skip the 10 byte header, assume no recorded filename */
25	stream.next_in = _gzdata_start + 10;
26	stream.avail_in = _gzdata_end - stream.next_in;
27
28	status = efi_allocate_pages(zlib_inflate_workspacesize(),
29				    (unsigned long *)&stream.workspace,
30				    ULONG_MAX);
31	if (status != EFI_SUCCESS)
32		return status;
33
34	rc = zlib_inflateInit2(&stream, -MAX_WBITS);
35	if (rc != Z_OK) {
36		efi_err("failed to initialize GZIP decompressor: %d\n", rc);
37		status = EFI_LOAD_ERROR;
38		goto out;
39	}
40
41	*alloc_size = payload_size;
42	return EFI_SUCCESS;
43out:
44	efi_free(zlib_inflate_workspacesize(), (unsigned long)stream.workspace);
45	return status;
46}
47
48efi_status_t efi_zboot_decompress(u8 *out, unsigned long outlen)
49{
50	int rc;
51
52	stream.next_out = out;
53	stream.avail_out = outlen;
54
55	rc = zlib_inflate(&stream, 0);
56	zlib_inflateEnd(&stream);
57
58	efi_free(zlib_inflate_workspacesize(), (unsigned long)stream.workspace);
59
60	if (rc != Z_STREAM_END) {
61		efi_err("GZIP decompression failed with status %d\n", rc);
62		return EFI_LOAD_ERROR;
63	}
64
65	efi_cache_sync_image((unsigned long)out, outlen);
66
67	return EFI_SUCCESS;
68}
~/ Read-only file preview.