Hi list, I have hardware where the LBA boot fails with "ERR R". Forcing CHS mode allows me to boot the hardware just fine.
To make life easier, I have added an option "-c" to installboot. This option sets the global symbol "_force_chs" to 1 in biosboot to save me from pressing shift at start up. Regards, Florian P.S.: A comment in biosboot.S actually suggested a "-c" option. Index: installboot.8 =================================================================== RCS file: /cvs/src/sys/arch/i386/stand/installboot/installboot.8,v retrieving revision 1.29 diff -u -p -u -r1.29 installboot.8 --- installboot.8 6 Mar 2010 16:16:43 -0000 1.29 +++ installboot.8 21 Jan 2014 17:24:59 -0000 @@ -33,7 +33,7 @@ .Nd installs a bootstrap on an FFS disk or partition .Sh SYNOPSIS .Nm installboot -.Op Fl nv +.Op Fl cnv .Ar boot .Ar biosboot .Ar disk @@ -52,6 +52,8 @@ Various filesystem parameters are also p .Pp The options are as follows: .Bl -tag -width flag_opt +.It Fl c +Force CHS mode in biosboot. .It Fl n Do not actually write anything on the disk. .It Fl v Index: installboot.c =================================================================== RCS file: /cvs/src/sys/arch/i386/stand/installboot/installboot.c,v retrieving revision 1.70 diff -u -p -u -r1.70 installboot.c --- installboot.c 13 Nov 2013 04:11:34 -0000 1.70 +++ installboot.c 21 Jan 2014 17:24:59 -0000 @@ -75,7 +75,7 @@ struct sym_data { }; extern char *__progname; -int verbose, nowrite = 0; +int verbose, nowrite = 0, forcechs = 0; char *boot, *proto, *dev, *realdev; char *protostore; long protosize; @@ -87,6 +87,7 @@ struct sym_data pbr_symbols[] = { {"_inodeblk", 4}, {"_inodedbl", 4}, {"_nblocks", 2}, + {"_force_chs", 1}, {NULL} }; @@ -113,7 +114,7 @@ static void sr_installpbr(int, int, int) static void usage(void) { - fprintf(stderr, "usage: %s [-nv] boot biosboot device\n", __progname); + fprintf(stderr, "usage: %s [-cnv] boot biosboot device\n", __progname); exit(1); } @@ -130,8 +131,12 @@ main(int argc, char *argv[]) int devfd; struct disklabel dl; - while ((c = getopt(argc, argv, "vn")) != -1) { + while ((c = getopt(argc, argv, "cnv")) != -1) { switch (c) { + case 'c': + /* Force CHS mode */ + forcechs = 1; + break; case 'n': /* Do not actually write the bootblock to disk. */ nowrite = 1; @@ -542,6 +547,7 @@ getbootparams(char *boot, int devfd, str sym_set_value(pbr_symbols, "_inodedbl", ((((char *)ap) - buf) + INODEOFF)); sym_set_value(pbr_symbols, "_nblocks", ndb); + sym_set_value(pbr_symbols, "_force_chs", forcechs); if (verbose) { fprintf(stderr, "%s is %d blocks x %d bytes\n", @@ -758,6 +764,7 @@ sr_installboot(int devfd) sym_set_value(pbr_symbols, "_inodeblk", inodeblk); sym_set_value(pbr_symbols, "_inodedbl", inodedbl); sym_set_value(pbr_symbols, "_nblocks", nblocks); + sym_set_value(pbr_symbols, "_force_chs", forcechs); if (verbose) fprintf(stderr, "%s is %d blocks x %d bytes\n",