2 my ($myedata,$myend,$initmips,$mystart,$tgt_putchar);
3 open(F
,qq(mipsel
-linux
-objdump
-x
$ARGV[0]|));
7 if(/([0-9a-f]+).+_edata/){
11 if(/([0-9a-f]+).+_end$/){
14 if(/([0-9a-f]+).+initmips$/){
17 if(/([0-9a-f]+).+\s_start$/){
20 if(/([0-9a-f]+).+\stgt_putchar$/){
21 $tgt_putchar=qq(0x
$1);
26 typedef long long off_t
;
28 int (*open) (char
*, int, int);
30 int (*read) (int, void
*, int);
31 int (*write) (int, void
*, int);
32 off_t
(*lseek
) (int, off_t
, int);
33 int (*printf) (const char
*, ...);
34 void
(*cacheflush
) (void
);
35 char
*(*gets
) (char
*);
37 struct callvectors
*cvs
;
38 void realinitmips
(unsigned
int msize
);
43 " mfc0 \$3, \$15 # read processor ID register;" \\
44 " li \$2, 0x6303 #godson2f prid;" \\
45 " beq \$2, \$3, godson_2f;" \\
47 " li \$2, 0x6302 #godson2e prid;" \\
48 " bne \$2, \$3,11f ;"\\
52 " li \$2, 0x80000000;" \\
53 " addu \$3,\$2,512*1024;" \\
55 " cache 3, 0(\$2);" \\
56 " cache 3, 1(\$2);" \\
57 " cache 3, 2(\$2);" \\
58 " cache 3, 3(\$2);" \\
60 " bne \$2,\$3, 10b;" \\
72 " li \$5,0x80000000;" \\
73 " addu \$6,\$5,16384;" \\
88 void initmips
(unsigned
int msize
,struct callvectors
*cv
)
90 int *edata
=(void
*)$myedata;
91 int *end
=(void
*)$myend;
94 stringserial
("Uncompressing Bios");
95 run_unzip
(biosdata
,$mystart);
96 stringserial
("OK,Booting Bios\\r\\n");
97 for(p
=edata
;p
<=end
;p
++)
101 memset
($mystart-0x1000,0,0x1000);//$mystart-0x1000 for frame
(registers
),memset
for pretty
103 stringserial
("flush_cache...");
109 stringserial
("done,boot now\\r\\n");
113 void realinitmips
(unsigned
int msize
)
115 asm
("li \$29,$mystart-0x4000;" \
116 "li \$2,$myinitmips;" \
123 : "\$29", "\$2","\$4");
126 static void
(*rom_putchar
)(char c
)=(${tgt_putchar
}-${mystart
}+0xffffffffbfc00000);
127 void tgt_putchar
(char c
)
130 cvs
->printf("%%c",c
);
133 void stringserial
(char
*str
)
136 cvs
->printf("%%s",str
);