Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/s390/boot/decompressor.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* Definitions and wrapper functions for kernel decompressor
4
*
5
* Copyright IBM Corp. 2010
6
*
7
* Author(s): Martin Schwidefsky <[email protected]>
8
*/
9
10
#include <linux/kernel.h>
11
#include <linux/string.h>
12
#include <asm/boot_data.h>
13
#include <asm/page.h>
14
#include "decompressor.h"
15
#include "boot.h"
16
17
/*
18
* gzip declarations
19
*/
20
#define STATIC static
21
22
#undef memset
23
#undef memcpy
24
#undef memmove
25
#define memmove memmove
26
#define memzero(s, n) memset((s), 0, (n))
27
28
#if defined(CONFIG_KERNEL_BZIP2)
29
#define BOOT_HEAP_SIZE 0x400000
30
#elif defined(CONFIG_KERNEL_ZSTD)
31
#define BOOT_HEAP_SIZE 0x30000
32
#else
33
#define BOOT_HEAP_SIZE 0x10000
34
#endif
35
36
static unsigned long free_mem_ptr = (unsigned long) _end;
37
static unsigned long free_mem_end_ptr = (unsigned long) _end + BOOT_HEAP_SIZE;
38
39
#ifdef CONFIG_KERNEL_GZIP
40
#include "../../../../lib/decompress_inflate.c"
41
#endif
42
43
#ifdef CONFIG_KERNEL_BZIP2
44
#include "../../../../lib/decompress_bunzip2.c"
45
#endif
46
47
#ifdef CONFIG_KERNEL_LZ4
48
#include "../../../../lib/decompress_unlz4.c"
49
#endif
50
51
#ifdef CONFIG_KERNEL_LZMA
52
#include "../../../../lib/decompress_unlzma.c"
53
#endif
54
55
#ifdef CONFIG_KERNEL_LZO
56
#include "../../../../lib/decompress_unlzo.c"
57
#endif
58
59
#ifdef CONFIG_KERNEL_XZ
60
#include "../../../../lib/decompress_unxz.c"
61
#endif
62
63
#ifdef CONFIG_KERNEL_ZSTD
64
#include "../../../../lib/decompress_unzstd.c"
65
#endif
66
67
static void decompress_error(char *m)
68
{
69
if (bootdebug)
70
boot_rb_dump();
71
boot_emerg("Decompression error: %s\n", m);
72
boot_emerg(" -- System halted\n");
73
disabled_wait();
74
}
75
76
unsigned long mem_safe_offset(void)
77
{
78
return ALIGN(free_mem_end_ptr, PAGE_SIZE);
79
}
80
81
void deploy_kernel(void *output)
82
{
83
__decompress(_compressed_start, _compressed_end - _compressed_start,
84
NULL, NULL, output, vmlinux.image_size, NULL, decompress_error);
85
}
86
87