Module Name: src Committed By: bouyer Date: Sat Apr 20 09:58:24 UTC 2013
Modified Files: src/sys/arch/vax/boot/xxboot [netbsd-6]: start.S src/sys/arch/vax/include [netbsd-6]: disklabel.h src/sys/kern [netbsd-6]: sys_generic.c src/sys/sys [netbsd-6]: bootblock.h disklabel.h src/usr.sbin/installboot/arch [netbsd-6]: vax.c Log Message: Pull up following revision(s) (requested by martin in ticket #865): sys/arch/vax/include/disklabel.h: revision 1.7 sys/arch/vax/boot/xxboot/start.S: revision 1.5 sys/sys/bootblock.h: revision 1.55 sys/sys/disklabel.h: revision 1.113 usr.sbin/installboot/arch/vax.c: revision 1.14 usr.sbin/installboot/arch/vax.c: revision 1.15 sys/kern/sys_generic.c: revision 1.129 Revert VAX MAXPARTITION bump to 16, adjusting it to 12 instead. Fix bootblocks and installboot for VAX 780 and other machines booting via VMB.EXE. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.4.118.1 src/sys/arch/vax/boot/xxboot/start.S cvs rdiff -u -r1.5.8.1 -r1.5.8.2 src/sys/arch/vax/include/disklabel.h cvs rdiff -u -r1.128 -r1.128.2.1 src/sys/kern/sys_generic.c cvs rdiff -u -r1.52.14.1 -r1.52.14.2 src/sys/sys/bootblock.h cvs rdiff -u -r1.112 -r1.112.2.1 src/sys/sys/disklabel.h cvs rdiff -u -r1.13 -r1.13.8.1 src/usr.sbin/installboot/arch/vax.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/vax/boot/xxboot/start.S diff -u src/sys/arch/vax/boot/xxboot/start.S:1.4 src/sys/arch/vax/boot/xxboot/start.S:1.4.118.1 --- src/sys/arch/vax/boot/xxboot/start.S:1.4 Sun Dec 11 12:19:34 2005 +++ src/sys/arch/vax/boot/xxboot/start.S Sat Apr 20 09:58:23 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: start.S,v 1.4 2005/12/11 12:19:34 christos Exp $ */ +/* $NetBSD: start.S,v 1.4.118.1 2013/04/20 09:58:23 bouyer Exp $ */ /* * Copyright (c) 1995 Ludd, University of Lule}, Sweden. * All rights reserved. @@ -38,6 +38,7 @@ #define _LOCORE +#define __HAVE_OLD_DISKLABEL /* not automatically added due to _LOCORE */ #define OMIT_DKTYPENUMS #define OMIT_FSTYPENUMS #include "sys/disklabel.h" @@ -55,8 +56,12 @@ _C_LABEL(start): .org 0x00 # uVAX booted from TK50 starts here brb from_0x00 # continue behind dispatch-block +# At offset 0x02 we have a dual used area: VMB.EXE starts execution here, +# and uVAX-ROM looks for a pointer to a parameter block. We arrange for +# the parameter block offset to disassmble as a CASEL instructions which +# falls through to 0x08. .org 0x02 # information used by uVAX-ROM - .byte 0xcf # offset in words to identification area + .byte 0xcf # offset in words to identification area .byte 1 # this byte must be 1 .word 0 # logical block number (word swapped) .word 0 # of the secondary image @@ -74,20 +79,6 @@ from_0x00: # uVAX from TK50 from_0x08: # Any machine from VMB movzbl $4,_C_LABEL(from) # Booted from full VMB - brw start_vmb - -# the complete area reserved for label -# must be empty (i.e. filled with zeroes). -# disklabel(8) checks that before installing -# the bootblocks over existing label. - -.org LABELOFFSET - .globl _C_LABEL(romlabel) -_C_LABEL(romlabel): - .long 0 - -.org LABELOFFSET + d_end_ -start_vmb: /* * Read in block 1-15. */ @@ -102,6 +93,20 @@ start_vmb: calls $6, (%r6) # call the qio-routine brw start_uvax +# the complete area reserved for label +# must be empty (i.e. filled with zeroes). +# disklabel(8) checks that before installing +# the bootblocks over existing label. + +.org LABELOFFSET + .globl _C_LABEL(romlabel) +_C_LABEL(romlabel): + .long 0 + +.org LABELOFFSET + d_end_ +# Make sure the parameter block is past the disklabel. +# If not, the next .org would try to move backwards. + /* * Parameter block for uVAX boot. */ @@ -110,7 +115,7 @@ start_vmb: #define SILOAD 0 /* load offset (usually 0) from the default */ #define SIOFF 0x200 /* byte offset into secondary image */ -.org 0x19e +.org 0x19e # do not move, see comment earlier about CASEL .byte 0x18 # must be 0x18 .byte 0x00 # must be 0x00 (MBZ) .byte 0x00 # any value Index: src/sys/arch/vax/include/disklabel.h diff -u src/sys/arch/vax/include/disklabel.h:1.5.8.1 src/sys/arch/vax/include/disklabel.h:1.5.8.2 --- src/sys/arch/vax/include/disklabel.h:1.5.8.1 Thu Jul 5 18:16:14 2012 +++ src/sys/arch/vax/include/disklabel.h Sat Apr 20 09:58:22 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: disklabel.h,v 1.5.8.1 2012/07/05 18:16:14 riz Exp $ */ +/* $NetBSD: disklabel.h,v 1.5.8.2 2013/04/20 09:58:22 bouyer Exp $ */ /* * Copyright (c) 1994 Christopher G. Demetriou @@ -36,16 +36,24 @@ #define LABELUSESMBR 0 /* no MBR partitionning */ #define LABELSECTOR 0 /* sector containing label */ #define LABELOFFSET 64 /* offset of label in sector */ -#define MAXPARTITIONS 16 /* number of partitions */ +#define MAXPARTITIONS 12 /* number of partitions */ #define OLDMAXPARTITIONS 8 /* number of partitions before nb-6 */ #define RAW_PART 2 /* raw partition: xx?c */ +/* + * In NetBSD 6 we eroneously used a too large MAXPARTITIONS value (disklabel + * overlapped with important parts of the bootblocks and made some machines + * unbootable). + */ +#define __TMPBIGMAXPARTITIONS 16 /* compatibility with 6.0 installs */ /* * We use the highest bit of the minor number for the partition number. * This maintains backward compatibility with device nodes created before * MAXPARTITIONS was increased. + * Temporarily MAXPARTITIONS was 16, so we use that to keep compatibility + * with existing installations. */ -#define __VAX_MAXDISKS ((1 << 20) / MAXPARTITIONS) +#define __VAX_MAXDISKS ((1 << 20) / __TMPBIGMAXPARTITIONS) #define DISKUNIT(dev) ((minor(dev) / OLDMAXPARTITIONS) % __VAX_MAXDISKS) #define DISKPART(dev) ((minor(dev) % OLDMAXPARTITIONS) + \ ((minor(dev) / (__VAX_MAXDISKS * OLDMAXPARTITIONS)) * OLDMAXPARTITIONS)) Index: src/sys/kern/sys_generic.c diff -u src/sys/kern/sys_generic.c:1.128 src/sys/kern/sys_generic.c:1.128.2.1 --- src/sys/kern/sys_generic.c:1.128 Wed Jan 25 00:28:36 2012 +++ src/sys/kern/sys_generic.c Sat Apr 20 09:58:23 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_generic.c,v 1.128 2012/01/25 00:28:36 christos Exp $ */ +/* $NetBSD: sys_generic.c,v 1.128.2.1 2013/04/20 09:58:23 bouyer Exp $ */ /*- * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_generic.c,v 1.128 2012/01/25 00:28:36 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_generic.c,v 1.128.2.1 2013/04/20 09:58:23 bouyer Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -526,6 +526,12 @@ sys_ioctl(struct lwp *l, const struct sy void *data, *memp; #define STK_PARAMS 128 u_long stkbuf[STK_PARAMS/sizeof(u_long)]; +#if __TMPBIGMAXPARTITIONS > MAXPARTITIONS + size_t zero_last = 0; +#define zero_size(SZ) ((SZ)+zero_last) +#else +#define zero_size(SZ) (SZ) +#endif memp = NULL; alloc_size = 0; @@ -563,7 +569,34 @@ sys_ioctl(struct lwp *l, const struct sy * but only copyin/out the smaller amount. */ if (IOCGROUP(com) == 'd') { +#if __TMPBIGMAXPARTITIONS > MAXPARTITIONS + u_long ocom = com; +#endif u_long ncom = com ^ (DIOCGDINFO ^ DIOCGDINFO32); + +#if __TMPBIGMAXPARTITIONS > MAXPARTITIONS + /* + * Userland might use struct disklabel that is bigger than the + * the kernel version (historic accident) - alloc userland + * size and zero unused part on copyout. + */ +#define DISKLABELLENDIFF (sizeof(struct partition) \ + *(__TMPBIGMAXPARTITIONS-MAXPARTITIONS)) +#define IOCFIXUP(NIOC) ((NIOC&~(IOCPARM_MASK<<IOCPARM_SHIFT)) | \ + (IOCPARM_LEN(NIOC)-DISKLABELLENDIFF)<<IOCPARM_SHIFT) + + switch (IOCFIXUP(ocom)) { + case DIOCGDINFO: + case DIOCWDINFO: + case DIOCSDINFO: + case DIOCGDEFLABEL: + com = ncom = IOCFIXUP(ocom); + zero_last = DISKLABELLENDIFF; + size -= DISKLABELLENDIFF; + goto done; + } +#endif + switch (ncom) { case DIOCGDINFO: case DIOCWDINFO: @@ -574,6 +607,9 @@ sys_ioctl(struct lwp *l, const struct sy alloc_size = IOCPARM_LEN(DIOCGDINFO); break; } +#if __TMPBIGMAXPARTITIONS > MAXPARTITIONS + done: ; +#endif } if (size > IOCPARM_MAX) { error = ENOTTY; @@ -615,7 +651,7 @@ sys_ioctl(struct lwp *l, const struct sy * Zero the buffer so the user always * gets back something deterministic. */ - memset(data, 0, size); + memset(data, 0, zero_size(size)); } else if (com&IOC_VOID) { *(void **)data = SCARG(uap, data); } @@ -648,7 +684,8 @@ sys_ioctl(struct lwp *l, const struct sy * already set and checked above. */ if (error == 0 && (com&IOC_OUT) && size) { - error = copyout(data, SCARG(uap, data), size); + error = copyout(data, SCARG(uap, data), + zero_size(size)); ktrgenio(SCARG(uap, fd), UIO_READ, SCARG(uap, data), size, error); } Index: src/sys/sys/bootblock.h diff -u src/sys/sys/bootblock.h:1.52.14.1 src/sys/sys/bootblock.h:1.52.14.2 --- src/sys/sys/bootblock.h:1.52.14.1 Thu Jul 5 18:16:15 2012 +++ src/sys/sys/bootblock.h Sat Apr 20 09:58:23 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bootblock.h,v 1.52.14.1 2012/07/05 18:16:15 riz Exp $ */ +/* $NetBSD: bootblock.h,v 1.52.14.2 2013/04/20 09:58:23 bouyer Exp $ */ /*- * Copyright (c) 2002-2004 The NetBSD Foundation, Inc. @@ -1389,7 +1389,7 @@ struct vax_boot_block { uint8_t bb_mbone; /* must be one */ uint16_t bb_lbn_hi; /* lbn (hi word) of bootstrap */ uint16_t bb_lbn_low; /* lbn (low word) of bootstrap */ - uint8_t pad1[460]; + uint8_t pad1[406]; /* disklabel offset is 64 from base, or 56 from start of pad1 */ /* The rest of these fields are identification area and describe @@ -1412,7 +1412,7 @@ struct vax_boot_block { /* The rest is unused. */ - uint8_t pad2[20]; + uint8_t pad2[74]; } __packed; #define VAX_BOOT_MAGIC1 0x18 /* size of BB info? */ Index: src/sys/sys/disklabel.h diff -u src/sys/sys/disklabel.h:1.112 src/sys/sys/disklabel.h:1.112.2.1 --- src/sys/sys/disklabel.h:1.112 Mon Jan 16 18:47:58 2012 +++ src/sys/sys/disklabel.h Sat Apr 20 09:58:23 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: disklabel.h,v 1.112 2012/01/16 18:47:58 christos Exp $ */ +/* $NetBSD: disklabel.h,v 1.112.2.1 2013/04/20 09:58:23 bouyer Exp $ */ /* * Copyright (c) 1987, 1988, 1993 @@ -267,7 +267,7 @@ struct olddisklabel { .set d_ncylinders,52 .set d_secpercyl,56 .set d_secperunit,60 - .set d_end_,276 /* size of disk label */ + .set d_end_,148+(MAXPARTITIONS*16) #endif /* _LOCORE */ /* Index: src/usr.sbin/installboot/arch/vax.c diff -u src/usr.sbin/installboot/arch/vax.c:1.13 src/usr.sbin/installboot/arch/vax.c:1.13.8.1 --- src/usr.sbin/installboot/arch/vax.c:1.13 Sun Apr 5 11:55:39 2009 +++ src/usr.sbin/installboot/arch/vax.c Sat Apr 20 09:58:23 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: vax.c,v 1.13 2009/04/05 11:55:39 lukem Exp $ */ +/* $NetBSD: vax.c,v 1.13.8.1 2013/04/20 09:58:23 bouyer Exp $ */ /*- * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc. @@ -68,20 +68,26 @@ #include <sys/cdefs.h> #if !defined(__lint) -__RCSID("$NetBSD: vax.c,v 1.13 2009/04/05 11:55:39 lukem Exp $"); +__RCSID("$NetBSD: vax.c,v 1.13.8.1 2013/04/20 09:58:23 bouyer Exp $"); #endif /* !__lint */ #include <sys/param.h> +#include <sys/disklabel.h> #include <assert.h> #include <err.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <unistd.h> #include "installboot.h" +#ifndef __CTASSERT +#define __CTASSERT(X) +#endif + static int load_bootstrap(ib_params *, char **, uint32_t *, uint32_t *, size_t *); @@ -101,7 +107,7 @@ vax_clearboot(ib_params *params) assert(params != NULL); assert(params->fsfd != -1); assert(params->filesystem != NULL); - assert(sizeof(struct vax_boot_block) == VAX_BOOT_BLOCK_BLOCKSIZE); + __CTASSERT(sizeof(bb)==VAX_BOOT_BLOCK_BLOCKSIZE); rv = pread(params->fsfd, &bb, sizeof(bb), VAX_BOOT_BLOCK_OFFSET); if (rv == -1) { @@ -112,7 +118,7 @@ vax_clearboot(ib_params *params) return (0); } - if (bb.bb_id_offset * 2 != offsetof(struct vax_boot_block, bb_magic1) + if (bb.bb_id_offset*2 >= VAX_BOOT_BLOCK_BLOCKSIZE || bb.bb_magic1 != VAX_BOOT_MAGIC1) { warnx( "Old boot block magic number invalid; boot block invalid"); @@ -154,10 +160,10 @@ static int vax_setboot(ib_params *params) { struct stat bootstrapsb; - struct vax_boot_block bb; + struct vax_boot_block *bb; uint32_t startblock; int retval; - char *bootstrapbuf; + char *bootstrapbuf, oldbb[VAX_BOOT_BLOCK_BLOCKSIZE]; size_t bootstrapsize; uint32_t bootstrapload, bootstrapexec; ssize_t rv; @@ -167,8 +173,12 @@ vax_setboot(ib_params *params) assert(params->filesystem != NULL); assert(params->s1fd != -1); assert(params->stage1 != NULL); - assert(sizeof(struct vax_boot_block) == VAX_BOOT_BLOCK_BLOCKSIZE); + /* see sys/arch/vax/boot/xxboot/start.S for explanation */ + __CTASSERT(offsetof(struct vax_boot_block,bb_magic1) == 0x19e); + __CTASSERT(sizeof(struct vax_boot_block) == VAX_BOOT_BLOCK_BLOCKSIZE); + + startblock = 0; retval = 0; bootstrapbuf = NULL; @@ -184,16 +194,29 @@ vax_setboot(ib_params *params) &bootstrapexec, &bootstrapsize)) goto done; - rv = pread(params->fsfd, &bb, sizeof(bb), VAX_BOOT_BLOCK_OFFSET); + /* read old boot block */ + rv = pread(params->fsfd, oldbb, sizeof(oldbb), VAX_BOOT_BLOCK_OFFSET); if (rv == -1) { warn("Reading `%s'", params->filesystem); goto done; - } else if (rv != sizeof(bb)) { + } else if (rv != sizeof(oldbb)) { warnx("Reading `%s': short read", params->filesystem); goto done; } - /* fill in the updated boot block fields */ + /* + * Copy disklabel from old boot block to new. + * Assume everything between LABELOFFSET and the start of + * the param block is scratch area and can be copied over. + */ + memcpy(bootstrapbuf+LABELOFFSET, + oldbb+LABELOFFSET, + offsetof(struct vax_boot_block,bb_magic1)-LABELOFFSET); + + /* point to bootblock at begining of bootstrap */ + bb = (struct vax_boot_block*)bootstrapbuf; + + /* fill in the updated boot block fields */ if (params->flags & IB_APPEND) { struct stat filesyssb; @@ -209,46 +232,21 @@ vax_setboot(ib_params *params) } startblock = howmany(filesyssb.st_size, VAX_BOOT_BLOCK_BLOCKSIZE); - } else if (params->flags & IB_STAGE1START) { - startblock = params->s1start; - } else { - startblock = VAX_BOOT_BLOCK_OFFSET / VAX_BOOT_BLOCK_BLOCKSIZE - + 1; + bb->bb_lbn_hi = htole16((uint16_t) (startblock >> 16)); + bb->bb_lbn_low = htole16((uint16_t) (startblock >> 0)); } - bb.bb_id_offset = offsetof(struct vax_boot_block, bb_magic1) / 2; - bb.bb_mbone = 1; - bb.bb_lbn_hi = htole16((uint16_t) (startblock >> 16)); - bb.bb_lbn_low = htole16((uint16_t) (startblock >> 0)); - /* - * Now the identification block - */ - bb.bb_magic1 = VAX_BOOT_MAGIC1; - bb.bb_mbz1 = 0; - bb.bb_sum1 = ~(bb.bb_magic1 + bb.bb_mbz1 + bb.bb_pad1); - - bb.bb_mbz2 = 0; - bb.bb_volinfo = VAX_BOOT_VOLINFO_NONE; - bb.bb_pad2a = 0; - bb.bb_pad2b = 0; - - bb.bb_size = htole32(bootstrapsize / VAX_BOOT_BLOCK_BLOCKSIZE); - bb.bb_load = htole32(VAX_BOOT_LOAD); - bb.bb_entry = htole32(VAX_BOOT_ENTRY); - bb.bb_sum3 = htole32(le32toh(bb.bb_size) + le32toh(bb.bb_load) \ - + le32toh(bb.bb_entry)); - if (params->flags & IB_SUNSUM) { uint16_t sum; - sum = compute_sunsum((uint16_t *)&bb); - if (! set_sunsum(params, (uint16_t *)&bb, sum)) + sum = compute_sunsum((uint16_t *)bb); + if (! set_sunsum(params, (uint16_t *)bb, sum)) goto done; } if (params->flags & IB_VERBOSE) { printf("Bootstrap start sector: %u\n", startblock); - printf("Bootstrap sector count: %u\n", le32toh(bb.bb_size)); + printf("Bootstrap sector count: %u\n", le32toh(bb->bb_size)); printf("%sriting bootstrap\n", (params->flags & IB_NOWRITE) ? "Not w" : "W"); } @@ -256,8 +254,7 @@ vax_setboot(ib_params *params) retval = 1; goto done; } - rv = pwrite(params->fsfd, bootstrapbuf, bootstrapsize, - startblock * VAX_BOOT_BLOCK_BLOCKSIZE); + rv = pwrite(params->fsfd, bootstrapbuf, bootstrapsize, 0); if (rv == -1) { warn("Writing `%s'", params->filesystem); goto done; @@ -265,19 +262,7 @@ vax_setboot(ib_params *params) warnx("Writing `%s': short write", params->filesystem); goto done; } - - if (params->flags & IB_VERBOSE) - printf("Writing boot block\n"); - rv = pwrite(params->fsfd, &bb, sizeof(bb), VAX_BOOT_BLOCK_OFFSET); - if (rv == -1) { - warn("Writing `%s'", params->filesystem); - goto done; - } else if (rv != sizeof(bb)) { - warnx("Writing `%s': short write", params->filesystem); - goto done; - } else { - retval = 1; - } + retval = 1; done: if (bootstrapbuf)