Blame view

kernel/linux-rt-4.4.41/arch/unicore32/boot/compressed/misc.c 2.44 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  /*
   * linux/arch/unicore32/boot/compressed/misc.c
   *
   * Code specific to PKUnity SoC and UniCore ISA
   *
   * Copyright (C) 2001-2010 GUAN Xue-tao
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
  
  #include <asm/unaligned.h>
  #include <mach/uncompress.h>
  
  /*
   * gzip delarations
   */
  unsigned char *output_data;
  unsigned long output_ptr;
  
  unsigned int free_mem_ptr;
  unsigned int free_mem_end_ptr;
  
  #define STATIC static
  #define STATIC_RW_DATA	/* non-static please */
  
  /*
   * arch-dependent implementations
   */
  #ifndef ARCH_HAVE_DECOMP_ERROR
  #define arch_decomp_error(x)
  #endif
  
  #ifndef ARCH_HAVE_DECOMP_SETUP
  #define arch_decomp_setup()
  #endif
  
  #ifndef ARCH_HAVE_DECOMP_PUTS
  #define arch_decomp_puts(p)
  #endif
  
  void *memcpy(void *dest, const void *src, size_t n)
  {
  	int i = 0;
  	unsigned char *d = (unsigned char *)dest, *s = (unsigned char *)src;
  
  	for (i = n >> 3; i > 0; i--) {
  		*d++ = *s++;
  		*d++ = *s++;
  		*d++ = *s++;
  		*d++ = *s++;
  		*d++ = *s++;
  		*d++ = *s++;
  		*d++ = *s++;
  		*d++ = *s++;
  	}
  
  	if (n & 1 << 2) {
  		*d++ = *s++;
  		*d++ = *s++;
  		*d++ = *s++;
  		*d++ = *s++;
  	}
  
  	if (n & 1 << 1) {
  		*d++ = *s++;
  		*d++ = *s++;
  	}
  
  	if (n & 1)
  		*d++ = *s++;
  
  	return dest;
  }
  
  void error(char *x)
  {
  	arch_decomp_puts("
  
  ");
  	arch_decomp_puts(x);
  	arch_decomp_puts("
  
   -- System halted");
  
  	arch_decomp_error(x);
  
  	for (;;)
  		; /* Halt */
  }
  
  /* Heap size should be adjusted for different decompress method */
  #ifdef CONFIG_KERNEL_GZIP
  #include "../../../../lib/decompress_inflate.c"
  #endif
  
  #ifdef CONFIG_KERNEL_BZIP2
  #include "../../../../lib/decompress_bunzip2.c"
  #endif
  
  #ifdef CONFIG_KERNEL_LZO
  #include "../../../../lib/decompress_unlzo.c"
  #endif
  
  #ifdef CONFIG_KERNEL_LZMA
  #include "../../../../lib/decompress_unlzma.c"
  #endif
  
  unsigned long decompress_kernel(unsigned long output_start,
  		unsigned long free_mem_ptr_p,
  		unsigned long free_mem_ptr_end_p)
  {
  	unsigned char *tmp;
  
  	output_data		= (unsigned char *)output_start;
  	free_mem_ptr		= free_mem_ptr_p;
  	free_mem_end_ptr	= free_mem_ptr_end_p;
  
  	arch_decomp_setup();
  
  	tmp = (unsigned char *) (((unsigned long)input_data_end) - 4);
  	output_ptr = get_unaligned_le32(tmp);
  
  	arch_decomp_puts("Uncompressing Linux...");
  	__decompress(input_data, input_data_end - input_data, NULL, NULL,
  			output_data, 0, NULL, error);
  	arch_decomp_puts(" done, booting the kernel.
  ");
  	return output_ptr;
  }