sync with i386 (MBR)
This commit is contained in:
parent
39a8a0436e
commit
5bad90bb3f
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: disksubr.c,v 1.1.1.1 1999/09/16 12:23:20 takemura Exp $ */
|
/* $NetBSD: disksubr.c,v 1.2 1999/10/11 05:29:04 shin Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1982, 1986, 1988 Regents of the University of California.
|
* Copyright (c) 1982, 1986, 1988 Regents of the University of California.
|
||||||
@ -39,34 +39,22 @@
|
|||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
#include <sys/buf.h>
|
#include <sys/buf.h>
|
||||||
#include <sys/disklabel.h>
|
#include <sys/disklabel.h>
|
||||||
#include <sys/disk.h>
|
|
||||||
#include <sys/syslog.h>
|
#include <sys/syslog.h>
|
||||||
|
|
||||||
#include "opt_mbr.h"
|
#include "opt_mbr.h"
|
||||||
|
|
||||||
#define b_cylin b_resid
|
#define b_cylin b_resid
|
||||||
|
|
||||||
#define MBRSIGOFS 0x1fe
|
int fat_types[] = { MBR_PTYPE_FAT12, MBR_PTYPE_FAT16S,
|
||||||
static char mbrsig[2] = {0x55, 0xaa};
|
MBR_PTYPE_FAT16B, MBR_PTYPE_FAT32,
|
||||||
|
MBR_PTYPE_FAT32L, MBR_PTYPE_FAT16L,
|
||||||
int fat_types[] = { DOSPTYP_FAT12, DOSPTYP_FAT16S,
|
|
||||||
DOSPTYP_FAT16B, DOSPTYP_FAT32,
|
|
||||||
DOSPTYP_FAT32L, DOSPTYP_FAT16L,
|
|
||||||
-1 };
|
-1 };
|
||||||
|
|
||||||
#define NO_MBR_SIGNATURE ((struct dos_partition *) -1)
|
#define NO_MBR_SIGNATURE ((struct mbr_partition *) -1)
|
||||||
|
|
||||||
static struct dos_partition *
|
static struct mbr_partition *
|
||||||
mbr_findslice __P((struct dos_partition* dp, struct buf *bp));
|
mbr_findslice __P((struct mbr_partition* dp, struct buf *bp));
|
||||||
|
|
||||||
/* For bootstrapping / device */
|
|
||||||
void
|
|
||||||
dk_establish(dk, dev)
|
|
||||||
struct disk *dk;
|
|
||||||
struct device *dev;
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scan MBR for NetBSD partittion. Return NO_MBR_SIGNATURE if no MBR found
|
* Scan MBR for NetBSD partittion. Return NO_MBR_SIGNATURE if no MBR found
|
||||||
@ -74,24 +62,26 @@ dk_establish(dk, dev)
|
|||||||
* partition is found, return a pointer to it; else return NULL.
|
* partition is found, return a pointer to it; else return NULL.
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
struct dos_partition*
|
struct mbr_partition *
|
||||||
mbr_findslice(dp, bp)
|
mbr_findslice(dp, bp)
|
||||||
struct dos_partition *dp;
|
struct mbr_partition *dp;
|
||||||
struct buf *bp;
|
struct buf *bp;
|
||||||
{
|
{
|
||||||
struct dos_partition *ourdp = NULL;
|
struct mbr_partition *ourdp = NULL;
|
||||||
|
u_int16_t *mbrmagicp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* XXX "there has to be a better check than this." */
|
/* Note: Magic number is little-endian. */
|
||||||
if (memcmp(bp->b_data + MBRSIGOFS, mbrsig, sizeof(mbrsig)))
|
mbrmagicp = (u_int16_t *)(bp->b_data + MBR_MAGICOFF);
|
||||||
|
if (*mbrmagicp != MBR_MAGIC)
|
||||||
return (NO_MBR_SIGNATURE);
|
return (NO_MBR_SIGNATURE);
|
||||||
|
|
||||||
/* XXX how do we check veracity/bounds of this? */
|
/* XXX how do we check veracity/bounds of this? */
|
||||||
memcpy(dp, bp->b_data + DOSPARTOFF, NDOSPART * sizeof(*dp));
|
memcpy(dp, bp->b_data + MBR_PARTOFF, NMBRPART * sizeof(*dp));
|
||||||
|
|
||||||
/* look for NetBSD partition */
|
/* look for NetBSD partition */
|
||||||
for (i = 0; i < NDOSPART; i++) {
|
for (i = 0; i < NMBRPART; i++) {
|
||||||
if (dp[i].dp_typ == DOSPTYP_NETBSD) {
|
if (dp[i].mbrp_typ == MBR_PTYPE_NETBSD) {
|
||||||
ourdp = &dp[i];
|
ourdp = &dp[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -100,8 +90,8 @@ mbr_findslice(dp, bp)
|
|||||||
#ifdef COMPAT_386BSD_MBRPART
|
#ifdef COMPAT_386BSD_MBRPART
|
||||||
/* didn't find it -- look for 386BSD partition */
|
/* didn't find it -- look for 386BSD partition */
|
||||||
if (!ourdp) {
|
if (!ourdp) {
|
||||||
for (i = 0; i < NDOSPART; i++) {
|
for (i = 0; i < NMBRPART; i++) {
|
||||||
if (dp[i].dp_typ == DOSPTYP_386BSD) {
|
if (dp[i].mbrp_typ == MBR_PTYPE_386BSD) {
|
||||||
printf("WARNING: old BSD partition ID!\n");
|
printf("WARNING: old BSD partition ID!\n");
|
||||||
ourdp = &dp[i];
|
ourdp = &dp[i];
|
||||||
/*
|
/*
|
||||||
@ -142,7 +132,7 @@ readdisklabel(dev, strat, lp, osdep)
|
|||||||
struct disklabel *lp;
|
struct disklabel *lp;
|
||||||
struct cpu_disklabel *osdep;
|
struct cpu_disklabel *osdep;
|
||||||
{
|
{
|
||||||
struct dos_partition *dp;
|
struct mbr_partition *dp;
|
||||||
struct partition *pp;
|
struct partition *pp;
|
||||||
struct dkbad *bdp;
|
struct dkbad *bdp;
|
||||||
struct buf *bp;
|
struct buf *bp;
|
||||||
@ -185,10 +175,10 @@ readdisklabel(dev, strat, lp, osdep)
|
|||||||
dp = osdep->dosparts;
|
dp = osdep->dosparts;
|
||||||
|
|
||||||
/* read master boot record */
|
/* read master boot record */
|
||||||
bp->b_blkno = DOSBBSECTOR;
|
bp->b_blkno = MBR_BBSECTOR;
|
||||||
bp->b_bcount = lp->d_secsize;
|
bp->b_bcount = lp->d_secsize;
|
||||||
bp->b_flags = B_BUSY | B_READ;
|
bp->b_flags = B_BUSY | B_READ;
|
||||||
bp->b_cylin = DOSBBSECTOR / lp->d_secpercyl;
|
bp->b_cylin = MBR_BBSECTOR / lp->d_secpercyl;
|
||||||
(*strat)(bp);
|
(*strat)(bp);
|
||||||
|
|
||||||
/* if successful, wander through dos partition table */
|
/* if successful, wander through dos partition table */
|
||||||
@ -196,44 +186,47 @@ readdisklabel(dev, strat, lp, osdep)
|
|||||||
msg = "dos partition I/O error";
|
msg = "dos partition I/O error";
|
||||||
goto done;
|
goto done;
|
||||||
} else {
|
} else {
|
||||||
struct dos_partition *ourdp = NULL;
|
struct mbr_partition *ourdp = NULL;
|
||||||
|
|
||||||
ourdp = mbr_findslice(dp, bp);
|
ourdp = mbr_findslice(dp, bp);
|
||||||
if (ourdp == NO_MBR_SIGNATURE)
|
if (ourdp == NO_MBR_SIGNATURE)
|
||||||
goto nombrpart;
|
goto nombrpart;
|
||||||
|
|
||||||
for (i = 0; i < NDOSPART; i++, dp++) {
|
for (i = 0; i < NMBRPART; i++, dp++) {
|
||||||
/* Install in partition e, f, g, or h. */
|
/* Install in partition e, f, g, or h. */
|
||||||
pp = &lp->d_partitions[RAW_PART + 1 + i];
|
pp = &lp->d_partitions[RAW_PART + 1 + i];
|
||||||
pp->p_offset = dp->dp_start;
|
pp->p_offset = dp->mbrp_start;
|
||||||
pp->p_size = dp->dp_size;
|
pp->p_size = dp->mbrp_size;
|
||||||
for (ip = fat_types; *ip != -1; ip++) {
|
for (ip = fat_types; *ip != -1; ip++) {
|
||||||
if (dp->dp_typ == *ip)
|
if (dp->mbrp_typ == *ip)
|
||||||
pp->p_fstype = FS_MSDOS;
|
pp->p_fstype = FS_MSDOS;
|
||||||
}
|
}
|
||||||
if (dp->dp_typ == DOSPTYP_LNXEXT2)
|
if (dp->mbrp_typ == MBR_PTYPE_LNXEXT2)
|
||||||
pp->p_fstype = FS_EX2FS;
|
pp->p_fstype = FS_EX2FS;
|
||||||
|
|
||||||
|
if (dp->mbrp_typ == MBR_PTYPE_NTFS)
|
||||||
|
pp->p_fstype = FS_NTFS;
|
||||||
|
|
||||||
/* is this ours? */
|
/* is this ours? */
|
||||||
if (dp == ourdp) {
|
if (dp == ourdp) {
|
||||||
/* need sector address for SCSI/IDE,
|
/* need sector address for SCSI/IDE,
|
||||||
cylinder for ESDI/ST506/RLL */
|
cylinder for ESDI/ST506/RLL */
|
||||||
dospartoff = dp->dp_start;
|
dospartoff = dp->mbrp_start;
|
||||||
cyl = DPCYL(dp->dp_scyl, dp->dp_ssect);
|
cyl = MBR_PCYL(dp->mbrp_scyl, dp->mbrp_ssect);
|
||||||
|
|
||||||
/* update disklabel with details */
|
/* update disklabel with details */
|
||||||
lp->d_partitions[2].p_size =
|
lp->d_partitions[2].p_size =
|
||||||
dp->dp_size;
|
dp->mbrp_size;
|
||||||
lp->d_partitions[2].p_offset =
|
lp->d_partitions[2].p_offset =
|
||||||
dp->dp_start;
|
dp->mbrp_start;
|
||||||
#if 0
|
#if 0
|
||||||
if (lp->d_ntracks != dp->dp_ehd + 1 ||
|
if (lp->d_ntracks != dp->mbrp_ehd + 1 ||
|
||||||
lp->d_nsectors != DPSECT(dp->dp_esect)) {
|
lp->d_nsectors != DPSECT(dp->mbrp_esect)) {
|
||||||
printf("disklabel: BIOS sees chs %d/%d/%d as ",
|
printf("disklabel: BIOS sees chs %d/%d/%d as ",
|
||||||
lp->d_ncylinders, lp->d_ntracks,
|
lp->d_ncylinders, lp->d_ntracks,
|
||||||
lp->d_nsectors);
|
lp->d_nsectors);
|
||||||
lp->d_ntracks = dp->dp_ehd + 1;
|
lp->d_ntracks = dp->mbrp_ehd + 1;
|
||||||
lp->d_nsectors = DPSECT(dp->dp_esect);
|
lp->d_nsectors = DPSECT(dp->mbrp_esect);
|
||||||
lp->d_secpercyl = lp->d_ntracks * lp->d_nsectors;
|
lp->d_secpercyl = lp->d_ntracks * lp->d_nsectors;
|
||||||
lp->d_ncylinders = lp->d_secperunit / lp->d_secpercyl;
|
lp->d_ncylinders = lp->d_secperunit / lp->d_secpercyl;
|
||||||
if (! lp->d_ncylinders)
|
if (! lp->d_ncylinders)
|
||||||
@ -389,7 +382,7 @@ writedisklabel(dev, strat, lp, osdep)
|
|||||||
struct disklabel *lp;
|
struct disklabel *lp;
|
||||||
struct cpu_disklabel *osdep;
|
struct cpu_disklabel *osdep;
|
||||||
{
|
{
|
||||||
struct dos_partition *dp;
|
struct mbr_partition *dp;
|
||||||
struct buf *bp;
|
struct buf *bp;
|
||||||
struct disklabel *dlp;
|
struct disklabel *dlp;
|
||||||
int error, dospartoff, cyl;
|
int error, dospartoff, cyl;
|
||||||
@ -406,14 +399,14 @@ writedisklabel(dev, strat, lp, osdep)
|
|||||||
dp = osdep->dosparts;
|
dp = osdep->dosparts;
|
||||||
|
|
||||||
/* read master boot record */
|
/* read master boot record */
|
||||||
bp->b_blkno = DOSBBSECTOR;
|
bp->b_blkno = MBR_BBSECTOR;
|
||||||
bp->b_bcount = lp->d_secsize;
|
bp->b_bcount = lp->d_secsize;
|
||||||
bp->b_flags = B_BUSY | B_READ;
|
bp->b_flags = B_BUSY | B_READ;
|
||||||
bp->b_cylin = DOSBBSECTOR / lp->d_secpercyl;
|
bp->b_cylin = MBR_BBSECTOR / lp->d_secpercyl;
|
||||||
(*strat)(bp);
|
(*strat)(bp);
|
||||||
|
|
||||||
if ((error = biowait(bp)) == 0) {
|
if ((error = biowait(bp)) == 0) {
|
||||||
struct dos_partition *ourdp = NULL;
|
struct mbr_partition *ourdp = NULL;
|
||||||
|
|
||||||
ourdp = mbr_findslice(dp, bp);
|
ourdp = mbr_findslice(dp, bp);
|
||||||
if (ourdp == NO_MBR_SIGNATURE)
|
if (ourdp == NO_MBR_SIGNATURE)
|
||||||
@ -422,8 +415,8 @@ writedisklabel(dev, strat, lp, osdep)
|
|||||||
if (ourdp) {
|
if (ourdp) {
|
||||||
/* need sector address for SCSI/IDE,
|
/* need sector address for SCSI/IDE,
|
||||||
cylinder for ESDI/ST506/RLL */
|
cylinder for ESDI/ST506/RLL */
|
||||||
dospartoff = ourdp->dp_start;
|
dospartoff = ourdp->mbrp_start;
|
||||||
cyl = DPCYL(ourdp->dp_scyl, ourdp->dp_ssect);
|
cyl = MBR_PCYL(ourdp->mbrp_scyl, ourdp->mbrp_ssect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -520,3 +513,12 @@ bad:
|
|||||||
done:
|
done:
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For bootstrapping / device */
|
||||||
|
void
|
||||||
|
dk_establish(dk, dev)
|
||||||
|
struct disk *dk;
|
||||||
|
struct device *dev;
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: disklabel.h,v 1.1.1.1 1999/09/16 12:23:22 takemura Exp $ */
|
/* $NetBSD: disklabel.h,v 1.2 1999/10/11 05:29:05 shin Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994 Christopher G. Demetriou
|
* Copyright (c) 1994 Christopher G. Demetriou
|
||||||
@ -38,47 +38,15 @@
|
|||||||
#define MAXPARTITIONS 8 /* number of partitions */
|
#define MAXPARTITIONS 8 /* number of partitions */
|
||||||
#define RAW_PART 3 /* raw partition: XX?d (XXX) */
|
#define RAW_PART 3 /* raw partition: XX?d (XXX) */
|
||||||
|
|
||||||
/* DOS partition table -- located in boot block */
|
/* Pull in MBR partition definitions. */
|
||||||
#define DOSBBSECTOR 0 /* DOS boot block relative sector # */
|
#include <sys/disklabel_mbr.h>
|
||||||
#define DOSPARTOFF 446
|
|
||||||
#define NDOSPART 4
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
|
||||||
struct dos_partition {
|
|
||||||
u_int8_t dp_flag; /* bootstrap flags */
|
|
||||||
u_int8_t dp_shd; /* starting head */
|
|
||||||
u_int8_t dp_ssect; /* starting sector */
|
|
||||||
u_int8_t dp_scyl; /* starting cylinder */
|
|
||||||
u_int8_t dp_typ; /* partition type (see below) */
|
|
||||||
u_int8_t dp_ehd; /* end head */
|
|
||||||
u_int8_t dp_esect; /* end sector */
|
|
||||||
u_int8_t dp_ecyl; /* end cylinder */
|
|
||||||
u_int32_t dp_start; /* absolute starting sector number */
|
|
||||||
u_int32_t dp_size; /* partition size in sectors */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Known DOS partition types. */
|
|
||||||
#define DOSPTYP_NETBSD 0xa9 /* NetBSD partition type */
|
|
||||||
#define DOSPTYP_386BSD 0xa5 /* 386BSD partition type */
|
|
||||||
#define DOSPTYP_FAT12 0x01 /* 12-bit FAT */
|
|
||||||
#define DOSPTYP_FAT16S 0x04 /* 16-bit FAT, less than 32M */
|
|
||||||
#define DOSPTYP_FAT16B 0x06 /* 16-bit FAT, more than 32M */
|
|
||||||
#define DOSPTYP_FAT32 0x0b /* 32-bit FAT */
|
|
||||||
#define DOSPTYP_FAT32L 0x0c /* 32-bit FAT, LBA-mapped */
|
|
||||||
#define DOSPTYP_FAT16L 0x0e /* 16-bit FAT, LBA-mapped */
|
|
||||||
#define DOSPTYP_LNXEXT2 0x83 /* Linux native */
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
#ifndef __ASSEMBLER__
|
||||||
#include <sys/dkbad.h>
|
#include <sys/dkbad.h>
|
||||||
struct cpu_disklabel {
|
struct cpu_disklabel {
|
||||||
struct dos_partition dosparts[NDOSPART];
|
struct mbr_partition dosparts[NMBRPART];
|
||||||
struct dkbad bad;
|
struct dkbad bad;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Isolate the relevant bits to get sector and cylinder. */
|
|
||||||
#define DPSECT(s) ((s) & 0x3f)
|
|
||||||
#define DPCYL(c, s) ((c) + (((s) & 0xc0) << 2))
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
|
Loading…
Reference in New Issue
Block a user