xref: /plan9-contrib/sys/src/nboot/zynq/boothead.c (revision 529c1f209803c78c4f2cda11b13818a57f01c872)
1*529c1f20SDavid du Colombier #include <u.h>
2*529c1f20SDavid du Colombier #include <libc.h>
3*529c1f20SDavid du Colombier 
4*529c1f20SDavid du Colombier char *data;
5*529c1f20SDavid du Colombier uchar head[0x8c0];
6*529c1f20SDavid du Colombier 
7*529c1f20SDavid du Colombier void
usage(void)8*529c1f20SDavid du Colombier usage(void)
9*529c1f20SDavid du Colombier {
10*529c1f20SDavid du Colombier 	fprint(2, "usage: %s file\n", argv0);
11*529c1f20SDavid du Colombier 	exits("usage");
12*529c1f20SDavid du Colombier }
13*529c1f20SDavid du Colombier 
14*529c1f20SDavid du Colombier void
u32(int n,u32int p)15*529c1f20SDavid du Colombier u32(int n, u32int p)
16*529c1f20SDavid du Colombier {
17*529c1f20SDavid du Colombier 	head[n] = p;
18*529c1f20SDavid du Colombier 	head[n+1] = p >> 8;
19*529c1f20SDavid du Colombier 	head[n+2] = p >> 16;
20*529c1f20SDavid du Colombier 	head[n+3] = p >> 24;
21*529c1f20SDavid du Colombier }
22*529c1f20SDavid du Colombier 
23*529c1f20SDavid du Colombier u32int
gu32(int n)24*529c1f20SDavid du Colombier gu32(int n)
25*529c1f20SDavid du Colombier {
26*529c1f20SDavid du Colombier 	return head[n] | head[n+1] << 8 | head[n+2] << 16 | head[n+3] << 24;
27*529c1f20SDavid du Colombier }
28*529c1f20SDavid du Colombier 
29*529c1f20SDavid du Colombier void
main(int argc,char ** argv)30*529c1f20SDavid du Colombier main(int argc, char **argv)
31*529c1f20SDavid du Colombier {
32*529c1f20SDavid du Colombier 	int fd, sz, i;
33*529c1f20SDavid du Colombier 	u32int ck;
34*529c1f20SDavid du Colombier 
35*529c1f20SDavid du Colombier 	ARGBEGIN {
36*529c1f20SDavid du Colombier 	default:
37*529c1f20SDavid du Colombier 		usage();
38*529c1f20SDavid du Colombier 	} ARGEND;
39*529c1f20SDavid du Colombier 
40*529c1f20SDavid du Colombier 	if(argc != 1)
41*529c1f20SDavid du Colombier 		usage();
42*529c1f20SDavid du Colombier 	fd = open(argv[0], OREAD);
43*529c1f20SDavid du Colombier 	if(fd < 0)
44*529c1f20SDavid du Colombier 		sysfatal("open: %r");
45*529c1f20SDavid du Colombier 	sz = seek(fd, 0, 2);
46*529c1f20SDavid du Colombier 	if(sz < 0)
47*529c1f20SDavid du Colombier 		sysfatal("seek: %r");
48*529c1f20SDavid du Colombier 	data = malloc(sz);
49*529c1f20SDavid du Colombier 	if(data == nil)
50*529c1f20SDavid du Colombier 		sysfatal("malloc: %r");
51*529c1f20SDavid du Colombier 	seek(fd, 0, 0);
52*529c1f20SDavid du Colombier 	if(readn(fd, data, sz) < sz)
53*529c1f20SDavid du Colombier 		sysfatal("read: %r");
54*529c1f20SDavid du Colombier 	close(fd);
55*529c1f20SDavid du Colombier 	memset(head, 0, sizeof(head));
56*529c1f20SDavid du Colombier 
57*529c1f20SDavid du Colombier 	u32(0x20, 0xaa995566);
58*529c1f20SDavid du Colombier 	u32(0x24, 0x584C4E58);
59*529c1f20SDavid du Colombier 	u32(0x30, sizeof(head));
60*529c1f20SDavid du Colombier 	u32(0x34, sz);
61*529c1f20SDavid du Colombier 	u32(0x40, sz);
62*529c1f20SDavid du Colombier 	ck = 0;
63*529c1f20SDavid du Colombier 	for(i = 0x20; i < 0x48; i += 4)
64*529c1f20SDavid du Colombier 		ck += gu32(i);
65*529c1f20SDavid du Colombier 	u32(0x48, ~ck);
66*529c1f20SDavid du Colombier 	u32(0xa0, -1);
67*529c1f20SDavid du Colombier 
68*529c1f20SDavid du Colombier 	write(1, head, sizeof(head));
69*529c1f20SDavid du Colombier 	write(1, data, sz);
70*529c1f20SDavid du Colombier 	exits(nil);
71*529c1f20SDavid du Colombier }
72