]> git.lizzy.rs Git - plan9front.git/blob - sys/src/boot/zynq/boothead.c
ip/cifsd: fix missing int return type for vpack() (thanks pr)
[plan9front.git] / sys / src / boot / zynq / boothead.c
1 #include <u.h>
2 #include <libc.h>
3
4 char *data;
5 uchar head[0x8c0];
6
7 void
8 usage(void)
9 {
10         fprint(2, "usage: %s file\n", argv0);
11         exits("usage");
12 }
13
14 void
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
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
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 }