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