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

Reply via email to