1 #include "arnold_boot.h"
6 fprintf (stderr, "Fatal Error:%s\n", msg);
10 #define order(x) ((x&0xff)<<24 | (x&0xff00) << 8 | (x&0xff0000) >>8 | (x&0xff000000)>>24)
11 #define swap(x) ((x&0xff)<<8 | (x&0xff00)>>8)
17 main (int argc, char *argv[])
19 union bootblock block0;
23 memset ((void *) &block0, 0, sizeof (block0));
24 strcpy (block0.boot.magic, ARNOLDMAGIC);
26 error ("Bad Number of args:\n"
27 " Usage: gen_boot [-d[n]][-w][-r][-x filename] exec_adr nseg base1 len1 [base len]");
29 if (strncmp (argv[1], "-d",2) == 0)
31 /* Set debugging to value (default 1) */
32 if ( argv[1][2] == 0 ) {
33 block0.boot.debuggit = swap(1);
35 block0.boot.debuggit = swap(argv[1][2] - '0');
40 if (strcmp (argv[1], "-w") == 0)
42 block0.boot.writesmart = swap(WRITE_SMART_MAGIC);
46 if (strcmp (argv[1], "-r") == 0)
48 block0.boot.writesmart = swap(REBOOT_MAGIC); /* Try to reboot ram image */
52 if (strcmp (argv[1], "-x") == 0)
54 block0.boot.extrafile=swap(EXTRA_BOOT);
55 strncpy (block0.boot.otherfile,argv[2],sizeof(block0.boot.otherfile));
60 block0.boot.exec_adr = order (strtoul (argv[1], &ep, 0));
61 if (ep != 0 && *ep != 0)
63 error ("Exec_addr ?");
67 nseg = strtoul (argv[1], &ep, 0);
68 block0.boot.nosegs = order (nseg);
69 if (ep != 0 && *ep != 0)
71 error ("Number of Segments ?");
76 argc--; /* Start from index 0 */
77 if (argc != (nseg * 2))
79 error ("Wrong number of arguments");
81 for (nseg = 0; (nseg * 2) < argc; nseg++)
83 block0.boot.lseg[nseg].base = (void *) order (strtoul (argv[nseg * 2], &ep, 0));
84 if (ep != 0 && *ep != 0)
86 error ("Base addr of Segment ?");
88 block0.boot.lseg[nseg].len = order (strtoul (argv[nseg * 2 + 1], &ep, 0));
89 if (ep != 0 && *ep != 0)
91 error ("Length of Segment ?");
94 fwrite((void *) &block0, sizeof(block0), 1, stdout);
96 // write (1, block0, sizeof (block0));