xref: /csrg-svn/sys/luna68k/stand/disklabel.c (revision 63199)
157083Sakito /*
257083Sakito  * Copyright (c) 1992 OMRON Corporation.
3*63199Sbostic  * Copyright (c) 1992, 1993
4*63199Sbostic  *	The Regents of the University of California.  All rights reserved.
557083Sakito  *
657083Sakito  * This code is derived from software contributed to Berkeley by
757083Sakito  * OMRON Corporation.
857083Sakito  *
957083Sakito  * %sccs.include.redist.c%
1057083Sakito  *
11*63199Sbostic  *	@(#)disklabel.c	8.1 (Berkeley) 06/10/93
1257083Sakito  */
1357083Sakito 
1457083Sakito /*
1557083Sakito  * disklabel.c -- operate disklabel for BSD & OMRON
1657083Sakito  * by A.Fujita, FEB-17-1992
1757083Sakito  */
1857083Sakito 
1957083Sakito #include <sys/param.h>
2057083Sakito #define DKTYPENAMES
2157083Sakito #include <sys/disklabel.h>
2257083Sakito #include <luna68k/stand/saio.h>
2357083Sakito #include <luna68k/stand/status.h>
2457083Sakito #include <luna68k/stand/omron_disklabel.h>
2557083Sakito 
2657083Sakito #define LABEL_SIZE BBSIZE
2757083Sakito 
2857083Sakito u_char lbl_buff[LABEL_SIZE];
2957083Sakito 
3057083Sakito u_short
dkcksum(lp)3157083Sakito dkcksum(lp)
3257083Sakito 	register struct disklabel *lp;
3357083Sakito {
3457083Sakito 	register u_short *start, *end;
3557083Sakito 	register u_short sum = 0;
3657083Sakito 
3757083Sakito 	start = (u_short *)lp;
3857083Sakito 	end = (u_short *)&lp->d_partitions[lp->d_npartitions];
3957083Sakito 	while (start < end)
4057083Sakito 		sum ^= *start++;
4157083Sakito 	return (sum);
4257083Sakito }
4357083Sakito 
4457083Sakito int
disklabel(argc,argv)4557083Sakito disklabel(argc, argv)
4657083Sakito 	int   argc;
4757083Sakito 	char *argv[];
4857083Sakito {
4957083Sakito 	register struct scd_dk_label *omp = (struct scd_dk_label *) lbl_buff;
5057083Sakito 	register struct disklabel    *bp  = (struct disklabel *)omp->dkl_pad;
5157083Sakito 	register struct fs *fp = (struct fs *) lbl_buff;
5257083Sakito 	register u_short *p;
5357083Sakito 	register u_long chksum, count;
5457083Sakito 	register char *q;
5557083Sakito 	register int i, j;
5657083Sakito 
5757083Sakito 	if (argc < 2) {
5857083Sakito 		printf("This command is required sub command !!\n");
5957083Sakito 		return(ST_ERROR);
6057083Sakito 	}
6157083Sakito 
6257083Sakito 	if (!strcmp(argv[1], "help")) {
6357083Sakito 		printf("Subcommand of disklabel\n\n");
6457083Sakito 		printf("\thelp:\t\tthis command\n");
6557083Sakito 		printf("\tread:\t\tread disklabel from scsi_device\n");
6657083Sakito 		printf("\twrite:\t\twrite disklabel to scsi_device\n");
6757083Sakito 		printf("\tomron:\t\tshow OMRON disklabel infomation\n");
6857083Sakito 		printf("\tbsd:\t\tshow BSD disklabel infomation\n");
6957083Sakito 		printf("\tcopy:\t\tcopy disklabel infomation from OMRON to BSD\n");
7057083Sakito 		printf("\tchecksum:\tdoing checksum\n");
7157083Sakito 		printf("\tset:\t\tchange BSD disklabel infomation\n");
7257083Sakito 		printf("\n\n");
7357083Sakito 	} else if (!strcmp(argv[1], "read")) {
7457083Sakito 		if (scsi_read( 0, lbl_buff, LABEL_SIZE)) {
7557083Sakito 			printf("Disk Label read done.\n");
7657083Sakito 		} else {
7757083Sakito 			printf("Disk Label read error !!\n");
7857083Sakito 		}
7957083Sakito 	} else if (!strcmp(argv[1], "omron")) {
8057083Sakito 		i  = (int) &omp->dkl_badchk;
8157083Sakito 		i -= (int) lbl_buff;
8257083Sakito 		printf("Offset = %d\n", i);
8357083Sakito 		printf("\n");
8457083Sakito 		printf("Checksum of Bad Track:\t0x%x\n",	omp->dkl_badchk);
8557083Sakito 		printf("Logical Block Total:\t%d(0x%x)\n",	omp->dkl_maxblk, omp->dkl_maxblk);
8657083Sakito 		printf("Disk Drive Type:\t0x%x\n",		omp->dkl_dtype);
8757083Sakito 		printf("Number of Disk Drives:\t%d(0x%x)\n",	omp->dkl_ndisk, omp->dkl_ndisk);
8857083Sakito 		printf("Number of Data Cylinders:\t%d(0x%x)\n",	omp->dkl_ncyl, omp->dkl_ncyl);
8957083Sakito 		printf("Number of Alternate Cylinders:\t%d(0x%x)\n",
9057083Sakito 		       omp->dkl_acyl,omp->dkl_acyl);
9157083Sakito 		printf("Number of Heads in This Partition:\t%d(0x%x)\n",
9257083Sakito 		       omp->dkl_nhead, omp->dkl_nhead);
9357083Sakito 		printf("Number of 512 byte Sectors per Track:\t%d(0x%x)\n",
9457083Sakito 		       omp->dkl_nsect, omp->dkl_nsect);
9557083Sakito 		printf("Identifies Proper Label Locations:\t0x%x\n",
9657083Sakito 		       omp->dkl_bhead);
9757083Sakito 		printf("Physical Partition Number:\t%d(0x%x)\n",
9857083Sakito 		       omp->dkl_ppart, omp->dkl_ppart);
9957083Sakito 		for (i = 0; i < NLPART; i++)
10057083Sakito 			printf("\t%d:\t%d\t%d\n", i,
10157083Sakito 			       omp->dkl_map[i].dkl_blkno, omp->dkl_map[i].dkl_nblk);
10257083Sakito 		printf("Identifies This Label Format:\t0x%x\n",	omp->dkl_magic);
10357083Sakito 		printf("XOR Checksum of Sector:\t0x%x\n",	omp->dkl_cksum);
10457083Sakito 	} else if (!strcmp(argv[1], "checksum")) {
10557083Sakito 		if (omp->dkl_magic == DKL_MAGIC){
10657083Sakito 							/* checksum of disk-label */
10757083Sakito 			chksum = 0;
10857083Sakito 			count = sizeof(struct scd_dk_label) / sizeof(short int);
10957083Sakito 			for (p= (u_short *) lbl_buff; count > 0; count--) {
11057083Sakito 				if (count == 1)
11157083Sakito 					printf("Check Sum: 0x%x\n", chksum);
11257083Sakito 				chksum ^= *p++;
11357083Sakito 			}
11457083Sakito 
11557083Sakito 			printf("dkl_cksum: 0x%x\n", omp->dkl_cksum);
11657083Sakito 
11757083Sakito 			if (chksum != 0) {
11857083Sakito 				printf("OMRON Disklabel check sum error.\n");
11957083Sakito 			}
12057083Sakito 		} else {
12157083Sakito 			printf("OMRON Disklabel not found.\n");
12257083Sakito 		}
12357083Sakito 	} else if (!strcmp(argv[1], "copy")) {
12457083Sakito 		bzero(bp, sizeof(struct disklabel));
12557083Sakito 
12657083Sakito 		bcopy(lbl_buff, bp->d_typename, 16);
12757083Sakito 
12857083Sakito 		bp->d_secsize    = DEV_BSIZE;
12957083Sakito 		bp->d_nsectors   = 38;
13057083Sakito 		bp->d_ntracks    = 12;
13157083Sakito 		bp->d_ncylinders = 1076;
13257083Sakito 
13357083Sakito 		bp->d_type  = DTYPE_SCSI;
13457083Sakito 
13557083Sakito 		bp->d_secpercyl  = bp->d_nsectors * bp->d_ntracks;
13657083Sakito 		bp->d_secperunit = bp->d_secpercyl * bp->d_ncylinders;
13757083Sakito 		bp->d_rpm        = 3600;
13857083Sakito 		bp->d_interleave = 1;
13957083Sakito 		bp->d_trackskew  = 0;
14057083Sakito 		bp->d_cylskew    = 0;
14157083Sakito 		bp->d_headswitch = 0;
14257083Sakito 		bp->d_trkseek    = 0;
14357083Sakito 		bp->d_bbsize     = BBSIZE;
14457083Sakito 		bp->d_sbsize     = SBSIZE;
14557083Sakito 
14657083Sakito 		for (i = 0; i < MAXPARTITIONS; i++) {
14757083Sakito 			bp->d_partitions[i].p_size   = omp->dkl_map[i].dkl_nblk;
14857083Sakito 			bp->d_partitions[i].p_offset = omp->dkl_map[i].dkl_blkno;
14957083Sakito 			bp->d_partitions[i].p_fsize  = 1024;
15057083Sakito 			bp->d_partitions[i].p_frag   = 8192 / 1024;
15157083Sakito 			bp->d_partitions[i].p_fstype = FS_UNUSED;
15257083Sakito 		}
15357083Sakito 
15457083Sakito 		bp->d_npartitions = MAXPARTITIONS;
15557083Sakito 
15657083Sakito 		for (i = 0; i < NDDATA; i++) {
15757083Sakito 			bp->d_drivedata[i] = 0;
15857083Sakito 		}
15957083Sakito 
16057083Sakito 		bzero(bp->d_packname, 16);
16157083Sakito 
16257083Sakito 		bp->d_magic    = DISKMAGIC;
16357083Sakito 		bp->d_magic2   = DISKMAGIC;
16457083Sakito 		bp->d_checksum = 0;
16557083Sakito 		bp->d_checksum = dkcksum(bp);
16657083Sakito 
16757083Sakito 		/* restump checksum of OMRON disklabel */
16857083Sakito 		chksum = 0;
16957083Sakito 		count = sizeof(struct scd_dk_label) / sizeof(short int);
17057083Sakito 		for (p= (u_short *) lbl_buff; count > 1; count--) {
17157083Sakito 			chksum ^= *p++;
17257083Sakito 		}
17357083Sakito 		printf("chksum: 0x%x\n", chksum);
17457083Sakito 
17557083Sakito 		omp->dkl_cksum = chksum;
17657083Sakito 		printf("dkl_cksum: 0x%x\n", omp->dkl_cksum);
17757083Sakito 	} else if (!strcmp(argv[1], "bsd")) {
17857083Sakito 		display(bp);
17957083Sakito 	} else if (!strcmp(argv[1], "write")) {
18057083Sakito 		if (scsi_write( 0, lbl_buff, LABEL_SIZE)) {
18157083Sakito 			printf("Disk Label write done.\n");
18257083Sakito 		} else {
18357083Sakito 			printf("Disk Label write error !!\n");
18457083Sakito 		}
18557083Sakito 	} else if (!strcmp(argv[1], "set")) {
18657083Sakito 		i = (argv[2])[1] - 'a';
18757083Sakito 		for (q = argv[3], j = 0; *q != NULL; q++) {
18857083Sakito 			j = (j * 10) + (*q - '0');
18957083Sakito 		}
19057083Sakito 		switch (*argv[2]) {
19157083Sakito 		case 'b':
19257083Sakito 			bp->d_partitions[i].p_frag = j / bp->d_partitions[i].p_fsize;
19357083Sakito 			break;
19457083Sakito 		case 'f':	/* fragment size */
19557083Sakito 			bp->d_partitions[i].p_fsize = j;
19657083Sakito 			break;
19757083Sakito 		case 'o':	/* offset */
19857083Sakito 			bp->d_partitions[i].p_offset = j;
19957083Sakito 			omp->dkl_map[i].dkl_blkno = j;
20057083Sakito 			break;
20157083Sakito 		case 'p':	/* size */
20257083Sakito 			bp->d_partitions[i].p_size = j;
20357083Sakito 			omp->dkl_map[i].dkl_nblk = j;
20457083Sakito 			break;
20557083Sakito 		case 't':	/* FS type */
20657083Sakito 			bp->d_partitions[i].p_fstype = j;
20757083Sakito 			break;
20857083Sakito 		default:
20957083Sakito 			break;
21057083Sakito 		}
21157083Sakito 
21257083Sakito 		/* restump checksum of BSD disklabel */
21357083Sakito 		bp->d_checksum = 0;
21457083Sakito 		bp->d_checksum = dkcksum(bp);
21557083Sakito 
21657083Sakito 		/* restump checksum of OMRON disklabel */
21757083Sakito 		chksum = 0;
21857083Sakito 		count = sizeof(struct scd_dk_label) / sizeof(short int);
21957083Sakito 		for (p= (u_short *) lbl_buff; count > 1; count--) {
22057083Sakito 			chksum ^= *p++;
22157083Sakito 		}
22257083Sakito 		omp->dkl_cksum = chksum;
22357083Sakito 
22457083Sakito 	} else if (!strcmp(argv[1], "sb")) {
22557083Sakito #define BLOCK_SIZE	SBSIZE
22657083Sakito 
22757083Sakito 		printf("checking Super Block: block size = %d bytes, seek amount = 1 blocks\n",
22857083Sakito 			BLOCK_SIZE);
22957083Sakito 		i = j = 0;
23057083Sakito 		while(1) {
23157083Sakito 			if (!scsi_read( i, lbl_buff, BLOCK_SIZE))
23257083Sakito 			break;
23357083Sakito 
23457083Sakito 			if (fp->fs_magic == FS_MAGIC) {
23557083Sakito 				printf("%d, (%d)\n", i, i - j);
23657083Sakito 				j = i;
23757083Sakito 			}
23857083Sakito 			i++;
23957083Sakito 		}
24057083Sakito 	} else if (!strcmp(argv[1], "sbcopy")) {
24157083Sakito 		if (!scsi_read(32, lbl_buff, BLOCK_SIZE)) {
24257083Sakito 			printf("sbcopy: read failed\n");
24357083Sakito 			return(ST_ERROR);
24457083Sakito 		}
24557083Sakito 		if (scsi_write(16, lbl_buff, BLOCK_SIZE)) {
24657083Sakito 			printf("sbcopy: copy done\n");
24757083Sakito 		} else {
24857083Sakito 			printf("sbcopy: write failed\n");
24957083Sakito 		}
25057083Sakito 	}
25157083Sakito 
25257083Sakito 	return(ST_NORMAL);
25357083Sakito }
25457083Sakito 
25557083Sakito int
display(lp)25657083Sakito display(lp)
25757083Sakito 	register struct disklabel *lp;
25857083Sakito {
25957083Sakito 	register int i, j;
26057083Sakito 	register struct partition *pp;
26157083Sakito 
26257083Sakito 	if ((unsigned) lp->d_type < DKMAXTYPES)
26357083Sakito 		printf("type: %s\n", dktypenames[lp->d_type]);
26457083Sakito 	else
26557083Sakito 		printf("type: %d\n", lp->d_type);
26657083Sakito 	printf("disk: %s\n",  lp->d_typename);
26757083Sakito 	printf("label: %s\n", lp->d_packname);
26857083Sakito 	printf("flags:");
26957083Sakito 	if (lp->d_flags & D_REMOVABLE)
27057083Sakito 		printf(" removeable");
27157083Sakito 	if (lp->d_flags & D_ECC)
27257083Sakito 		printf(" ecc");
27357083Sakito 	if (lp->d_flags & D_BADSECT)
27457083Sakito 		printf(" badsect");
27557083Sakito 	printf("\n");
27657083Sakito 	printf("bytes/sector: %d\n", lp->d_secsize);
27757083Sakito 	printf("sectors/track: %d\n", lp->d_nsectors);
27857083Sakito 	printf("tracks/cylinder: %d\n", lp->d_ntracks);
27957083Sakito 	printf("sectors/cylinder: %d\n", lp->d_secpercyl);
28057083Sakito 	printf("cylinders: %d\n", lp->d_ncylinders);
28157083Sakito 	printf("rpm: %d\n", lp->d_rpm);
28257083Sakito 	printf("interleave: %d\n", lp->d_interleave);
28357083Sakito 	printf("trackskew: %d\n", lp->d_trackskew);
28457083Sakito 	printf("cylinderskew: %d\n", lp->d_cylskew);
28557083Sakito 	printf("headswitch: %d\t\t# milliseconds\n", lp->d_headswitch);
28657083Sakito 	printf("track-to-track seek: %d\t# milliseconds\n", lp->d_trkseek);
28757083Sakito 	printf("drivedata: ");
28857083Sakito 	for (i = NDDATA - 1; i >= 0; i--)
28957083Sakito 		if (lp->d_drivedata[i])
29057083Sakito 			break;
29157083Sakito 	if (i < 0)
29257083Sakito 		i = 0;
29357083Sakito 	for (j = 0; j <= i; j++)
29457083Sakito 		printf("%d ", lp->d_drivedata[j]);
29557083Sakito 	printf("\n\n%d partitions:\n", lp->d_npartitions);
29657083Sakito 	printf("#        size   offset    fstype   [fsize bsize   cpg]\n");
29757083Sakito 	pp = lp->d_partitions;
29857083Sakito 	for (i = 0; i < lp->d_npartitions; i++, pp++) {
29957083Sakito 		if (pp->p_size) {
30057083Sakito 			printf("  %c: %d %d  ", 'a' + i,
30157083Sakito 			   pp->p_size, pp->p_offset);
30257083Sakito 			if ((unsigned) pp->p_fstype < FSMAXTYPES)
30357083Sakito 				printf("%s", fstypenames[pp->p_fstype]);
30457083Sakito 			else
30557083Sakito 				printf("%d", pp->p_fstype);
30657083Sakito 			switch (pp->p_fstype) {
30757083Sakito 
30857083Sakito 			case FS_UNUSED:				/* XXX */
30957083Sakito 				printf("    %d %d %s ",
31057083Sakito 				    pp->p_fsize, pp->p_fsize * pp->p_frag, "");
31157083Sakito 				break;
31257083Sakito 
31357083Sakito 			case FS_BSDFFS:
31457083Sakito 				printf("    %d %d %d ",
31557083Sakito 				    pp->p_fsize, pp->p_fsize * pp->p_frag,
31657083Sakito 				    pp->p_cpg);
31757083Sakito 				break;
31857083Sakito 
31957083Sakito 			default:
32057083Sakito 				printf("%s", "");
32157083Sakito 				break;
32257083Sakito 			}
32357083Sakito 			printf("\t# (Cyl. %d",
32457083Sakito 			    pp->p_offset / lp->d_secpercyl);
32557083Sakito 			if (pp->p_offset % lp->d_secpercyl)
32657083Sakito 			    cnputc('*');
32757083Sakito 			else
32857083Sakito 			    cnputc(' ');
32957083Sakito 			printf("- %d",
33057083Sakito 			    (pp->p_offset +
33157083Sakito 			    pp->p_size + lp->d_secpercyl - 1) /
33257083Sakito 			    lp->d_secpercyl - 1);
33357083Sakito 			if (pp->p_size % lp->d_secpercyl)
33457083Sakito 			    cnputc('*');
33557083Sakito 			printf(")\n");
33657083Sakito 		}
33757083Sakito 	}
33857083Sakito }
339