linux/arch/sh/boot/compressed/misc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * arch/sh/boot/compressed/misc.c
   4 *
   5 * This is a collection of several routines from gzip-1.0.3
   6 * adapted for Linux.
   7 *
   8 * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
   9 *
  10 * Adapted for SH by Stuart Menefy, Aug 1999
  11 *
  12 * Modified to use standard LinuxSH BIOS by Greg Banks 7Jul2000
  13 */
  14
  15#include <linux/uaccess.h>
  16#include <asm/addrspace.h>
  17#include <asm/page.h>
  18
  19/*
  20 * gzip declarations
  21 */
  22
  23#define STATIC static
  24
  25#undef memset
  26#undef memcpy
  27#define memzero(s, n)     memset ((s), 0, (n))
  28
  29/* cache.c */
  30#define CACHE_ENABLE      0
  31#define CACHE_DISABLE     1
  32int cache_control(unsigned int command);
  33
  34extern char input_data[];
  35extern int input_len;
  36static unsigned char *output;
  37
  38static void error(char *m);
  39
  40int puts(const char *);
  41
  42extern int _text;               /* Defined in vmlinux.lds.S */
  43extern int _end;
  44static unsigned long free_mem_ptr;
  45static unsigned long free_mem_end_ptr;
  46
  47#ifdef CONFIG_HAVE_KERNEL_BZIP2
  48#define HEAP_SIZE       0x400000
  49#else
  50#define HEAP_SIZE       0x10000
  51#endif
  52
  53#ifdef CONFIG_KERNEL_GZIP
  54#include "../../../../lib/decompress_inflate.c"
  55#endif
  56
  57#ifdef CONFIG_KERNEL_BZIP2
  58#include "../../../../lib/decompress_bunzip2.c"
  59#endif
  60
  61#ifdef CONFIG_KERNEL_LZMA
  62#include "../../../../lib/decompress_unlzma.c"
  63#endif
  64
  65#ifdef CONFIG_KERNEL_XZ
  66#include "../../../../lib/decompress_unxz.c"
  67#endif
  68
  69#ifdef CONFIG_KERNEL_LZO
  70#include "../../../../lib/decompress_unlzo.c"
  71#endif
  72
  73int puts(const char *s)
  74{
  75        /* This should be updated to use the sh-sci routines */
  76        return 0;
  77}
  78
  79void* memset(void* s, int c, size_t n)
  80{
  81        int i;
  82        char *ss = (char*)s;
  83
  84        for (i=0;i<n;i++) ss[i] = c;
  85        return s;
  86}
  87
  88void* memcpy(void* __dest, __const void* __src,
  89                            size_t __n)
  90{
  91        int i;
  92        char *d = (char *)__dest, *s = (char *)__src;
  93
  94        for (i=0;i<__n;i++) d[i] = s[i];
  95        return __dest;
  96}
  97
  98static void error(char *x)
  99{
 100        puts("\n\n");
 101        puts(x);
 102        puts("\n\n -- System halted");
 103
 104        while(1);       /* Halt */
 105}
 106
 107const unsigned long __stack_chk_guard = 0x000a0dff;
 108
 109void __stack_chk_fail(void)
 110{
 111        error("stack-protector: Kernel stack is corrupted\n");
 112}
 113
 114/* Needed because vmlinux.lds.h references this */
 115void ftrace_stub(void)
 116{
 117}
 118
 119#ifdef CONFIG_SUPERH64
 120#define stackalign      8
 121#else
 122#define stackalign      4
 123#endif
 124
 125#define STACK_SIZE (4096)
 126long __attribute__ ((aligned(stackalign))) user_stack[STACK_SIZE];
 127long *stack_start = &user_stack[STACK_SIZE];
 128
 129void decompress_kernel(void)
 130{
 131        unsigned long output_addr;
 132
 133#ifdef CONFIG_SUPERH64
 134        output_addr = (CONFIG_MEMORY_START + 0x2000);
 135#else
 136        output_addr = __pa((unsigned long)&_text+PAGE_SIZE);
 137#if defined(CONFIG_29BIT)
 138        output_addr |= P2SEG;
 139#endif
 140#endif
 141
 142        output = (unsigned char *)output_addr;
 143        free_mem_ptr = (unsigned long)&_end;
 144        free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
 145
 146        puts("Uncompressing Linux... ");
 147        cache_control(CACHE_ENABLE);
 148        __decompress(input_data, input_len, NULL, NULL, output, 0, NULL, error);
 149        cache_control(CACHE_DISABLE);
 150        puts("Ok, booting the kernel.\n");
 151}
 152