Initial xloong code
[xloong.git] / zloader.3amcp68 / zlib_loader.c
blob71d6658c28a0fff14dd0537875c629181509d0f1
1 #ifdef SIM
2 #include "stdio.h"
3 #else
4 typedef int size_t;
5 extern void tgt_putchar(char c);
6 #endif
7 #include "zlib_pmon.bin.c"
9 #define __init
10 #define KERN_ERR
12 #include "memop.c"
13 #include <linux/zlib.h>
14 typedef unsigned int u32;
15 typedef unsigned char u8;
17 static void *inflate_workspace;
19 char printerr(char *msg,int value)
21 static char buf[0x100];
22 stringserial(msg);
23 buf[0]="(";
24 buf[1]=0;
25 if(value<0)btoa(buf+1,value,-10);
26 else btoa(buf+1,value,10);
27 strcat(buf,")!\n");
28 stringserial(buf);
31 int
32 strlen(const char *p)
34 int n;
36 if (!p)
37 return (0);
38 for (n = 0; *p; p++)
39 n++;
40 return (n);
42 /**
43 * strcat - Append one %NUL-terminated string to another
44 * @dest: The string to be appended to
45 * @src: The string to append to it
47 char * strcat(char * dest, const char * src)
49 char *tmp = dest;
51 while (*dest)
52 dest++;
53 while ((*dest++ = *src++) != '\0')
56 return tmp;
61 * char *btoa(dst,value,base)
62 * converts value to ascii, result in dst
64 char *
65 btoa(char *dst, unsigned int value, int base)
67 char buf[34], digit;
68 int i, j, rem, neg;
70 if (value == 0) {
71 dst[0] = '0';
72 dst[1] = 0;
73 return (dst);
76 neg = 0;
77 if (base == -10) {
78 base = 10;
79 if (value & (1L << 31)) {
80 value = (~value) + 1;
81 neg = 1;
85 for (i = 0; value != 0; i++) {
86 rem = value % base;
87 value /= base;
88 if (rem >= 0 && rem <= 9)
89 digit = rem + '0';
90 else if (rem >= 10 && rem <= 36)
91 digit = (rem - 10) + 'a';
92 buf[i] = digit;
95 buf[i] = 0;
96 if (neg)
97 strcat (buf, "-");
99 /* reverse the string */
100 for (i = 0, j = strlen (buf) - 1; j >= 0; i++, j--)
101 dst[i] = buf[j];
102 dst[i] = 0;
103 return (dst);
106 static int
107 compress_gunzip(const u8 *old, u32 oldsize,u8 *new)
109 /* error code and dump stream */
110 int err=0;
111 z_stream dump_stream;
113 dump_stream.workspace = inflate_workspace;
115 if ((err = zlib_inflateInit(&dump_stream)) != Z_OK) {
116 /* fall back to RLE compression */
117 printerr("compress_gunzip(): zlib_inflateInit() "
118 "failed",err);
119 return err;
122 dump_stream.next_in = (u8 *) old;
123 dump_stream.avail_in = oldsize;
126 dump_stream.next_out = new;
127 while(1){
128 dump_stream.avail_out =0x8000;
130 err = zlib_inflate(&dump_stream, Z_FINISH);
131 if(err==Z_STREAM_END)break;
132 else if(err<0 && (err!=Z_BUF_ERROR))
134 /* zero is return code here */
135 (void)zlib_inflateEnd(&dump_stream);
136 printerr("compress_gunzip(): zlib_inflate() failed",err);
137 return err;
139 tgt_putchar('.');
143 /* let's end the deflated compression stream */
144 if ((err = zlib_inflateEnd(&dump_stream)) != Z_OK) {
145 printerr("compress_gunzip(): zlib_inflateEnd() "
146 "failed",err);
149 /* return the compressed byte total (if it's smaller) */
150 return err;
154 extern char end[];
155 static int __init run_unzip(char *start,int to)
157 int err;
158 again:
159 inflate_workspace = (void *)end;
160 err=compress_gunzip(start,sizeof(biosdata),to);
161 if(err<0){stringserial("retry\n");goto again;}
164 #ifdef SIM
165 int main(int argc,char **argv)
167 fpw=fopen("tmp.txt","wb");
168 run_unzip(biosdata,0x80010000);
169 fclose(fpw);
171 #else
172 #include "initmips.c"
173 int read,write,open,close,printf,vsprintf,getenv,tgt_reboot,CpuTertiaryCacheSize;
174 #endif