]> git.lizzy.rs Git - plan9front.git/blob - sys/src/boot/zynq/main.c
ip/cifsd: fix missing int return type for vpack() (thanks pr)
[plan9front.git] / sys / src / boot / zynq / main.c
1 #include <u.h>
2 #include <a.out.h>
3 #include "dat.h"
4 #include "fns.h"
5
6 void
7 puts(char *s)
8 {
9         while(*s)
10                 putc(*s++);
11 }
12
13 void
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
26 putdec(int n)
27 {
28         if(n / 10 != 0)
29                 putdec(n / 10);
30         putc(n % 10 + '0');
31 }
32
33 void
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
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
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
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 *
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
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
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
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
189 sleep(int n)
190 {
191         timeren(n);
192         while(!timertrig())
193                 ;
194 }
195
196 void
197 main(void)
198 {
199         puts("Booting ...\n");
200         if(mmcboot() > 0 || netboot() > 0)
201                 run();
202         print("hjboot: ending\n");
203 }