christos@ wrote: > On Nov 14, 3:00am, tsut...@ceres.dti.ne.jp (Izumi Tsutsui) wrote:
> | "Test it (or call for testers) before commit" > | because installboot could be fatal on install floppy and bootstrap. > | > | > but memcpy is the only way. > | > | - cast via (void *) > > That does not work. > > | - union {uint16_t w[256]; struct bootblock bbp;} > > That works... How about this one? (cksum seems updated properly on the real machine) --- installboot/installboot.c 2014-11-14 13:21:10.000000000 +0900 +++ installboot/installboot.c 2014-11-14 23:03:28.000000000 +0900 @@ -467,7 +467,10 @@ struct disklabel *label, u_int magic) { int fd; - uint16_t sum; + union { + struct bootblock *bbp; + uint16_t *word; /* to fill cksum word */ + } bbsec; memset(bb, 0, sizeof(*bb)); @@ -499,10 +502,9 @@ setIDEpar(bb->bb_xxboot, sizeof(bb->bb_xxboot)); /* set AHDI checksum */ - sum = 0; - memcpy(bb->bb_xxboot + 255 * sizeof(sum), &sum, sizeof(sum)); - sum = 0x1234 - abcksum(bb->bb_xxboot); - memcpy(bb->bb_xxboot + 255 * sizeof(sum), &sum, sizeof(sum)); + bbsec.bbp = bb; + bbsec.word[255] = 0; + bbsec.word[255] = 0x1234 - abcksum(bb->bb_xxboot); if (verbose) { printf("Primary boot loader: %s\n", xxb); --- Izumi Tsutsui