root/arch/s390/boot/compressed/decompressor.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mem_safe_offset
  2. decompress_kernel

   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 <schwidefsky@de.ibm.com>
   8  */
   9 
  10 #include <linux/kernel.h>
  11 #include <linux/string.h>
  12 #include <asm/page.h>
  13 #include "decompressor.h"
  14 
  15 /*
  16  * gzip declarations
  17  */
  18 #define STATIC static
  19 #define STATIC_RW_DATA static __section(.data)
  20 
  21 #undef memset
  22 #undef memcpy
  23 #undef memmove
  24 #define memmove memmove
  25 #define memzero(s, n) memset((s), 0, (n))
  26 
  27 /* Symbols defined by linker scripts */
  28 extern char _end[];
  29 extern unsigned char _compressed_start[];
  30 extern unsigned char _compressed_end[];
  31 
  32 #ifdef CONFIG_HAVE_KERNEL_BZIP2
  33 #define HEAP_SIZE       0x400000
  34 #else
  35 #define HEAP_SIZE       0x10000
  36 #endif
  37 
  38 static unsigned long free_mem_ptr = (unsigned long) _end;
  39 static unsigned long free_mem_end_ptr = (unsigned long) _end + HEAP_SIZE;
  40 
  41 #ifdef CONFIG_KERNEL_GZIP
  42 #include "../../../../lib/decompress_inflate.c"
  43 #endif
  44 
  45 #ifdef CONFIG_KERNEL_BZIP2
  46 #include "../../../../lib/decompress_bunzip2.c"
  47 #endif
  48 
  49 #ifdef CONFIG_KERNEL_LZ4
  50 #include "../../../../lib/decompress_unlz4.c"
  51 #endif
  52 
  53 #ifdef CONFIG_KERNEL_LZMA
  54 #include "../../../../lib/decompress_unlzma.c"
  55 #endif
  56 
  57 #ifdef CONFIG_KERNEL_LZO
  58 #include "../../../../lib/decompress_unlzo.c"
  59 #endif
  60 
  61 #ifdef CONFIG_KERNEL_XZ
  62 #include "../../../../lib/decompress_unxz.c"
  63 #endif
  64 
  65 #define decompress_offset ALIGN((unsigned long)_end + HEAP_SIZE, PAGE_SIZE)
  66 
  67 unsigned long mem_safe_offset(void)
  68 {
  69         /*
  70          * due to 4MB HEAD_SIZE for bzip2
  71          * 'decompress_offset + vmlinux.image_size' could be larger than
  72          * kernel at final position + its .bss, so take the larger of two
  73          */
  74         return max(decompress_offset + vmlinux.image_size,
  75                    vmlinux.default_lma + vmlinux.image_size + vmlinux.bss_size);
  76 }
  77 
  78 void *decompress_kernel(void)
  79 {
  80         void *output = (void *)decompress_offset;
  81 
  82         __decompress(_compressed_start, _compressed_end - _compressed_start,
  83                      NULL, NULL, output, 0, NULL, error);
  84         return output;
  85 }

/* [<][>][^][v][top][bottom][index][help] */