From owner-p4-projects Sun Mar 24 7: 8: 0 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 92FF637B400; Sun, 24 Mar 2002 07:07:35 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 7FD9F37B417 for ; Sun, 24 Mar 2002 07:07:33 -0800 (PST) Received: (from perforce@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g2OF7X755460 for perforce@freebsd.org; Sun, 24 Mar 2002 07:07:33 -0800 (PST) (envelope-from phk@freebsd.org) Date: Sun, 24 Mar 2002 07:07:33 -0800 (PST) Message-Id: <200203241507.g2OF7X755460@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to phk@freebsd.org using -f From: Poul-Henning Kamp Subject: PERFORCE change 8333 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://people.freebsd.org/~peter/p4db/chv.cgi?CH=8333 Change 8333 by phk@phk_flat on 2002/03/24 07:07:08 IFC Affected files ... ... //depot/projects/sparc64/sys/conf/Makefile.sparc64#33 edit ... //depot/projects/sparc64/sys/geom/geom_bsd.c#3 integrate Differences ... ==== //depot/projects/sparc64/sys/conf/Makefile.sparc64#33 (text+ko) ==== @@ -1,7 +1,7 @@ # Makefile.sparc64 -- with config changes. # Copyright 1990 W. Jolitz # from: @(#)Makefile.i386 7.1 5/10/91 -# $FreeBSD: src/sys/conf/Makefile.sparc64,v 1.17 2002/03/15 08:21:41 obrien Exp $ +# $FreeBSD: src/sys/conf/Makefile.sparc64,v 1.15 2002/02/20 23:35:51 peter Exp $ # # Makefile for FreeBSD # @@ -16,8 +16,23 @@ # after which config should be rerun for all machines. # + +.if ${MACHINE_ARCH} == i386 +TOOLPATH= /arch/sparc64/uberbaum/bin +TOOLPREFIX= sparc64-deo-freebsd5- +AR= ${TOOLPATH}/${TOOLPREFIX}ar +CC= ${TOOLPATH}/${TOOLPREFIX}gcc +LD= ${TOOLPATH}/${TOOLPREFIX}ld +NM= ${TOOLPATH}/${TOOLPREFIX}nm +OBJCOPY= ${TOOLPATH}/${TOOLPREFIX}objcopy +OBJDUMP= ${TOOLPATH}/${TOOLPREFIX}objdump +RANLIB= ${TOOLPATH}/${TOOLPREFIX}ranlib +SIZE= ${TOOLPATH}/${TOOLPREFIX}size + +COPT+= -B${TOOLPATH}/ +.endif + MACHINE_ARCH= sparc64 - NO_CPU_COPTFLAGS=true CWARNFLAGS= -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes \ ==== //depot/projects/sparc64/sys/geom/geom_bsd.c#3 (text+ko) ==== @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/geom/geom_bsd.c,v 1.3 2002/03/17 18:57:49 phk Exp $ + * $FreeBSD: src/sys/geom/geom_bsd.c,v 1.4 2002/03/24 14:27:31 phk Exp $ */ @@ -65,6 +65,129 @@ }; static void +g_bsd_ledec_partition(u_char *ptr, struct partition *d) +{ + d->p_size = g_dec_le4(ptr + 0); + d->p_offset = g_dec_le4(ptr + 4); + d->p_fsize = g_dec_le4(ptr + 8); + d->p_fstype = ptr[12]; + d->p_frag = ptr[13]; + d->p_cpg = g_dec_le2(ptr + 14); +} + +static void +g_bsd_ledec_disklabel(u_char *ptr, struct disklabel *d) +{ + d->d_magic = g_dec_le4(ptr + 0); + d->d_type = g_dec_le2(ptr + 4); + d->d_subtype = g_dec_le2(ptr + 6); + bcopy(ptr + 8, d->d_typename, 16); + bcopy(d->d_packname, ptr + 24, 16); + d->d_secsize = g_dec_le4(ptr + 40); + d->d_nsectors = g_dec_le4(ptr + 44); + d->d_ntracks = g_dec_le4(ptr + 48); + d->d_ncylinders = g_dec_le4(ptr + 52); + d->d_secpercyl = g_dec_le4(ptr + 56); + d->d_secperunit = g_dec_le4(ptr + 60); + d->d_sparespertrack = g_dec_le2(ptr + 64); + d->d_sparespercyl = g_dec_le2(ptr + 66); + d->d_acylinders = g_dec_le4(ptr + 68); + d->d_rpm = g_dec_le2(ptr + 72); + d->d_interleave = g_dec_le2(ptr + 74); + d->d_trackskew = g_dec_le2(ptr + 76); + d->d_cylskew = g_dec_le2(ptr + 78); + d->d_headswitch = g_dec_le4(ptr + 80); + d->d_trkseek = g_dec_le4(ptr + 84); + d->d_flags = g_dec_le4(ptr + 88); + d->d_drivedata[0] = g_dec_le4(ptr + 92); + d->d_drivedata[1] = g_dec_le4(ptr + 96); + d->d_drivedata[2] = g_dec_le4(ptr + 100); + d->d_drivedata[3] = g_dec_le4(ptr + 104); + d->d_drivedata[4] = g_dec_le4(ptr + 108); + d->d_spare[0] = g_dec_le4(ptr + 112); + d->d_spare[1] = g_dec_le4(ptr + 116); + d->d_spare[2] = g_dec_le4(ptr + 120); + d->d_spare[3] = g_dec_le4(ptr + 124); + d->d_spare[4] = g_dec_le4(ptr + 128); + d->d_magic2 = g_dec_le4(ptr + 132); + d->d_checksum = g_dec_le2(ptr + 136); + d->d_npartitions = g_dec_le2(ptr + 138); + d->d_bbsize = g_dec_le4(ptr + 140); + d->d_sbsize = g_dec_le4(ptr + 144); + g_bsd_ledec_partition(ptr + 148, &d->d_partitions[0]); + g_bsd_ledec_partition(ptr + 164, &d->d_partitions[1]); + g_bsd_ledec_partition(ptr + 180, &d->d_partitions[2]); + g_bsd_ledec_partition(ptr + 196, &d->d_partitions[3]); + g_bsd_ledec_partition(ptr + 212, &d->d_partitions[4]); + g_bsd_ledec_partition(ptr + 228, &d->d_partitions[5]); + g_bsd_ledec_partition(ptr + 244, &d->d_partitions[6]); + g_bsd_ledec_partition(ptr + 260, &d->d_partitions[7]); +} + +#if 0 +static void +g_bsd_leenc_partition(u_char *ptr, struct partition *d) +{ + g_enc_le4(ptr + 0, d->p_size); + g_enc_le4(ptr + 4, d->p_offset); + g_enc_le4(ptr + 8, d->p_fsize); + ptr[12] = d->p_fstype; + ptr[13] = d->p_frag; + g_enc_le2(ptr + 14, d->p_cpg); +} + +static void +g_bsd_leenc_disklabel(u_char *ptr, struct disklabel *d) +{ + g_enc_le4(ptr + 0, d->d_magic); + g_enc_le2(ptr + 4, d->d_type); + g_enc_le2(ptr + 6, d->d_subtype); + bcopy(d->d_typename, ptr + 8, 16); + bcopy(d->d_packname, ptr + 24, 16); + g_enc_le4(ptr + 40, d->d_secsize); + g_enc_le4(ptr + 44, d->d_nsectors); + g_enc_le4(ptr + 48, d->d_ntracks); + g_enc_le4(ptr + 52, d->d_ncylinders); + g_enc_le4(ptr + 56, d->d_secpercyl); + g_enc_le4(ptr + 60, d->d_secperunit); + g_enc_le2(ptr + 64, d->d_sparespertrack); + g_enc_le2(ptr + 66, d->d_sparespercyl); + g_enc_le4(ptr + 68, d->d_acylinders); + g_enc_le2(ptr + 72, d->d_rpm); + g_enc_le2(ptr + 74, d->d_interleave); + g_enc_le2(ptr + 76, d->d_trackskew); + g_enc_le2(ptr + 78, d->d_cylskew); + g_enc_le4(ptr + 80, d->d_headswitch); + g_enc_le4(ptr + 84, d->d_trkseek); + g_enc_le4(ptr + 88, d->d_flags); + g_enc_le4(ptr + 92, d->d_drivedata[0]); + g_enc_le4(ptr + 96, d->d_drivedata[1]); + g_enc_le4(ptr + 100, d->d_drivedata[2]); + g_enc_le4(ptr + 104, d->d_drivedata[3]); + g_enc_le4(ptr + 108, d->d_drivedata[4]); + g_enc_le4(ptr + 112, d->d_spare[0]); + g_enc_le4(ptr + 116, d->d_spare[1]); + g_enc_le4(ptr + 120, d->d_spare[2]); + g_enc_le4(ptr + 124, d->d_spare[3]); + g_enc_le4(ptr + 128, d->d_spare[4]); + g_enc_le4(ptr + 132, d->d_magic2); + g_enc_le2(ptr + 136, d->d_checksum); + g_enc_le2(ptr + 138, d->d_npartitions); + g_enc_le4(ptr + 140, d->d_bbsize); + g_enc_le4(ptr + 144, d->d_sbsize); + g_bsd_leenc_partition(ptr + 148, &d->d_partitions[0]); + g_bsd_leenc_partition(ptr + 164, &d->d_partitions[1]); + g_bsd_leenc_partition(ptr + 180, &d->d_partitions[2]); + g_bsd_leenc_partition(ptr + 196, &d->d_partitions[3]); + g_bsd_leenc_partition(ptr + 212, &d->d_partitions[4]); + g_bsd_leenc_partition(ptr + 228, &d->d_partitions[5]); + g_bsd_leenc_partition(ptr + 244, &d->d_partitions[6]); + g_bsd_leenc_partition(ptr + 260, &d->d_partitions[7]); +} + +#endif + +static void ondisk2inram(struct g_bsd_softc *sc) { struct partition *ppp; @@ -82,6 +205,66 @@ sc->inram.d_checksum = dkcksum(&sc->inram); } +/* + * It is rather fortunate that this checksum only covers up to the + * actual end of actual data, otherwise the pointer-screwup in + * alpha architectures would have been much harder to handle. + */ +static int +g_bsd_lesum(struct disklabel *dl, u_char *p) +{ + u_char *pe; + uint16_t sum; + + pe = p + 148 + 16 * dl->d_npartitions; + sum = 0; + while (p < pe) { + sum ^= g_dec_le2(p); + p += 2; + } + return (sum); +} + +static int +g_bsd_i386(struct g_consumer *cp, int secsize, struct disklabel *dl) +{ + int error; + u_char *buf; + + buf = g_read_data(cp, secsize * 1, secsize, &error); + if (buf == NULL || error != 0) + return(ENOENT); + g_bsd_ledec_disklabel(buf, dl); + if (dl->d_magic == DISKMAGIC && + dl->d_magic2 == DISKMAGIC && + g_bsd_lesum(dl, buf) == 0) + error = 0; + else + error = ENOENT; + g_free(buf); + return(error); +} + +static int +g_bsd_alpha(struct g_consumer *cp, int secsize, struct disklabel *dl) +{ + int error; + u_char *buf; + + buf = g_read_data(cp, 0, secsize, &error); + if (buf == NULL || error != 0) + return(ENOENT); + g_bsd_ledec_disklabel(buf + 64, dl); + if (dl->d_magic == DISKMAGIC && + dl->d_magic2 == DISKMAGIC && + g_bsd_lesum(dl, buf) == 0) + error = 0; + else + error = ENOENT; + g_free(buf); + return(error); +} + static int g_bsd_start(struct bio *bp) { @@ -142,7 +325,6 @@ struct g_consumer *cp; struct g_provider *pp2; int error, i, j, npart; - u_char *buf; struct g_bsd_softc *ms; struct disklabel *dl; u_int secsize; @@ -180,18 +362,12 @@ printf("g_error %d Mediasize is %lld bytes\n", error, mediasize); } - buf = g_read_data(cp, secsize * LABELSECTOR, secsize, &error); - if (buf == NULL || error != 0) + error = g_bsd_i386(cp, secsize, &ms->ondisk); + if (error) + error = g_bsd_alpha(cp, secsize, &ms->ondisk); + if (error) break; - bcopy(buf, &ms->ondisk, sizeof(ms->ondisk)); dl = &ms->ondisk; - g_free(buf); - if (dl->d_magic != DISKMAGIC) - break; - if (dl->d_magic2 != DISKMAGIC) - break; - if (dkcksum(dl) != 0) - break; if (bootverbose) g_hexdump(dl, sizeof(*dl)); if (dl->d_secsize < secsize) To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message