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