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 (2864B)


      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}
    118void arch_ftrace_ops_list_func(void)
    119{
    120}
    121
    122#define stackalign	4
    123
    124#define STACK_SIZE (4096)
    125long __attribute__ ((aligned(stackalign))) user_stack[STACK_SIZE];
    126long *stack_start = &user_stack[STACK_SIZE];
    127
    128void decompress_kernel(void)
    129{
    130	unsigned long output_addr;
    131
    132	output_addr = __pa((unsigned long)&_text+PAGE_SIZE);
    133#if defined(CONFIG_29BIT)
    134	output_addr |= P2SEG;
    135#endif
    136
    137	output = (unsigned char *)output_addr;
    138	free_mem_ptr = (unsigned long)&_end;
    139	free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
    140
    141	puts("Uncompressing Linux... ");
    142	cache_control(CACHE_ENABLE);
    143	__decompress(input_data, input_len, NULL, NULL, output, 0, NULL, error);
    144	cache_control(CACHE_DISABLE);
    145	puts("Ok, booting the kernel.\n");
    146}