1 #include <u.h>
2 #include <a.out.h>
3 #include "dat.h"
4 #include "fns.h"
5
6 void
puts(char * s)7 puts(char *s)
8 {
9 while(*s)
10 putc(*s++);
11 }
12
13 void
puthex(u32int u)14 puthex(u32int u)
15 {
16 static char *dig = "0123456789abcdef";
17 int i;
18
19 for(i = 0; i < 8; i++){
20 putc(dig[u >> 28]);
21 u <<= 4;
22 }
23 }
24
25 void
putdec(int n)26 putdec(int n)
27 {
28 if(n / 10 != 0)
29 putdec(n / 10);
30 putc(n % 10 + '0');
31 }
32
33 void
print(char * s,...)34 print(char *s, ...)
35 {
36 va_list va;
37 int n;
38 u32int u;
39
40 va_start(va, s);
41 while(*s)
42 if(*s == '%'){
43 switch(*++s){
44 case 's':
45 puts(va_arg(va, char *));
46 break;
47 case 'x':
48 puthex(va_arg(va, u32int));
49 break;
50 case 'd':
51 n = va_arg(va, int);
52 if(n < 0){
53 putc('-');
54 putdec(-n);
55 }else
56 putdec(n);
57 break;
58 case 'I':
59 u = va_arg(va, u32int);
60 putdec(u >> 24);
61 putc('.');
62 putdec((uchar)(u >> 16));
63 putc('.');
64 putdec((uchar)(u >> 8));
65 putc('.');
66 putdec((uchar)u);
67 break;
68 case 0:
69 va_end(va);
70 return;
71 }
72 s++;
73 }else
74 putc(*s++);
75 va_end(va);
76 }
77
78 void
memset(void * v,char c,int n)79 memset(void *v, char c, int n)
80 {
81 char *vc;
82
83 vc = v;
84 while(n--)
85 *vc++ = c;
86 }
87
88 void
memcpy(void * d,void * s,int n)89 memcpy(void *d, void *s, int n)
90 {
91 char *cd, *cs;
92
93 cd = d;
94 cs = s;
95 while(n--)
96 *cd++ = *cs++;
97 }
98
99 u32int
u32get(void * pp)100 u32get(void *pp)
101 {
102 uchar *p;
103
104 p = pp;
105 return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
106 }
107
108 uchar *
u32put(uchar * p,u32int v)109 u32put(uchar *p, u32int v)
110 {
111 p[0] = v >> 24;
112 p[1] = v >> 16;
113 p[2] = v >> 8;
114 p[3] = v;
115 return p + 4;
116 }
117
118 void
run(void)119 run(void)
120 {
121 ulong t, tr;
122 char *p, *d;
123 int n;
124 ulong *h;
125
126 h = (ulong *) TZERO;
127 if(u32get(&h[0]) != E_MAGIC){
128 print("invalid magic: %x != %x\n", u32get(&h[0]), E_MAGIC);
129 return;
130 }
131 t = u32get(&h[1]) + 0x20;
132 tr = t + 0xfff & ~0xfff;
133 if(t != tr){
134 n = u32get(&h[2]);
135 p = (char *) (TZERO + t + n);
136 d = (char *) (TZERO + tr + n);
137 while(n--)
138 *--d = *--p;
139 }
140 p = (char *) (TZERO + tr + u32get(&h[2]));
141 memset(p, 0, u32get(&h[3]));
142 jump((void *) (u32get(&h[5]) & 0xfffffff));
143 }
144
145 enum {
146 TIMERVALL,
147 TIMERVALH,
148 TIMERCTL,
149 TIMERSTAT,
150 TIMERCOMPL,
151 TIMERCOMPH,
152 };
153
154 void
timeren(int n)155 timeren(int n)
156 {
157 ulong *r;
158
159 r = (ulong *) 0xf8f00200;
160 if(n < 0){
161 r[TIMERSTAT] |= 1;
162 r[TIMERCTL] = 0;
163 return;
164 }
165 r[TIMERCTL] = 0;
166 r[TIMERVALL] = 0;
167 r[TIMERVALH] = 0;
168 r[TIMERCOMPL] = 1000 * n;
169 r[TIMERCOMPH] = 0;
170 r[TIMERSTAT] |= 1;
171 r[TIMERCTL] = 100 << 8 | 3;
172 }
173
174 int
timertrig(void)175 timertrig(void)
176 {
177 ulong *r;
178
179 r = (ulong *) 0xf8f00200;
180 if((r[TIMERSTAT] & 1) != 0){
181 r[TIMERCTL] = 0;
182 r[TIMERSTAT] |= 1;
183 return 1;
184 }
185 return 0;
186 }
187
188 void
sleep(int n)189 sleep(int n)
190 {
191 timeren(n);
192 while(!timertrig())
193 ;
194 }
195
196 void
main(void)197 main(void)
198 {
199 puts("Booting ...\n");
200 if(mmcboot() > 0 || netboot() > 0)
201 run();
202 print("hjboot: ending\n");
203 }
204