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