Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/sh/boot/compressed/misc.c
26481 views
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
#include "misc.h"
20
21
/*
22
* gzip declarations
23
*/
24
25
#define STATIC static
26
27
#undef memset
28
#undef memcpy
29
#define memzero(s, n) memset ((s), 0, (n))
30
31
extern char input_data[];
32
extern int input_len;
33
static unsigned char *output;
34
35
static void error(char *m);
36
37
int puts(const char *);
38
39
extern int _text; /* Defined in vmlinux.lds.S */
40
extern int _end;
41
static unsigned long free_mem_ptr;
42
static unsigned long free_mem_end_ptr;
43
44
#ifdef CONFIG_HAVE_KERNEL_BZIP2
45
#define HEAP_SIZE 0x400000
46
#else
47
#define HEAP_SIZE 0x10000
48
#endif
49
50
#ifdef CONFIG_KERNEL_GZIP
51
#include "../../../../lib/decompress_inflate.c"
52
#endif
53
54
#ifdef CONFIG_KERNEL_BZIP2
55
#include "../../../../lib/decompress_bunzip2.c"
56
#endif
57
58
#ifdef CONFIG_KERNEL_LZMA
59
#include "../../../../lib/decompress_unlzma.c"
60
#endif
61
62
#ifdef CONFIG_KERNEL_XZ
63
#include "../../../../lib/decompress_unxz.c"
64
#endif
65
66
#ifdef CONFIG_KERNEL_LZO
67
#include "../../../../lib/decompress_unlzo.c"
68
#endif
69
70
int puts(const char *s)
71
{
72
/* This should be updated to use the sh-sci routines */
73
return 0;
74
}
75
76
void* memset(void* s, int c, size_t n)
77
{
78
int i;
79
char *ss = (char*)s;
80
81
for (i=0;i<n;i++) ss[i] = c;
82
return s;
83
}
84
85
void* memcpy(void* __dest, __const void* __src,
86
size_t __n)
87
{
88
int i;
89
char *d = (char *)__dest, *s = (char *)__src;
90
91
for (i=0;i<__n;i++) d[i] = s[i];
92
return __dest;
93
}
94
95
static void error(char *x)
96
{
97
puts("\n\n");
98
puts(x);
99
puts("\n\n -- System halted");
100
101
while(1); /* Halt */
102
}
103
104
const unsigned long __stack_chk_guard = 0x000a0dff;
105
106
void __stack_chk_fail(void)
107
{
108
error("stack-protector: Kernel stack is corrupted\n");
109
}
110
111
/* Needed because vmlinux.lds.h references this */
112
void ftrace_stub(void)
113
{
114
}
115
void arch_ftrace_ops_list_func(void)
116
{
117
}
118
119
#define stackalign 4
120
121
#define STACK_SIZE (4096)
122
long __attribute__ ((aligned(stackalign))) user_stack[STACK_SIZE];
123
long *stack_start = &user_stack[STACK_SIZE];
124
125
void decompress_kernel(void)
126
{
127
unsigned long output_addr;
128
129
output_addr = __pa((unsigned long)&_text+PAGE_SIZE);
130
#if defined(CONFIG_29BIT)
131
output_addr |= P2SEG;
132
#endif
133
134
output = (unsigned char *)output_addr;
135
free_mem_ptr = (unsigned long)&_end;
136
free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
137
138
puts("Uncompressing Linux... ");
139
__decompress(input_data, input_len, NULL, NULL, output, 0, NULL, error);
140
puts("Ok, booting the kernel.\n");
141
}
142
143