diff options
author | Chris Larson <clarson@kergoth.com> | 2004-11-09 00:36:47 +0000 |
---|---|---|
committer | Chris Larson <clarson@kergoth.com> | 2004-11-09 00:36:47 +0000 |
commit | f96441b9faf769c9ecdd4d338b605ea3d0cc4010 (patch) | |
tree | edb17ec2c4ea13c5acb1c7350957a249a820e28d /simpad-utilities/genboot | |
parent | b6588aa6851fb220cedc387d21c51513ef8d67f4 (diff) |
Disable bk EOLN_NATIVE conversions on all files in packages FILESPATHs, to prevent it screwing up patches.
BKrev: 4190111fA4MuVozAqwE7xOSL9fr-TA
Diffstat (limited to 'simpad-utilities/genboot')
-rw-r--r-- | simpad-utilities/genboot/arnold_boot.h | 28 | ||||
-rw-r--r-- | simpad-utilities/genboot/gen_boot.c | 99 |
2 files changed, 127 insertions, 0 deletions
diff --git a/simpad-utilities/genboot/arnold_boot.h b/simpad-utilities/genboot/arnold_boot.h index e69de29bb2..7c8399ac2e 100644 --- a/simpad-utilities/genboot/arnold_boot.h +++ b/simpad-utilities/genboot/arnold_boot.h @@ -0,0 +1,28 @@ + +#define ARNOLDMAGIC "ARNOLDBOOTBLOCK" +#define MAXSEG 32 +#define WRITE_SMART_MAGIC 3141 /* write tftp data to smart */ +#define BOOT_SMART_MAGIC 9876 /* Start an Smartmedia */ +#define REBOOT_MAGIC 9123 /* restart old image ? */ +#define EXTRA_BOOT 0xdead /* Load named image */ + +struct segment { void *base; long len; }; /* len MUST be Multiple of 512 */ + +struct arnold_bootheader { + char magic[16]; + long exec_adr; + long nosegs; + struct segment lseg[MAXSEG]; + long stack_p; + short debuggit; + short writesmart; + unsigned short extrafile; + char otherfile[20]; + + char reserved[1]; /* reserved for future use */ +}; +union bootblock { + char buffer[512]; + struct arnold_bootheader boot; +}; + diff --git a/simpad-utilities/genboot/gen_boot.c b/simpad-utilities/genboot/gen_boot.c index e69de29bb2..1444f60d0b 100644 --- a/simpad-utilities/genboot/gen_boot.c +++ b/simpad-utilities/genboot/gen_boot.c @@ -0,0 +1,99 @@ +#include "arnold_boot.h" +#include <stdio.h> +volatile void +error (char *msg) +{ + fprintf (stderr, "Fatal Error:%s\n", msg); + exit (2); +} +#ifdef LITTLE_END +#define order(x) ((x&0xff)<<24 | (x&0xff00) << 8 | (x&0xff0000) >>8 | (x&0xff000000)>>24) +#define swap(x) ((x&0xff)<<8 | (x&0xff00)>>8) +#else +#define order(x) (x) +#define swap(x) (x) +#endif + +main (int argc, char *argv[]) +{ + union bootblock block0; + char *ep; + int nseg; + + memset ((void *) &block0, 0, sizeof (block0)); + strcpy (block0.boot.magic, ARNOLDMAGIC); + if (argc < 3) + error ("Bad Number of args:\n" + " Usage: gen_boot [-d[n]][-w][-r][-x filename] exec_adr nseg base1 len1 [base len]"); + + if (strncmp (argv[1], "-d",2) == 0) + { + /* Set debugging to value (default 1) */ + if ( argv[1][2] == 0 ) { + block0.boot.debuggit = swap(1); + }else{ + block0.boot.debuggit = swap(argv[1][2] - '0'); + } + argv++; + argc--; + } + if (strcmp (argv[1], "-w") == 0) + { + block0.boot.writesmart = swap(WRITE_SMART_MAGIC); + argv++; + argc--; + } + if (strcmp (argv[1], "-r") == 0) + { + block0.boot.writesmart = swap(REBOOT_MAGIC); /* Try to reboot ram image */ + argv++; + argc--; + } + if (strcmp (argv[1], "-x") == 0) + { + block0.boot.extrafile=swap(EXTRA_BOOT); + strncpy (block0.boot.otherfile,argv[2],sizeof(block0.boot.otherfile)); + + argv+=2; + argc-=2; + } + block0.boot.exec_adr = order (strtoul (argv[1], &ep, 0)); + if (ep != 0 && *ep != 0) + { + error ("Exec_addr ?"); + } + argv++; + argc--; + nseg = strtoul (argv[1], &ep, 0); + block0.boot.nosegs = order (nseg); + if (ep != 0 && *ep != 0) + { + error ("Number of Segments ?"); + } + argv++; + argc--; + argv++; + argc--; /* Start from index 0 */ + if (argc != (nseg * 2)) + { + error ("Wrong number of arguments"); + } + for (nseg = 0; (nseg * 2) < argc; nseg++) + { + block0.boot.lseg[nseg].base = (void *) order (strtoul (argv[nseg * 2], &ep, 0)); + if (ep != 0 && *ep != 0) + { + error ("Base addr of Segment ?"); + } + block0.boot.lseg[nseg].len = order (strtoul (argv[nseg * 2 + 1], &ep, 0)); + if (ep != 0 && *ep != 0) + { + error ("Length of Segment ?"); + } + } + fwrite((void *) &block0, sizeof(block0), 1, stdout); + fflush(stdout); +// write (1, block0, sizeof (block0)); + + exit (0); +} |