From: Tom Rini From Peter Wahl PPC32: Fix the mkprep util to work correctly on Solaris 8. - There is a very odd problem with the alignment of dword_t values which causes this program to not work correctly when compiled on Solaris 8. The workaround is not use a pointer and to memcpy the values instead. 25-akpm/arch/ppc/boot/utils/mkprep.c | 30 ++++++++++++++++-------------- 1 files changed, 16 insertions(+), 14 deletions(-) diff -puN arch/ppc/boot/utils/mkprep.c~ppc-mkprep-solaris-fix arch/ppc/boot/utils/mkprep.c --- 25/arch/ppc/boot/utils/mkprep.c~ppc-mkprep-solaris-fix Tue Dec 23 14:34:55 2003 +++ 25-akpm/arch/ppc/boot/utils/mkprep.c Tue Dec 23 14:35:43 2003 @@ -12,12 +12,14 @@ * -- Cort * * Modified for x86 hosted builds by Matt Porter + * Modified for Sparc hosted builds by Peter Wahl */ #include #include #include #include +#include #include #include @@ -147,7 +149,7 @@ int main(int argc, char *argv[]) void write_prep_partition(int in, int out) { unsigned char block[512]; - partition_entry_t *pe = (partition_entry_t *)&block[0x1BE]; + partition_entry_t pe; dword_t *entry = (dword_t *)&block[0]; dword_t *length = (dword_t *)&block[sizeof(long)]; struct stat info; @@ -177,8 +179,8 @@ void write_prep_partition(int in, int ou * Build a "PReP" partition table entry in the boot record * - "PReP" may only look at the system_indicator */ - pe->boot_indicator = BootActive; - pe->system_indicator = SystemPrep; + pe.boot_indicator = BootActive; + pe.system_indicator = SystemPrep; /* * The first block of the diskette is used by this "boot record" which * actually contains the partition table. (The first block of the @@ -186,12 +188,12 @@ void write_prep_partition(int in, int ou * one partition on the diskette and it shall contain the rest of the * diskette. */ - pe->starting_head = 0; /* zero-based */ - pe->starting_sector = 2; /* one-based */ - pe->starting_cylinder = 0; /* zero-based */ - pe->ending_head = 1; /* assumes two heads */ - pe->ending_sector = 18; /* assumes 18 sectors/track */ - pe->ending_cylinder = 79; /* assumes 80 cylinders/diskette */ + pe.starting_head = 0; /* zero-based */ + pe.starting_sector = 2; /* one-based */ + pe.starting_cylinder = 0; /* zero-based */ + pe.ending_head = 1; /* assumes two heads */ + pe.ending_sector = 18; /* assumes 18 sectors/track */ + pe.ending_cylinder = 79; /* assumes 80 cylinders/diskette */ /* * The "PReP" software ignores the above fields and just looks at @@ -201,20 +203,20 @@ void write_prep_partition(int in, int ou * - unlike the above sector numbers, the beginning sector is zero-based! */ #if 0 - pe->beginning_sector = cpu_to_le32(1); + pe.beginning_sector = cpu_to_le32(1); #else /* This has to be 0 on the PowerStack? */ #ifdef __i386__ - pe->beginning_sector = 0; + pe.beginning_sector = 0; #else - pe->beginning_sector = cpu_to_le32(0); + pe.beginning_sector = cpu_to_le32(0); #endif /* __i386__ */ #endif #ifdef __i386__ - pe->number_of_sectors = 2*18*80-1; + pe.number_of_sectors = 2*18*80-1; #else - pe->number_of_sectors = cpu_to_le32(2*18*80-1); + pe.number_of_sectors = cpu_to_le32(2*18*80-1); #endif /* __i386__ */ write( out, block, sizeof(block) ); _