misc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:7k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * arch/mips/galileo/misc.c
  3.  *
  4.  * This is a collection of several routines from gzip-1.0.3
  5.  * adapted for Linux.
  6.  *
  7.  * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
  8.  * puts by Nick Holloway 1993, better puts by Martin Mares 1995
  9.  * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
  10.  *
  11.  * Modified by RidgeRun Inc.
  12.  */
  13. #include <linux/vmalloc.h>
  14. #include <asm/io.h>
  15. /*
  16.  * gzip declarations
  17.  */
  18. #define OF(args)  args
  19. #define STATIC static
  20. #define channel 1
  21. #undef memset
  22. #undef memcpy
  23. #define memzero(s, n)     memset ((s), 0, (n))
  24. typedef unsigned char uch;
  25. typedef unsigned short ush;
  26. typedef unsigned long ulg;
  27. #define WSIZE 0x8000 /* Window size must be at least 32k, */
  28.      /* and a power of two */
  29. static uch *inbuf; /* input buffer */
  30. static uch window[WSIZE]; /* Sliding window buffer */
  31. static unsigned insize = 0; /* valid bytes in inbuf */
  32. static unsigned inptr = 0; /* index of next byte to be processed in inbuf */
  33. static unsigned outcnt = 0; /* bytes in output buffer */
  34. /* gzip flag byte */
  35. #define ASCII_FLAG   0x01 /* bit 0 set: file probably ASCII text */
  36. #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
  37. #define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
  38. #define ORIG_NAME    0x08 /* bit 3 set: original file name present */
  39. #define COMMENT      0x10 /* bit 4 set: file comment present */
  40. #define ENCRYPTED    0x20 /* bit 5 set: file is encrypted */
  41. #define RESERVED     0xC0 /* bit 6,7:   reserved */
  42. void variable_init();
  43. static void puts(const char *);
  44. void int2hex(int i)
  45. {
  46. int tth, th, h, t, d;
  47. if (i > 99999) {
  48. serial_putc(channel, "Error - int2hex outofbounds");
  49. return;
  50. }
  51. tth = (i) / 10000;
  52. th = (i - (tth * 10000)) / 1000;
  53. h = (i - ((tth * 10000) + (th * 1000))) / 100;
  54. t = (i - ((tth * 10000) + (th * 1000) + (h * 100))) / 10;
  55. d = (i - ((tth * 10000) + (th * 1000) + (h * 100) + (t * 10)));
  56. serial_putc(channel, tth + '0');
  57. serial_putc(channel, th + '0');
  58. serial_putc(channel, h + '0');
  59. serial_putc(channel, t + '0');
  60. serial_putc(channel, d + '0');
  61. }
  62. int checksum;
  63. int byte_count;
  64. static unsigned char *input_data;
  65. static int printCnt = 0;
  66. int get_byte()
  67. {
  68. unsigned char c = (inptr < insize ? inbuf[inptr++] : fill_inbuf());
  69. byte_count++;
  70. checksum += c;
  71. // if (printCnt++ < 150)
  72. // {
  73. //   puts("n");
  74. //   puts("byte count = ");
  75. //   int2hex(byte_count & 0xff);
  76. //   puts(" byte val = ");
  77. //   int2hex(c);
  78. //   puts(" checksum = ");
  79. //   int2hex(checksum & 0xff);
  80. //   puts("n");
  81. // }
  82. return c;
  83. }
  84. /* Diagnostic functions */
  85. #ifdef DEBUG
  86. #  define Assert(cond,msg) {if(!(cond)) error(msg);}
  87. #  define Trace(x) fprintf x
  88. #  define Tracev(x) {if (verbose) fprintf x ;}
  89. #  define Tracevv(x) {if (verbose>1) fprintf x ;}
  90. #  define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
  91. #  define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
  92. #else
  93. #  define Assert(cond,msg)
  94. #  define Trace(x)
  95. #  define Tracev(x)
  96. #  define Tracevv(x)
  97. #  define Tracec(c,x)
  98. #  define Tracecv(c,x)
  99. #endif
  100. static int fill_inbuf(void);
  101. static void flush_window(void);
  102. static void error(char *m);
  103. static void gzip_mark(void **);
  104. static void gzip_release(void **);
  105. /*
  106.  * This is set up by the setup-routine at boot-time
  107.  */
  108. #define STACK_SIZE (4096)
  109. long user_stack[STACK_SIZE];
  110. long *stack_start = &user_stack[STACK_SIZE];
  111. extern int linux_compressed_start;
  112. extern int linux_compressed_size;
  113. extern int malloc_start;
  114. static int input_len;
  115. static long bytes_out = 0;
  116. extern int kernel_location_start;
  117. static uch *output_data;
  118. static unsigned long output_ptr = 0;
  119. static void *malloc(int size);
  120. static void free(void *where);
  121. static void error(char *m);
  122. static void gzip_mark(void **);
  123. static void gzip_release(void **);
  124. static unsigned long free_mem_ptr;
  125. static unsigned long free_mem_end_ptr;
  126. #include "../../../../../lib/inflate.c"
  127. static void *malloc(int size)
  128. {
  129. void *p;
  130. if (size < 0)
  131. error("Malloc errorn");
  132. //      if (free_mem_ptr <= 0) error("Memory errorn");
  133. free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
  134. p = (void *) free_mem_ptr;
  135. free_mem_ptr += size;
  136. if (free_mem_ptr >= free_mem_end_ptr)
  137. error("nOut of memoryn");
  138. return p;
  139. }
  140. static void free(void *where)
  141. { /* Don't care */
  142. }
  143. static void gzip_mark(void **ptr)
  144. {
  145. *ptr = (void *) free_mem_ptr;
  146. }
  147. static void gzip_release(void **ptr)
  148. {
  149. free_mem_ptr = (long) *ptr;
  150. }
  151. static void puts(const char *s)
  152. {
  153. while (*s) {
  154. if (*s == 10)
  155. serial_putc(channel, 13);
  156. serial_putc(channel, *s++);
  157. }
  158. }
  159. void *memset(void *s, int c, size_t n)
  160. {
  161. int i;
  162. char *ss = (char *) s;
  163. for (i = 0; i < n; i++)
  164. ss[i] = c;
  165. return s;
  166. }
  167. void *memcpy(void *__dest, __const void *__src, size_t __n)
  168. {
  169. int i;
  170. char *d = (char *) __dest, *s = (char *) __src;
  171. for (i = 0; i < __n; i++)
  172. d[i] = s[i];
  173. return __dest;
  174. }
  175. /* ===========================================================================
  176.  * Fill the input buffer. This is called only when the buffer is empty
  177.  * and at least one byte is really needed.
  178.  */
  179. static int fill_inbuf(void)
  180. {
  181. if (insize != 0) {
  182. error("ran out of input datan");
  183. }
  184. inbuf = input_data;
  185. insize = input_len;
  186. inptr = 1;
  187. return inbuf[0];
  188. }
  189. /* ===========================================================================
  190.  * Write the output window window[0..outcnt-1] and update crc and bytes_out.
  191.  * (Used for the decompressed data only.)
  192.  */
  193. static void flush_window(void)
  194. {
  195. ulg c = crc; /* temporary variable */
  196. unsigned n;
  197. uch *in, *out, ch;
  198. in = window;
  199. out = &output_data[output_ptr];
  200. for (n = 0; n < outcnt; n++) {
  201. ch = *out++ = *in++;
  202. c = crc_32_tab[((int) c ^ ch) & 0xff] ^ (c >> 8);
  203. }
  204. crc = c;
  205. bytes_out += (ulg) outcnt;
  206. output_ptr += (ulg) outcnt;
  207. outcnt = 0;
  208. }
  209. check_mem()
  210. {
  211. int i;
  212. puts("ncplens = ");
  213. for (i = 0; i < 10; i++) {
  214. int2hex(cplens[i]);
  215. puts(" ");
  216. }
  217. puts("ncplext = ");
  218. for (i = 0; i < 10; i++) {
  219. int2hex(cplext[i]);
  220. puts(" ");
  221. }
  222. puts("nborder = ");
  223. for (i = 0; i < 10; i++) {
  224. int2hex(border[i]);
  225. puts(" ");
  226. }
  227. puts("n");
  228. }
  229. static void error(char *x)
  230. {
  231. check_mem();
  232. puts("nn");
  233. puts(x);
  234. puts("byte_count = ");
  235. int2hex(byte_count);
  236. puts("n");
  237. puts("nn -- System halted");
  238. while (1); /* Halt */
  239. }
  240. void variable_init()
  241. {
  242. byte_count = 0;
  243. checksum = 0;
  244. input_data = (unsigned char *) &linux_compressed_start;
  245. input_len = linux_compressed_size;
  246. output_data = &kernel_location_start;
  247. free_mem_ptr = (long) &malloc_start;
  248. free_mem_end_ptr = (long) ((char *) &malloc_start + 0x400000);
  249. }
  250. int decompress_kernel()
  251. {
  252. //check_mem();
  253. variable_init();
  254. makecrc();
  255. puts("Uncompressing Linux... n");
  256. gunzip(); // ...see inflate.c
  257. puts("Ok, booting the kernel.n");
  258. return 0;
  259. }