diff options
author | jkh <jkh@FreeBSD.org> | 1999-01-29 11:39:24 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1999-01-29 11:39:24 +0000 |
commit | 4468350ab5fb6237575234729953ae5eee073e36 (patch) | |
tree | 7b87f6c8596847408c5349936b4523762b22a35a | |
parent | d5f0625dc51c4fe1f64677e63d3fc482992a9c25 (diff) | |
download | FreeBSD-src-4468350ab5fb6237575234729953ae5eee073e36.zip FreeBSD-src-4468350ab5fb6237575234729953ae5eee073e36.tar.gz |
More support for Alpha installs.
Submitted by: dfr
-rw-r--r-- | lib/libdisk/disk.c | 64 | ||||
-rw-r--r-- | lib/libdisk/tst01.c | 4 | ||||
-rw-r--r-- | lib/libdisk/write_disk.c | 12 |
3 files changed, 76 insertions, 4 deletions
diff --git a/lib/libdisk/disk.c b/lib/libdisk/disk.c index 4d6deaf..8ac28e2 100644 --- a/lib/libdisk/disk.c +++ b/lib/libdisk/disk.c @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $Id: disk.c,v 1.38 1998/10/06 11:57:08 dfr Exp $ + * $Id: disk.c,v 1.39 1998/12/19 18:48:33 phk Exp $ * */ @@ -143,6 +143,7 @@ Int_Open_Disk(const char *name, u_long size) {} #endif +#ifdef __i386__ for(i=BASE_SLICE;i<ds.dss_nslices;i++) { char sname[20]; chunk_e ce; @@ -241,6 +242,67 @@ Int_Open_Disk(const char *name, u_long size) } } } +#endif /* __i386__ */ +#ifdef __alpha__ + { + struct disklabel dl; + char pname[20]; + int j,k; + + strcpy(pname,"/dev/r"); + strcat(pname,name); + j = open(pname,O_RDONLY); + if (j < 0) { +#ifdef DEBUG + warn("open(%s)",pname); +#endif + goto nolabel; + } + k = ioctl(j,DIOCGDINFO,&dl); + if (k < 0) { +#ifdef DEBUG + warn("ioctl(%s,DIOCGDINFO)",pname); +#endif + close(j); + goto nolabel; + } + close(j); + All_FreeBSD(d, 1); + + for(j=0; j <= dl.d_npartitions; j++) { + if (j == RAW_PART) + continue; + if (j == 3) + continue; + if (j == dl.d_npartitions) { + j = 3; + dl.d_npartitions=0; + } + if (!dl.d_partitions[j].p_size) + continue; + if (dl.d_partitions[j].p_size + + dl.d_partitions[j].p_offset > + ds.dss_slices[WHOLE_DISK_SLICE].ds_size) + continue; + sprintf(pname,"%s%c",name,j+'a'); + if (Add_Chunk(d, + dl.d_partitions[j].p_offset, + dl.d_partitions[j].p_size, + pname,part, + dl.d_partitions[j].p_fstype, + 0) && j != 3) +#ifdef DEBUG + warn( + "Failed to add chunk for partition %c [%lu,%lu]", + j + 'a',dl.d_partitions[j].p_offset, + dl.d_partitions[j].p_size); +#else + {} +#endif + } + nolabel:; + } +#endif /* __alpha__ */ close(fd); Fixup_Names(d); Bios_Limit_Chunk(d->chunks,1024*d->bios_hd*d->bios_sect); diff --git a/lib/libdisk/tst01.c b/lib/libdisk/tst01.c index f1fb5eb..280106a 100644 --- a/lib/libdisk/tst01.c +++ b/lib/libdisk/tst01.c @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $Id$ + * $Id: tst01.c,v 1.21 1997/02/22 15:06:39 peter Exp $ * */ @@ -252,10 +252,12 @@ main(int argc, char **argv) Set_Boot_Mgr(d,mbr); continue; } +#ifndef __alpha__ /* don't think this compiles on i386 either */ if (!strcasecmp(*cmds,"boot")) { Set_Boot_Blocks(d,boot1,boot2); continue; } +#endif if (!strcasecmp(*cmds,"write")) { printf("Write=%d\n", Write_Disk(d)); diff --git a/lib/libdisk/write_disk.c b/lib/libdisk/write_disk.c index b27d17b..088b323 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.24 1998/10/27 21:14:03 msmith Exp $ + * $Id: write_disk.c,v 1.25 1999/01/08 00:32:19 jkh Exp $ * */ @@ -64,7 +64,11 @@ Write_FreeBSD(int fd, struct disk *new, struct disk *old, struct chunk *c1) for(c2=c1->part;c2;c2=c2->next) { if (c2->type == unused) continue; if (!strcmp(c2->name,"X")) continue; +#ifdef __alpha__ + j = c2->name[strlen(c2->name) - 1] - 'a'; +#else j = c2->name[strlen(new->name) + 2] - 'a'; +#endif if (j < 0 || j >= MAXPARTITIONS || j == RAW_PART) { #ifdef DEBUG warn("Weird parititon letter %c",c2->name[strlen(new->name) + 2]); @@ -180,16 +184,19 @@ Write_Disk(struct disk *d1) for (c1=d1->chunks->part; c1 ; c1 = c1->next) { if (c1->type == unused) continue; if (!strcmp(c1->name,"X")) continue; +#ifndef __alpha__ j = c1->name[4] - '1'; j = c1->name[strlen(d1->name) + 1] - '1'; if (j < 0 || j > 3) continue; s[j]++; +#endif if (c1->type == extended) ret += Write_Extended(fd, d1,old,c1); if (c1->type == freebsd) ret += Write_FreeBSD(fd, d1,old,c1); +#ifndef __alpha__ Write_Int32(&dp[j].dp_start, c1->offset); Write_Int32(&dp[j].dp_size, c1->size); @@ -237,7 +244,9 @@ Write_Disk(struct disk *d1) dp[j].dp_flag = 0x80; else dp[j].dp_flag = 0; +#endif } +#ifndef __alpha__ j = 0; for(i=0;i<NDOSPART;i++) { if (!s[i]) @@ -250,7 +259,6 @@ Write_Disk(struct disk *d1) if (dp[i].dp_typ == 0xa5) dp[i].dp_flag = 0x80; -#ifndef __alpha__ mbr = read_block(fd,WHERE(0,d1)); if (d1->bootmgr) memcpy(mbr,d1->bootmgr,DOSPARTOFF); |