Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/luna68k/luna68k Change the previous decision.
details: https://anonhg.NetBSD.org/src/rev/dc994dc2f320
branches: trunk
changeset: 481217:dc994dc2f320
user: nisimura <nisimura%NetBSD.org@localhost>
date: Tue Jan 25 00:19:30 2000 +0000
description:
Change the previous decision.
NetBSD/luna68k (1) creates UniOS/ISI label with BSD label embedded
at offset 64, (2) reads BSD label if found, (2) falls back to
reading UniOS/ISI label when no BSD label is found. Plus, (4)
reads SunOS label if found in place of UniOS/ISI label.
diffstat:
sys/arch/luna68k/luna68k/disksubr.c | 149 +++++++++++++++++++++--------------
1 files changed, 87 insertions(+), 62 deletions(-)
diffs (truncated from 319 to 300 lines):
diff -r f52fc7adc253 -r dc994dc2f320 sys/arch/luna68k/luna68k/disksubr.c
--- a/sys/arch/luna68k/luna68k/disksubr.c Mon Jan 24 23:24:16 2000 +0000
+++ b/sys/arch/luna68k/luna68k/disksubr.c Tue Jan 25 00:19:30 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: disksubr.c,v 1.3 2000/01/18 19:43:02 thorpej Exp $ */
+/* $NetBSD: disksubr.c,v 1.4 2000/01/25 00:19:30 nisimura Exp $ */
/*
* Copyright (c) 1994, 1995 Gordon W. Ross
@@ -53,9 +53,47 @@
#include <dev/sun/disklabel.h>
+/*
+ * UniOS disklabel (== ISI disklabel) is very similar to SunOS.
+ * SunOS UniOS/ISI
+ * text 128 128
+ * (pad) 292 294
+ * rpm 2 -
+ * pcyl 2 badchk 2
+ * sparecyl 2 maxblk 4
+ * (pad) 4 dtype 2
+ * interleave 2 ndisk 2
+ * ncyl 2 2
+ * acyl 2 2
+ * ntrack 2 2
+ * nsect 2 2
+ * (pad) 4 bhead 2
+ * - ppart 2
+ * dkpart[8] 64 64
+ * magic 2 2
+ * cksum 2 2
+ *
+ * Magic number value and checksum calculation are identical. Subtil
+ * difference is partition start address; UniOS/ISI maintains sector
+ * numbers while SunOS label has cylinder number.
+ *
+ * It is found that LUNA Mach2.5 has BSD label embedded at offset 64
+ * retaining UniOS/ISI label at the end of label block. LUNA Mach
+ * manipulates BSD disklabel in the same manner as 4.4BSD. It's
+ * uncertain LUNA Mach can create a disklabel on fresh disks;
+ * writedisklabel fails when no BSD label is found.
+ *
+ * NetBSD/luna68k (1) creates UniOS/ISI label with BSD label
+ * embedded at offset 64, (2) reads BSD label if found, (2) falls
+ * back to reading UniOS/ISI label when no BSD label is found. Plus,
+ * (4) reads SunOS label if found in place of UniOS/ISI label.
+ */
+
/* XXX encoding of disk minor numbers, should be elsewhere... */
#define dkpart(dev) (minor(dev) & 7)
+#define b_cylin b_resid
+
#if LABELSECTOR != 0
#error "Default value of LABELSECTOR no longer zero?"
#endif
@@ -101,7 +139,7 @@
/* next, dig out disk label */
bp->b_dev = dev;
bp->b_blkno = LABELSECTOR;
- bp->b_cylinder = 0;
+ bp->b_cylin = 0;
bp->b_bcount = lp->d_secsize;
bp->b_flags = B_BUSY | B_READ;
(*strat)(bp);
@@ -117,21 +155,22 @@
if (error)
return ("disk label read error");
- /* Check for a UniOS-B disk label (for PROM compatibility). */
+ /* Check for a NetBSD disk label first. */
+ dlp = (struct disklabel *)(clp->cd_block + LABELOFFSET);
+ if (dlp->d_magic == DISKMAGIC && dlp->d_magic2 == DISKMAGIC) {
+ if (dkcksum(dlp) == 0) {
+ *lp = *dlp; /* struct assignment */
+ return (NULL);
+ }
+ printf("NetBSD disk label corrupted");
+ }
+
+ /* Check for a UniOS/ISI disk label. */
slp = (struct sun_disklabel *)clp->cd_block;
if (slp->sl_magic == SUN_DKMAGIC) {
return (disklabel_om_to_bsd(clp->cd_block, lp));
}
- /* Check for a NetBSD disk label (PROM can not boot it). */
- dlp = (struct disklabel *)(clp->cd_block + LABELOFFSET);
- if (dlp->d_magic == DISKMAGIC) {
- if (dkcksum(dlp))
- return ("NetBSD disk label corrupted");
- *lp = *dlp; /* struct assignment */
- return (NULL);
- }
-
memset(clp->cd_block, 0, sizeof(clp->cd_block));
return ("no disk label");
}
@@ -152,7 +191,7 @@
/* sanity clause */
if ((nlp->d_secpercyl == 0) || (nlp->d_secsize == 0) ||
(nlp->d_secsize % DEV_BSIZE) != 0)
- return(EINVAL);
+ return (EINVAL);
/* special case to allow disklabel to be invalidated */
if (nlp->d_magic == 0xffffffff) {
@@ -173,7 +212,7 @@
opp = &olp->d_partitions[i];
npp = &nlp->d_partitions[i];
if (npp->p_offset != opp->p_offset ||
- npp->p_size < opp->p_size)
+ npp->p_size < opp->p_size)
return (EBUSY);
}
@@ -195,19 +234,16 @@
struct cpu_disklabel *clp;
{
struct buf *bp;
+ struct disklabel *dlp;
int error;
+ /* implant NetBSD disklabel at LABELOFFSET. */
+ dlp = (struct disklabel *)(clp->cd_block + LABELOFFSET);
+ *dlp = *lp; /* struct assignment */
+
error = disklabel_bsd_to_om(lp, clp->cd_block);
if (error)
- return(error);
-
-#if 0 /* XXX - Allow writing NetBSD disk labels? */
- {
- struct disklabel *dlp;
- dlp = (struct disklabel *)(clp->cd_block + LABELOFFSET);
- *dlp = *lp; /* struct assignment */
- }
-#endif
+ return (error);
/* Get a buffer and copy the new label into it. */
bp = geteblk((int)lp->d_secsize);
@@ -216,7 +252,7 @@
/* Write out the updated label. */
bp->b_dev = dev;
bp->b_blkno = LABELSECTOR;
- bp->b_cylinder = 0;
+ bp->b_cylin = 0;
bp->b_bcount = lp->d_secsize;
bp->b_flags = B_WRITE;
(*strat)(bp);
@@ -259,7 +295,7 @@
/* if exactly at end of disk, return an EOF */
if (bp->b_blkno == maxsz) {
bp->b_resid = bp->b_bcount;
- return(0);
+ return (0);
}
/* or truncate if part of it fits */
sz = maxsz - bp->b_blkno;
@@ -271,12 +307,12 @@
}
/* calculate cylinder for disksort to order transfers with */
- bp->b_cylinder = (bp->b_blkno + p->p_offset) / lp->d_secpercyl;
- return(1);
+ bp->b_cylin = (bp->b_blkno + p->p_offset) / lp->d_secpercyl;
+ return (1);
bad:
bp->b_flags |= B_ERROR;
- return(-1);
+ return (-1);
}
/*
@@ -314,7 +350,7 @@
};
/*
- * Given a UniOS-B disk label, set lp to a BSD disk label.
+ * Given a UniOS/ISI disk label, set lp to a BSD disk label.
* Returns NULL on success, else an error string.
*
* The BSD label is cleared out before this is called.
@@ -339,17 +375,9 @@
while (sp1 < sp2)
cksum ^= *sp1++;
if (cksum != 0)
- return ("UniOS-B disk label, bad checksum");
+ return ("UniOS disk label, bad checksum");
memset((caddr_t)lp, 0, sizeof(struct disklabel));
-
-#if 1
- if (sl->sl_rpm == 0) {
- /* it's a UniOS disk */
- strcpy(lp->d_typename, "UniOS label !!!");
- }
-#endif
-
/* Format conversion. */
lp->d_magic = DISKMAGIC;
lp->d_magic2 = DISKMAGIC;
@@ -365,17 +393,16 @@
lp->d_secpercyl = secpercyl;
lp->d_secperunit = secpercyl * sl->sl_ncylinders;
- lp->d_sparespercyl = 0; /* XXX */
+ lp->d_sparespercyl = 0; /* no way to know */
lp->d_acylinders = sl->sl_acylinders;
- lp->d_rpm = (sl->sl_rpm == 0) ? 3600 : sl->sl_rpm;/* XXX */
- lp->d_interleave = sl->sl_interleave; /* XXX */
+ lp->d_rpm = sl->sl_rpm; /* UniOS - (empty) */
+ lp->d_interleave = sl->sl_interleave; /* UniOS - ndisk */
-#if 1
if (sl->sl_rpm == 0) {
/* UniOS label has blkoffset, not cyloffset */
secpercyl = 1;
}
-#endif
+
lp->d_npartitions = 8;
/* These are as defined in <ufs/ffs/fs.h> */
lp->d_bbsize = 8192; /* XXX */
@@ -405,24 +432,26 @@
}
}
}
-#if 1
- if (sl->sl_rpm == 0) {
- /* Make UniOS rootfs usable as part b */
+
+ /*
+ * XXX BandAid XXX
+ * UniOS rootfs sits on part c which don't begin at sect 0,
+ * and impossible to mount. Thus, make it usable as part b.
+ */
+ if (sl->sl_rpm == 0 && lp->d_partitions[2].p_offset != 0) {
lp->d_partitions[1] = lp->d_partitions[2];
lp->d_partitions[1].p_fstype = FS_BSDFFS;
}
-#endif
- lp->d_checksum = 0;
lp->d_checksum = dkcksum(lp);
return (NULL);
}
/*
- * Given a BSD disk label, update the Sun disklabel
+ * Given a BSD disk label, update the UniOS disklabel
* pointed to by cp with the new info. Note that the
- * Sun disklabel may have other info we need to keep.
+ * UniOS disklabel may have other info we need to keep.
* Returns zero or error code.
*/
static int
@@ -433,38 +462,32 @@
struct sun_disklabel *sl;
struct partition *npp;
struct sun_dkpart *spp;
- int i, secpercyl;
+ int i;
u_short cksum, *sp1, *sp2;
if (lp->d_secsize != 512)
return (EINVAL);
sl = (struct sun_disklabel *)cp;
-#if 1
- if (sl->sl_rpm == 0) {
- /* Never change UniOS label */
- return (EPERM);
- }
-#endif
+
/* Format conversion. */
memcpy(sl->sl_text, lp->d_packname, sizeof(lp->d_packname));
- sl->sl_rpm = lp->d_rpm;
+ sl->sl_rpm = 0; /* UniOS */
+#if 0 /* leave as was */
sl->sl_pcyl = lp->d_ncylinders + lp->d_acylinders; /* XXX */
sl->sl_sparespercyl = lp->d_sparespercyl;
+#endif
sl->sl_interleave = lp->d_interleave;
sl->sl_ncylinders = lp->d_ncylinders;
sl->sl_acylinders = lp->d_acylinders;
sl->sl_ntracks = lp->d_ntracks;
sl->sl_nsectors = lp->d_nsectors;
- secpercyl = sl->sl_nsectors * sl->sl_ntracks;
for (i = 0; i < 8; i++) {
spp = &sl->sl_part[i];
npp = &lp->d_partitions[i];
- if (npp->p_offset % secpercyl)
Home |
Main Index |
Thread Index |
Old Index