linux/arch/sh/boot/compressed/misc.c
<<
>>
Prefs
   1/*
   2 * arch/sh/boot/compressed/misc.c
   3 *
   4 * This is a collection of several routines from gzip-1.0.3
   5 * adapted for Linux.
   6 *
   7 * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
   8 *
   9 * Adapted for SH by Stuart Menefy, Aug 1999
  10 *
  11 * Modified to use standard LinuxSH BIOS by Greg Banks 7Jul2000
  12 */
  13
  14#include <asm/uaccess.h>
  15#include <asm/addrspace.h>
  16#include <asm/page.h>
  17#include <asm/sh_bios.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_SH_STANDARD_BIOS
  66size_t strlen(const char *s)
  67{
  68        int i = 0;
  69
  70        while (*s++)
  71                i++;
  72        return i;
  73}
  74
  75int puts(const char *s)
  76{
  77        int len = strlen(s);
  78        sh_bios_console_write(s, len);
  79        return len;
  80}
  81#else
  82int puts(const char *s)
  83{
  84        /* This should be updated to use the sh-sci routines */
  85        return 0;
  86}
  87#endif
  88
  89void* memset(void* s, int c, size_t n)
  90{
  91        int i;
  92        char *ss = (char*)s;
  93
  94        for (i=0;i<n;i++) ss[i] = c;
  95        return s;
  96}
  97
  98void* memcpy(void* __dest, __const void* __src,
  99                            size_t __n)
 100{
 101        int i;
 102        char *d = (char *)__dest, *s = (char *)__src;
 103
 104        for (i=0;i<__n;i++) d[i] = s[i];
 105        return __dest;
 106}
 107
 108static void error(char *x)
 109{
 110        puts("\n\n");
 111        puts(x);
 112        puts("\n\n -- System halted");
 113
 114        while(1);       /* Halt */
 115}
 116
 117#ifdef CONFIG_SUPERH64
 118#define stackalign      8
 119#else
 120#define stackalign      4
 121#endif
 122
 123#define STACK_SIZE (4096)
 124long __attribute__ ((aligned(stackalign))) user_stack[STACK_SIZE];
 125long *stack_start = &user_stack[STACK_SIZE];
 126
 127void decompress_kernel(void)
 128{
 129        unsigned long output_addr;
 130
 131#ifdef CONFIG_SUPERH64
 132        output_addr = (CONFIG_MEMORY_START + 0x2000);
 133#else
 134        output_addr = PHYSADDR((unsigned long)&_text+PAGE_SIZE);
 135#ifdef CONFIG_29BIT
 136        output_addr |= P2SEG;
 137#endif
 138#endif
 139
 140        output = (unsigned char *)output_addr;
 141        free_mem_ptr = (unsigned long)&_end;
 142        free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
 143
 144        puts("Uncompressing Linux... ");
 145        cache_control(CACHE_ENABLE);
 146        decompress(input_data, input_len, NULL, NULL, output, NULL, error);
 147        cache_control(CACHE_DISABLE);
 148        puts("Ok, booting the kernel.\n");
 149}
 150