diff options
author | dfr <dfr@FreeBSD.org> | 1998-10-06 11:57:08 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1998-10-06 11:57:08 +0000 |
commit | b0393b65d51b5998e5ba7bab905641e9f3cea870 (patch) | |
tree | 85dca493a4452fc1877a288d27920dcbae28b54b /lib/libdisk/write_disk.c | |
parent | 0d42654efcd0ffe1ba718aa12adceba0cf2ca19b (diff) | |
download | FreeBSD-src-b0393b65d51b5998e5ba7bab905641e9f3cea870.zip FreeBSD-src-b0393b65d51b5998e5ba7bab905641e9f3cea870.tar.gz |
Teach libdisk about alpha boot blocks.
Diffstat (limited to 'lib/libdisk/write_disk.c')
-rw-r--r-- | lib/libdisk/write_disk.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/libdisk/write_disk.c b/lib/libdisk/write_disk.c index cf7e87a..6d3b2a7 100644 --- a/lib/libdisk/write_disk.c +++ b/lib/libdisk/write_disk.c @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $Id: write_disk.c,v 1.21 1998/06/27 02:01:25 jdp Exp $ + * $Id: write_disk.c,v 1.22 1998/09/30 21:40:51 jkh Exp $ * */ @@ -38,17 +38,25 @@ Write_FreeBSD(int fd, struct disk *new, struct disk *old, struct chunk *c1) int i,j; void *p; u_char buf[BBSIZE]; +#ifdef __alpha__ + u_long *lp, sum; +#endif for(i=0;i<BBSIZE/512;i++) { p = read_block(fd,WHERE(i + c1->offset,new)); memcpy(buf+512*i,p,512); free(p); } +#if defined(__i386__) if(new->boot1) memcpy(buf,new->boot1,512); if(new->boot2) memcpy(buf+512,new->boot2,BBSIZE-512); +#elif defined(__alpha__) + if(new->boot1) + memcpy(buf+512,new->boot1,BBSIZE-512); +#endif dl = (struct disklabel *) (buf+512*LABELSECTOR+LABELOFFSET); memset(dl,0,sizeof *dl); @@ -100,6 +108,15 @@ Write_FreeBSD(int fd, struct disk *new, struct disk *old, struct chunk *c1) dl->d_magic2 = DISKMAGIC; dl->d_checksum = dkcksum(dl); +#ifdef __alpha__ + /* + * Generate the bootblock checksum for the SRM console. + */ + for (lp = (u_long *)buf, i = 0, sum = 0; i < 63; i++) + sum += lp[i]; + lp[63] = sum; +#endif + for(i=0;i<BBSIZE/512;i++) { write_block(fd,WHERE(i + c1->offset,new),buf+512*i); } |