]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/packages/simpad-utilities/genboot/gen_boot.c
OE tree imported from monotone branch org.openembedded.oz354fam083 at revision 8b12e3...
[familiar-h63xx-build.git] / org.handhelds.familiar / packages / simpad-utilities / genboot / gen_boot.c
1 #include "arnold_boot.h"
2 #include <stdio.h>
3 volatile void 
4 error (char *msg)
5 {
6   fprintf (stderr, "Fatal Error:%s\n", msg);
7   exit (2);
8 }
9 #ifdef LITTLE_END
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)
12 #else
13 #define order(x)  (x)
14 #define swap(x)   (x)
15 #endif
16
17 main (int argc, char *argv[])
18 {
19   union bootblock block0;
20   char *ep;
21   int nseg;
22
23   memset ((void *) &block0, 0, sizeof (block0));
24   strcpy (block0.boot.magic, ARNOLDMAGIC);
25   if (argc < 3)
26     error ("Bad Number of args:\n"
27            " Usage: gen_boot [-d[n]][-w][-r][-x filename] exec_adr nseg base1 len1 [base len]");
28
29   if (strncmp (argv[1], "-d",2) == 0)
30     {
31         /* Set debugging to value (default 1) */
32       if ( argv[1][2] == 0 ) {
33               block0.boot.debuggit = swap(1);
34       }else{
35               block0.boot.debuggit = swap(argv[1][2] - '0');
36       }
37       argv++;
38       argc--;
39     }
40   if (strcmp (argv[1], "-w") == 0)
41     {
42       block0.boot.writesmart = swap(WRITE_SMART_MAGIC);
43       argv++;
44       argc--;
45     }
46   if (strcmp (argv[1], "-r") == 0)
47     {
48       block0.boot.writesmart = swap(REBOOT_MAGIC);  /* Try to reboot ram image */
49       argv++;
50       argc--;
51     }
52   if (strcmp (argv[1], "-x") == 0)
53     {
54       block0.boot.extrafile=swap(EXTRA_BOOT);
55       strncpy (block0.boot.otherfile,argv[2],sizeof(block0.boot.otherfile));
56
57       argv+=2;
58       argc-=2;
59     }
60   block0.boot.exec_adr = order (strtoul (argv[1], &ep, 0));
61   if (ep != 0 && *ep != 0)
62     {
63       error ("Exec_addr ?");
64     }
65   argv++;
66   argc--;
67   nseg = strtoul (argv[1], &ep, 0);
68   block0.boot.nosegs = order (nseg);
69   if (ep != 0 && *ep != 0)
70     {
71       error ("Number of Segments ?");
72     }
73   argv++;
74   argc--;
75   argv++;
76   argc--;                       /* Start from index 0 */
77   if (argc != (nseg * 2))
78     {
79       error ("Wrong number of arguments");
80     }
81   for (nseg = 0; (nseg * 2) < argc; nseg++)
82     {
83       block0.boot.lseg[nseg].base = (void *) order (strtoul (argv[nseg * 2], &ep, 0));
84       if (ep != 0 && *ep != 0)
85         {
86           error ("Base addr of Segment  ?");
87         }
88       block0.boot.lseg[nseg].len = order (strtoul (argv[nseg * 2 + 1], &ep, 0));
89       if (ep != 0 && *ep != 0)
90         {
91           error ("Length of Segment  ?");
92         }
93     }
94   fwrite((void *) &block0, sizeof(block0), 1, stdout);
95   fflush(stdout);
96 //  write (1, block0, sizeof (block0));
97
98   exit (0);
99 }