cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

misc.c (4008B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Copyright (C) 2009 Thomas Chou <thomas@wytron.com.tw>
      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 * Based on arch/sh/boot/compressed/misc.c
     15 */
     16
     17#include <linux/string.h>
     18
     19/*
     20 * gzip declarations
     21 */
     22#define OF(args)  args
     23#define STATIC static
     24
     25#undef memset
     26#undef memcpy
     27#define memzero(s, n)		memset((s), 0, (n))
     28
     29typedef unsigned char  uch;
     30typedef unsigned short ush;
     31typedef unsigned long  ulg;
     32#define WSIZE 0x8000		/* Window size must be at least 32k, */
     33				/* and a power of two */
     34
     35static uch *inbuf;		/* input buffer */
     36static uch window[WSIZE];	/* Sliding window buffer */
     37
     38static unsigned insize;	/* valid bytes in inbuf */
     39static unsigned inptr;	/* index of next byte to be processed in inbuf */
     40static unsigned outcnt;	/* bytes in output buffer */
     41
     42/* gzip flag byte */
     43#define ASCII_FLAG	0x01 /* bit 0 set: file probably ASCII text */
     44#define CONTINUATION	0x02 /* bit 1 set: continuation of multi-part gzip
     45				file */
     46#define EXTRA_FIELD	0x04 /* bit 2 set: extra field present */
     47#define ORIG_NAME	0x08 /* bit 3 set: original file name present */
     48#define COMMENT		0x10 /* bit 4 set: file comment present */
     49#define ENCRYPTED	0x20 /* bit 5 set: file is encrypted */
     50#define RESERVED	0xC0 /* bit 6,7:   reserved */
     51
     52#define get_byte()  (inptr < insize ? inbuf[inptr++] : fill_inbuf())
     53
     54#ifdef DEBUG
     55#  define Assert(cond, msg) {if (!(cond)) error(msg); }
     56#  define Trace(x) fprintf x
     57#  define Tracev(x) {if (verbose) fprintf x ; }
     58#  define Tracevv(x) {if (verbose > 1) fprintf x ; }
     59#  define Tracec(c, x) {if (verbose && (c)) fprintf x ; }
     60#  define Tracecv(c, x) {if (verbose > 1 && (c)) fprintf x ; }
     61#else
     62#  define Assert(cond, msg)
     63#  define Trace(x)
     64#  define Tracev(x)
     65#  define Tracevv(x)
     66#  define Tracec(c, x)
     67#  define Tracecv(c, x)
     68#endif
     69static int  fill_inbuf(void);
     70static void flush_window(void);
     71static void error(char *m);
     72
     73extern char input_data[];
     74extern int input_len;
     75
     76static long bytes_out;
     77static uch *output_data;
     78static unsigned long output_ptr;
     79
     80#include "console.c"
     81
     82static void error(char *m);
     83
     84int puts(const char *);
     85
     86extern int _end;
     87static unsigned long free_mem_ptr;
     88static unsigned long free_mem_end_ptr;
     89
     90#define HEAP_SIZE			0x10000
     91
     92#include "../../../../lib/inflate.c"
     93
     94void *memset(void *s, int c, size_t n)
     95{
     96	int i;
     97	char *ss = (char *)s;
     98
     99	for (i = 0; i < n; i++)
    100		ss[i] = c;
    101	return s;
    102}
    103
    104void *memcpy(void *__dest, __const void *__src, size_t __n)
    105{
    106	int i;
    107	char *d = (char *)__dest, *s = (char *)__src;
    108
    109	for (i = 0; i < __n; i++)
    110		d[i] = s[i];
    111	return __dest;
    112}
    113
    114/*
    115 * Fill the input buffer. This is called only when the buffer is empty
    116 * and at least one byte is really needed.
    117 */
    118static int fill_inbuf(void)
    119{
    120	if (insize != 0)
    121		error("ran out of input data");
    122
    123	inbuf = input_data;
    124	insize = input_len;
    125	inptr = 1;
    126	return inbuf[0];
    127}
    128
    129/*
    130 * Write the output window window[0..outcnt-1] and update crc and bytes_out.
    131 * (Used for the decompressed data only.)
    132 */
    133static void flush_window(void)
    134{
    135	ulg c = crc;	/* temporary variable */
    136	unsigned n;
    137	uch *in, *out, ch;
    138
    139	in = window;
    140	out = &output_data[output_ptr];
    141	for (n = 0; n < outcnt; n++) {
    142		ch = *out++ = *in++;
    143		c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
    144	}
    145	crc = c;
    146	bytes_out += (ulg)outcnt;
    147	output_ptr += (ulg)outcnt;
    148	outcnt = 0;
    149}
    150
    151static void error(char *x)
    152{
    153	puts("\nERROR\n");
    154	puts(x);
    155	puts("\n\n -- System halted");
    156
    157	while (1)	/* Halt */
    158		;
    159}
    160
    161void decompress_kernel(void)
    162{
    163	output_data = (void *) (CONFIG_NIOS2_MEM_BASE |
    164				CONFIG_NIOS2_KERNEL_REGION_BASE);
    165	output_ptr = 0;
    166	free_mem_ptr = (unsigned long)&_end;
    167	free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
    168
    169	console_init();
    170	makecrc();
    171	puts("Uncompressing Linux... ");
    172	gunzip();
    173	puts("Ok, booting the kernel.\n");
    174}