From 042bc5be352d06950e780705d2384ddeb964d232 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 8 May 2012 16:30:18 +0200 Subject: [PATCH] disk/format, 9boot: fix alignment issues --- sys/src/boot/pc/fat.c | 59 +++++++++++++++++------------------ sys/src/cmd/disk/format.c | 65 ++++++++++++++++++++------------------- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/sys/src/boot/pc/fat.c b/sys/src/boot/pc/fat.c index 2e5a6f26f..f27e847e7 100644 --- a/sys/src/boot/pc/fat.c +++ b/sys/src/boot/pc/fat.c @@ -16,6 +16,7 @@ enum { typedef struct File File; typedef struct Dir Dir; typedef struct Pbs Pbs; +typedef struct Pbs32 Pbs32; typedef struct Fat Fat; struct Fat @@ -75,34 +76,30 @@ struct Pbs uchar nheads[2]; uchar nhidden[4]; uchar bigvolsize[4]; - union - { - struct - { - uchar driveno; - uchar reserved0; - uchar bootsig; - uchar volid[4]; - uchar label[11]; - uchar type[8]; - }; - struct - { - uchar fatsize[4]; - uchar flags[2]; - uchar ver[2]; - uchar rootclust[4]; - uchar fsinfo[2]; - uchar bootbak[2]; - uchar reserved0[12]; - uchar driveno; - uchar reserved1; - uchar bootsig; - uchar volid[4]; - uchar label[11]; - uchar type[8]; - } fat32; - }; + uchar driveno; + uchar reserved0; + uchar bootsig; + uchar volid[4]; + uchar label[11]; + uchar type[8]; +}; + +struct Pbs32 +{ + uchar common[36]; + uchar fatsize[4]; + uchar flags[2]; + uchar ver[2]; + uchar rootclust[4]; + uchar fsinfo[2]; + uchar bootbak[2]; + uchar reserved0[12]; + uchar driveno; + uchar reserved1; + uchar bootsig; + uchar volid[4]; + uchar label[11]; + uchar type[8]; }; int readsect(ulong drive, ulong lba, void *buf); @@ -278,14 +275,14 @@ conffat(Fat *fat, void *buf) if(GETSHORT(p->sectsize) != Sectsz) return -1; - if(memcmp(p->type, "FAT", 3) && memcmp(p->fat32.type, "FAT", 3)) + if(memcmp(p->type, "FAT", 3) && memcmp(((Pbs32*)buf)->type, "FAT", 3)) return -1; /* load values from fat */ ver = 0; fatsize = GETSHORT(p->fatsize); if(fatsize == 0){ - fatsize = GETLONG(p->fat32.fatsize); + fatsize = GETLONG(((Pbs32*)buf)->fatsize); ver = Fat32; } volsize = GETSHORT(p->volsize); @@ -310,7 +307,7 @@ conffat(Fat *fat, void *buf) fat->dirstart = fat->fatlba + fatsize * p->nfats; if(ver == Fat32){ fat->datalba = fat->dirstart; - fat->dirstart = GETLONG(p->fat32.rootclust); + fat->dirstart = GETLONG(((Pbs32*)buf)->rootclust); fat->eofmark = 0xffffff7; }else{ fat->datalba = fat->dirstart + dirsize; diff --git a/sys/src/cmd/disk/format.c b/sys/src/cmd/disk/format.c index 18c0c6379..0c07e464f 100644 --- a/sys/src/cmd/disk/format.c +++ b/sys/src/cmd/disk/format.c @@ -45,31 +45,31 @@ struct Dosboot{ uchar nheads[2]; uchar nhidden[4]; uchar bigvolsize[4]; - union { - struct { - uchar driveno; - uchar reserved0; - uchar bootsig; - uchar volid[4]; - uchar label[11]; - uchar type[8]; - }; - struct { - uchar fatsize[4]; - uchar flags[2]; - uchar ver[2]; - uchar rootclust[4]; - uchar fsinfo[2]; - uchar bootbak[2]; - uchar reserved0[12]; - uchar driveno; - uchar reserved1; - uchar bootsig; - uchar volid[4]; - uchar label[11]; - uchar type[8]; - } fat32; - }; + uchar driveno; + uchar reserved0; + uchar bootsig; + uchar volid[4]; + uchar label[11]; + uchar type[8]; +}; + +typedef struct Dosboot32 Dosboot32; +struct Dosboot32 +{ + uchar common[36]; + uchar fatsize[4]; + uchar flags[2]; + uchar ver[2]; + uchar rootclust[4]; + uchar fsinfo[2]; + uchar bootbak[2]; + uchar reserved0[12]; + uchar driveno; + uchar reserved1; + uchar bootsig; + uchar volid[4]; + uchar label[11]; + uchar type[8]; }; #define PUTSHORT(p, v) { (p)[1] = (v)>>8; (p)[0] = (v); } @@ -604,12 +604,15 @@ if(chatty) print("try %d fatbits => %d clusters of %d\n", fatbits, clusters, clu sprint(r, "FAT%d ", fatbits); if(fatbits == 32){ - PUTLONG(b->fat32.fatsize, fatsecs); - PUTLONG(b->fat32.rootclust, 2); - b->fat32.bootsig = 0x29; - b->fat32.driveno = (t->media == 0xF8) ? getdriveno(disk) : 0; - memmove(b->fat32.label, label, sizeof(b->fat32.label)); - memmove(b->fat32.type, r, sizeof(b->fat32.type)); + Dosboot32 *bb; + + bb = (Dosboot32*)buf; + PUTLONG(bb->fatsize, fatsecs); + PUTLONG(bb->rootclust, 2); + bb->bootsig = 0x29; + bb->driveno = (t->media == 0xF8) ? getdriveno(disk) : 0; + memmove(bb->label, label, sizeof(bb->label)); + memmove(bb->type, r, sizeof(bb->type)); } else { b->bootsig = 0x29; b->driveno = (t->media == 0xF8) ? getdriveno(disk) : 0;