Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/arch/arm/boot/compressed/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 2 kB image not shown  

Quelle  misc.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * misc.c
 * 
 * This is a collection of several routines from gzip-1.0.3 
 * adapted for Linux.
 *
 * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
 *
 * Modified for ARM Linux by Russell King
 *
 * Nicolas Pitre <nico@visuaide.com>  1999/04/14 :
 *  For this code to run directly from Flash, all constant variables must
 *  be marked with 'const' and all other variables initialized at run-time 
 *  only.  This way all non constant variables will end up in the bss segment,
 *  which should point to addresses in RAM and cleared to 0 on start.
 *  This allows for a much quicker boot time.
 */


unsigned int __machine_arch_type;

#include <linux/compiler.h> /* for inline */
#include <linux/types.h>
#include <linux/linkage.h>
#include "misc.h"
#ifdef CONFIG_ARCH_EP93XX
#include "misc-ep93xx.h"
#endif

static void putstr(const char *ptr);

#include CONFIG_UNCOMPRESS_INCLUDE

#ifdef CONFIG_DEBUG_ICEDCC

#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)

static void icedcc_putc(int ch)
{
 int status, i = 0x4000000;

 do {
  if (--i < 0)
   return;

  asm volatile ("mrc p14, 0, %0, c0, c1, 0" : "=r" (status));
 } while (status & (1 << 29));

 asm("mcr p14, 0, %0, c0, c5, 0" : : "r" (ch));
}


#elif defined(CONFIG_CPU_XSCALE)

static void icedcc_putc(int ch)
{
 int status, i = 0x4000000;

 do {
  if (--i < 0)
   return;

  asm volatile ("mrc p14, 0, %0, c14, c0, 0" : "=r" (status));
 } while (status & (1 << 28));

 asm("mcr p14, 0, %0, c8, c0, 0" : : "r" (ch));
}

#else

static void icedcc_putc(int ch)
{
 int status, i = 0x4000000;

 do {
  if (--i < 0)
   return;

  asm volatile ("mrc p14, 0, %0, c0, c0, 0" : "=r" (status));
 } while (status & 2);

 asm("mcr p14, 0, %0, c1, c0, 0" : : "r" (ch));
}

#endif

#define putc(ch) icedcc_putc(ch)
#endif

static void putstr(const char *ptr)
{
 char c;

 while ((c = *ptr++) != '\0') {
  if (c == '\n')
   putc('\r');
  putc(c);
 }

 flush();
}

/*
 * gzip declarations
 */

unsigned char *output_data;

unsigned long free_mem_ptr;
unsigned long free_mem_end_ptr;

#ifndef arch_error
#define arch_error(x)
#endif

void error(char *x)
{
 arch_error(x);

 putstr("\n\n");
 putstr(x);
 putstr("\n\n -- System halted");

 while(1); /* Halt */
}

asmlinkage void __div0(void)
{
 error("Attempting division by 0!");
}

void
decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p,
  unsigned long free_mem_ptr_end_p,
  int arch_id)
{
 int ret;

 output_data  = (unsigned char *)output_start;
 free_mem_ptr  = free_mem_ptr_p;
 free_mem_end_ptr = free_mem_ptr_end_p;
 __machine_arch_type = arch_id;

#ifdef CONFIG_ARCH_EP93XX
 ep93xx_decomp_setup();
#endif
 arch_decomp_setup();

 putstr("Uncompressing Linux...");
 ret = do_decompress(input_data, input_data_end - input_data,
       output_data, error);
 if (ret)
  error("decompressor returned an error");
 else
  putstr(" done, booting the kernel.\n");
}

void __fortify_panic(const u8 reason, size_t avail, size_t size)
{
 error("detected buffer overflow");
}

Messung V0.5
C=97 H=64 G=81

¤ Dauer der Verarbeitung: 0.1 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.