xref: /plan9-contrib/sys/src/nboot/zynq/main.c (revision 529c1f209803c78c4f2cda11b13818a57f01c872)
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