linux/arch/mips/boot/compressed/decompress.c
<<
>>
Prefs
   1/*
   2 * Copyright 2001 MontaVista Software Inc.
   3 * Author: Matt Porter <mporter@mvista.com>
   4 *
   5 * Copyright (C) 2009 Lemote, Inc.
   6 * Author: Wu Zhangjin <wuzhangjin@gmail.com>
   7 *
   8 * This program is free software; you can redistribute  it and/or modify it
   9 * under  the terms of  the GNU General  Public License as published by the
  10 * Free Software Foundation;  either version 2 of the  License, or (at your
  11 * option) any later version.
  12 */
  13
  14#include <linux/types.h>
  15#include <linux/kernel.h>
  16
  17#include <asm/addrspace.h>
  18
  19/*
  20 * These two variables specify the free mem region
  21 * that can be used for temporary malloc area
  22 */
  23unsigned long free_mem_ptr;
  24unsigned long free_mem_end_ptr;
  25
  26/* The linker tells us where the image is. */
  27extern unsigned char __image_begin, __image_end;
  28
  29/* debug interfaces  */
  30extern void puts(const char *s);
  31extern void puthex(unsigned long long val);
  32
  33void error(char *x)
  34{
  35        puts("\n\n");
  36        puts(x);
  37        puts("\n\n -- System halted");
  38
  39        while (1)
  40                ;       /* Halt */
  41}
  42
  43/* activate the code for pre-boot environment */
  44#define STATIC static
  45
  46#ifdef CONFIG_KERNEL_GZIP
  47void *memcpy(void *dest, const void *src, size_t n)
  48{
  49        int i;
  50        const char *s = src;
  51        char *d = dest;
  52
  53        for (i = 0; i < n; i++)
  54                d[i] = s[i];
  55        return dest;
  56}
  57#include "../../../../lib/decompress_inflate.c"
  58#endif
  59
  60#ifdef CONFIG_KERNEL_BZIP2
  61void *memset(void *s, int c, size_t n)
  62{
  63        int i;
  64        char *ss = s;
  65
  66        for (i = 0; i < n; i++)
  67                ss[i] = c;
  68        return s;
  69}
  70#include "../../../../lib/decompress_bunzip2.c"
  71#endif
  72
  73#ifdef CONFIG_KERNEL_LZMA
  74#include "../../../../lib/decompress_unlzma.c"
  75#endif
  76
  77#ifdef CONFIG_KERNEL_LZO
  78#include "../../../../lib/decompress_unlzo.c"
  79#endif
  80
  81void decompress_kernel(unsigned long boot_heap_start)
  82{
  83        unsigned long zimage_start, zimage_size;
  84
  85        zimage_start = (unsigned long)(&__image_begin);
  86        zimage_size = (unsigned long)(&__image_end) -
  87            (unsigned long)(&__image_begin);
  88
  89        puts("zimage at:     ");
  90        puthex(zimage_start);
  91        puts(" ");
  92        puthex(zimage_size + zimage_start);
  93        puts("\n");
  94
  95        /* This area are prepared for mallocing when decompressing */
  96        free_mem_ptr = boot_heap_start;
  97        free_mem_end_ptr = boot_heap_start + BOOT_HEAP_SIZE;
  98
  99        /* Display standard Linux/MIPS boot prompt */
 100        puts("Uncompressing Linux at load address ");
 101        puthex(VMLINUX_LOAD_ADDRESS_ULL);
 102        puts("\n");
 103
 104        /* Decompress the kernel with according algorithm */
 105        decompress((char *)zimage_start, zimage_size, 0, 0,
 106                   (void *)VMLINUX_LOAD_ADDRESS_ULL, 0, error);
 107
 108        /* FIXME: should we flush cache here? */
 109        puts("Now, booting the kernel...\n");
 110}
 111