xref: /csrg-svn/sys/luna68k/stand/disklabel.c (revision 57083)
1*57083Sakito /*
2*57083Sakito  * Copyright (c) 1992 OMRON Corporation.
3*57083Sakito  * Copyright (c) 1992 The Regents of the University of California.
4*57083Sakito  * All rights reserved.
5*57083Sakito  *
6*57083Sakito  * This code is derived from software contributed to Berkeley by
7*57083Sakito  * OMRON Corporation.
8*57083Sakito  *
9*57083Sakito  * %sccs.include.redist.c%
10*57083Sakito  *
11*57083Sakito  *	@(#)disklabel.c	7.1 (Berkeley) 12/13/92
12*57083Sakito  */
13*57083Sakito 
14*57083Sakito /*
15*57083Sakito  * disklabel.c -- operate disklabel for BSD & OMRON
16*57083Sakito  * by A.Fujita, FEB-17-1992
17*57083Sakito  */
18*57083Sakito 
19*57083Sakito #include <sys/param.h>
20*57083Sakito #define DKTYPENAMES
21*57083Sakito #include <sys/disklabel.h>
22*57083Sakito #include <luna68k/stand/saio.h>
23*57083Sakito #include <luna68k/stand/status.h>
24*57083Sakito #include <luna68k/stand/omron_disklabel.h>
25*57083Sakito 
26*57083Sakito #define LABEL_SIZE BBSIZE
27*57083Sakito 
28*57083Sakito u_char lbl_buff[LABEL_SIZE];
29*57083Sakito 
30*57083Sakito u_short
31*57083Sakito dkcksum(lp)
32*57083Sakito 	register struct disklabel *lp;
33*57083Sakito {
34*57083Sakito 	register u_short *start, *end;
35*57083Sakito 	register u_short sum = 0;
36*57083Sakito 
37*57083Sakito 	start = (u_short *)lp;
38*57083Sakito 	end = (u_short *)&lp->d_partitions[lp->d_npartitions];
39*57083Sakito 	while (start < end)
40*57083Sakito 		sum ^= *start++;
41*57083Sakito 	return (sum);
42*57083Sakito }
43*57083Sakito 
44*57083Sakito int
45*57083Sakito disklabel(argc, argv)
46*57083Sakito 	int   argc;
47*57083Sakito 	char *argv[];
48*57083Sakito {
49*57083Sakito 	register struct scd_dk_label *omp = (struct scd_dk_label *) lbl_buff;
50*57083Sakito 	register struct disklabel    *bp  = (struct disklabel *)omp->dkl_pad;
51*57083Sakito 	register struct fs *fp = (struct fs *) lbl_buff;
52*57083Sakito 	register u_short *p;
53*57083Sakito 	register u_long chksum, count;
54*57083Sakito 	register char *q;
55*57083Sakito 	register int i, j;
56*57083Sakito 
57*57083Sakito 	if (argc < 2) {
58*57083Sakito 		printf("This command is required sub command !!\n");
59*57083Sakito 		return(ST_ERROR);
60*57083Sakito 	}
61*57083Sakito 
62*57083Sakito 	if (!strcmp(argv[1], "help")) {
63*57083Sakito 		printf("Subcommand of disklabel\n\n");
64*57083Sakito 		printf("\thelp:\t\tthis command\n");
65*57083Sakito 		printf("\tread:\t\tread disklabel from scsi_device\n");
66*57083Sakito 		printf("\twrite:\t\twrite disklabel to scsi_device\n");
67*57083Sakito 		printf("\tomron:\t\tshow OMRON disklabel infomation\n");
68*57083Sakito 		printf("\tbsd:\t\tshow BSD disklabel infomation\n");
69*57083Sakito 		printf("\tcopy:\t\tcopy disklabel infomation from OMRON to BSD\n");
70*57083Sakito 		printf("\tchecksum:\tdoing checksum\n");
71*57083Sakito 		printf("\tset:\t\tchange BSD disklabel infomation\n");
72*57083Sakito 		printf("\n\n");
73*57083Sakito 	} else if (!strcmp(argv[1], "read")) {
74*57083Sakito 		if (scsi_read( 0, lbl_buff, LABEL_SIZE)) {
75*57083Sakito 			printf("Disk Label read done.\n");
76*57083Sakito 		} else {
77*57083Sakito 			printf("Disk Label read error !!\n");
78*57083Sakito 		}
79*57083Sakito 	} else if (!strcmp(argv[1], "omron")) {
80*57083Sakito 		i  = (int) &omp->dkl_badchk;
81*57083Sakito 		i -= (int) lbl_buff;
82*57083Sakito 		printf("Offset = %d\n", i);
83*57083Sakito 		printf("\n");
84*57083Sakito 		printf("Checksum of Bad Track:\t0x%x\n",	omp->dkl_badchk);
85*57083Sakito 		printf("Logical Block Total:\t%d(0x%x)\n",	omp->dkl_maxblk, omp->dkl_maxblk);
86*57083Sakito 		printf("Disk Drive Type:\t0x%x\n",		omp->dkl_dtype);
87*57083Sakito 		printf("Number of Disk Drives:\t%d(0x%x)\n",	omp->dkl_ndisk, omp->dkl_ndisk);
88*57083Sakito 		printf("Number of Data Cylinders:\t%d(0x%x)\n",	omp->dkl_ncyl, omp->dkl_ncyl);
89*57083Sakito 		printf("Number of Alternate Cylinders:\t%d(0x%x)\n",
90*57083Sakito 		       omp->dkl_acyl,omp->dkl_acyl);
91*57083Sakito 		printf("Number of Heads in This Partition:\t%d(0x%x)\n",
92*57083Sakito 		       omp->dkl_nhead, omp->dkl_nhead);
93*57083Sakito 		printf("Number of 512 byte Sectors per Track:\t%d(0x%x)\n",
94*57083Sakito 		       omp->dkl_nsect, omp->dkl_nsect);
95*57083Sakito 		printf("Identifies Proper Label Locations:\t0x%x\n",
96*57083Sakito 		       omp->dkl_bhead);
97*57083Sakito 		printf("Physical Partition Number:\t%d(0x%x)\n",
98*57083Sakito 		       omp->dkl_ppart, omp->dkl_ppart);
99*57083Sakito 		for (i = 0; i < NLPART; i++)
100*57083Sakito 			printf("\t%d:\t%d\t%d\n", i,
101*57083Sakito 			       omp->dkl_map[i].dkl_blkno, omp->dkl_map[i].dkl_nblk);
102*57083Sakito 		printf("Identifies This Label Format:\t0x%x\n",	omp->dkl_magic);
103*57083Sakito 		printf("XOR Checksum of Sector:\t0x%x\n",	omp->dkl_cksum);
104*57083Sakito 	} else if (!strcmp(argv[1], "checksum")) {
105*57083Sakito 		if (omp->dkl_magic == DKL_MAGIC){
106*57083Sakito 							/* checksum of disk-label */
107*57083Sakito 			chksum = 0;
108*57083Sakito 			count = sizeof(struct scd_dk_label) / sizeof(short int);
109*57083Sakito 			for (p= (u_short *) lbl_buff; count > 0; count--) {
110*57083Sakito 				if (count == 1)
111*57083Sakito 					printf("Check Sum: 0x%x\n", chksum);
112*57083Sakito 				chksum ^= *p++;
113*57083Sakito 			}
114*57083Sakito 
115*57083Sakito 			printf("dkl_cksum: 0x%x\n", omp->dkl_cksum);
116*57083Sakito 
117*57083Sakito 			if (chksum != 0) {
118*57083Sakito 				printf("OMRON Disklabel check sum error.\n");
119*57083Sakito 			}
120*57083Sakito 		} else {
121*57083Sakito 			printf("OMRON Disklabel not found.\n");
122*57083Sakito 		}
123*57083Sakito 	} else if (!strcmp(argv[1], "copy")) {
124*57083Sakito 		bzero(bp, sizeof(struct disklabel));
125*57083Sakito 
126*57083Sakito 		bcopy(lbl_buff, bp->d_typename, 16);
127*57083Sakito 
128*57083Sakito 		bp->d_secsize    = DEV_BSIZE;
129*57083Sakito 		bp->d_nsectors   = 38;
130*57083Sakito 		bp->d_ntracks    = 12;
131*57083Sakito 		bp->d_ncylinders = 1076;
132*57083Sakito 
133*57083Sakito 		bp->d_type  = DTYPE_SCSI;
134*57083Sakito 
135*57083Sakito 		bp->d_secpercyl  = bp->d_nsectors * bp->d_ntracks;
136*57083Sakito 		bp->d_secperunit = bp->d_secpercyl * bp->d_ncylinders;
137*57083Sakito 		bp->d_rpm        = 3600;
138*57083Sakito 		bp->d_interleave = 1;
139*57083Sakito 		bp->d_trackskew  = 0;
140*57083Sakito 		bp->d_cylskew    = 0;
141*57083Sakito 		bp->d_headswitch = 0;
142*57083Sakito 		bp->d_trkseek    = 0;
143*57083Sakito 		bp->d_bbsize     = BBSIZE;
144*57083Sakito 		bp->d_sbsize     = SBSIZE;
145*57083Sakito 
146*57083Sakito 		for (i = 0; i < MAXPARTITIONS; i++) {
147*57083Sakito 			bp->d_partitions[i].p_size   = omp->dkl_map[i].dkl_nblk;
148*57083Sakito 			bp->d_partitions[i].p_offset = omp->dkl_map[i].dkl_blkno;
149*57083Sakito 			bp->d_partitions[i].p_fsize  = 1024;
150*57083Sakito 			bp->d_partitions[i].p_frag   = 8192 / 1024;
151*57083Sakito 			bp->d_partitions[i].p_fstype = FS_UNUSED;
152*57083Sakito 		}
153*57083Sakito 
154*57083Sakito 		bp->d_npartitions = MAXPARTITIONS;
155*57083Sakito 
156*57083Sakito 		for (i = 0; i < NDDATA; i++) {
157*57083Sakito 			bp->d_drivedata[i] = 0;
158*57083Sakito 		}
159*57083Sakito 
160*57083Sakito 		bzero(bp->d_packname, 16);
161*57083Sakito 
162*57083Sakito 		bp->d_magic    = DISKMAGIC;
163*57083Sakito 		bp->d_magic2   = DISKMAGIC;
164*57083Sakito 		bp->d_checksum = 0;
165*57083Sakito 		bp->d_checksum = dkcksum(bp);
166*57083Sakito 
167*57083Sakito 		/* restump checksum of OMRON disklabel */
168*57083Sakito 		chksum = 0;
169*57083Sakito 		count = sizeof(struct scd_dk_label) / sizeof(short int);
170*57083Sakito 		for (p= (u_short *) lbl_buff; count > 1; count--) {
171*57083Sakito 			chksum ^= *p++;
172*57083Sakito 		}
173*57083Sakito 		printf("chksum: 0x%x\n", chksum);
174*57083Sakito 
175*57083Sakito 		omp->dkl_cksum = chksum;
176*57083Sakito 		printf("dkl_cksum: 0x%x\n", omp->dkl_cksum);
177*57083Sakito 	} else if (!strcmp(argv[1], "bsd")) {
178*57083Sakito 		display(bp);
179*57083Sakito 	} else if (!strcmp(argv[1], "write")) {
180*57083Sakito 		if (scsi_write( 0, lbl_buff, LABEL_SIZE)) {
181*57083Sakito 			printf("Disk Label write done.\n");
182*57083Sakito 		} else {
183*57083Sakito 			printf("Disk Label write error !!\n");
184*57083Sakito 		}
185*57083Sakito 	} else if (!strcmp(argv[1], "set")) {
186*57083Sakito 		i = (argv[2])[1] - 'a';
187*57083Sakito 		for (q = argv[3], j = 0; *q != NULL; q++) {
188*57083Sakito 			j = (j * 10) + (*q - '0');
189*57083Sakito 		}
190*57083Sakito 		switch (*argv[2]) {
191*57083Sakito 		case 'b':
192*57083Sakito 			bp->d_partitions[i].p_frag = j / bp->d_partitions[i].p_fsize;
193*57083Sakito 			break;
194*57083Sakito 		case 'f':	/* fragment size */
195*57083Sakito 			bp->d_partitions[i].p_fsize = j;
196*57083Sakito 			break;
197*57083Sakito 		case 'o':	/* offset */
198*57083Sakito 			bp->d_partitions[i].p_offset = j;
199*57083Sakito 			omp->dkl_map[i].dkl_blkno = j;
200*57083Sakito 			break;
201*57083Sakito 		case 'p':	/* size */
202*57083Sakito 			bp->d_partitions[i].p_size = j;
203*57083Sakito 			omp->dkl_map[i].dkl_nblk = j;
204*57083Sakito 			break;
205*57083Sakito 		case 't':	/* FS type */
206*57083Sakito 			bp->d_partitions[i].p_fstype = j;
207*57083Sakito 			break;
208*57083Sakito 		default:
209*57083Sakito 			break;
210*57083Sakito 		}
211*57083Sakito 
212*57083Sakito 		/* restump checksum of BSD disklabel */
213*57083Sakito 		bp->d_checksum = 0;
214*57083Sakito 		bp->d_checksum = dkcksum(bp);
215*57083Sakito 
216*57083Sakito 		/* restump checksum of OMRON disklabel */
217*57083Sakito 		chksum = 0;
218*57083Sakito 		count = sizeof(struct scd_dk_label) / sizeof(short int);
219*57083Sakito 		for (p= (u_short *) lbl_buff; count > 1; count--) {
220*57083Sakito 			chksum ^= *p++;
221*57083Sakito 		}
222*57083Sakito 		omp->dkl_cksum = chksum;
223*57083Sakito 
224*57083Sakito 	} else if (!strcmp(argv[1], "sb")) {
225*57083Sakito #define BLOCK_SIZE	SBSIZE
226*57083Sakito 
227*57083Sakito 		printf("checking Super Block: block size = %d bytes, seek amount = 1 blocks\n",
228*57083Sakito 			BLOCK_SIZE);
229*57083Sakito 		i = j = 0;
230*57083Sakito 		while(1) {
231*57083Sakito 			if (!scsi_read( i, lbl_buff, BLOCK_SIZE))
232*57083Sakito 			break;
233*57083Sakito 
234*57083Sakito 			if (fp->fs_magic == FS_MAGIC) {
235*57083Sakito 				printf("%d, (%d)\n", i, i - j);
236*57083Sakito 				j = i;
237*57083Sakito 			}
238*57083Sakito 			i++;
239*57083Sakito 		}
240*57083Sakito 	} else if (!strcmp(argv[1], "sbcopy")) {
241*57083Sakito 		if (!scsi_read(32, lbl_buff, BLOCK_SIZE)) {
242*57083Sakito 			printf("sbcopy: read failed\n");
243*57083Sakito 			return(ST_ERROR);
244*57083Sakito 		}
245*57083Sakito 		if (scsi_write(16, lbl_buff, BLOCK_SIZE)) {
246*57083Sakito 			printf("sbcopy: copy done\n");
247*57083Sakito 		} else {
248*57083Sakito 			printf("sbcopy: write failed\n");
249*57083Sakito 		}
250*57083Sakito 	}
251*57083Sakito 
252*57083Sakito 	return(ST_NORMAL);
253*57083Sakito }
254*57083Sakito 
255*57083Sakito int
256*57083Sakito display(lp)
257*57083Sakito 	register struct disklabel *lp;
258*57083Sakito {
259*57083Sakito 	register int i, j;
260*57083Sakito 	register struct partition *pp;
261*57083Sakito 
262*57083Sakito 	if ((unsigned) lp->d_type < DKMAXTYPES)
263*57083Sakito 		printf("type: %s\n", dktypenames[lp->d_type]);
264*57083Sakito 	else
265*57083Sakito 		printf("type: %d\n", lp->d_type);
266*57083Sakito 	printf("disk: %s\n",  lp->d_typename);
267*57083Sakito 	printf("label: %s\n", lp->d_packname);
268*57083Sakito 	printf("flags:");
269*57083Sakito 	if (lp->d_flags & D_REMOVABLE)
270*57083Sakito 		printf(" removeable");
271*57083Sakito 	if (lp->d_flags & D_ECC)
272*57083Sakito 		printf(" ecc");
273*57083Sakito 	if (lp->d_flags & D_BADSECT)
274*57083Sakito 		printf(" badsect");
275*57083Sakito 	printf("\n");
276*57083Sakito 	printf("bytes/sector: %d\n", lp->d_secsize);
277*57083Sakito 	printf("sectors/track: %d\n", lp->d_nsectors);
278*57083Sakito 	printf("tracks/cylinder: %d\n", lp->d_ntracks);
279*57083Sakito 	printf("sectors/cylinder: %d\n", lp->d_secpercyl);
280*57083Sakito 	printf("cylinders: %d\n", lp->d_ncylinders);
281*57083Sakito 	printf("rpm: %d\n", lp->d_rpm);
282*57083Sakito 	printf("interleave: %d\n", lp->d_interleave);
283*57083Sakito 	printf("trackskew: %d\n", lp->d_trackskew);
284*57083Sakito 	printf("cylinderskew: %d\n", lp->d_cylskew);
285*57083Sakito 	printf("headswitch: %d\t\t# milliseconds\n", lp->d_headswitch);
286*57083Sakito 	printf("track-to-track seek: %d\t# milliseconds\n", lp->d_trkseek);
287*57083Sakito 	printf("drivedata: ");
288*57083Sakito 	for (i = NDDATA - 1; i >= 0; i--)
289*57083Sakito 		if (lp->d_drivedata[i])
290*57083Sakito 			break;
291*57083Sakito 	if (i < 0)
292*57083Sakito 		i = 0;
293*57083Sakito 	for (j = 0; j <= i; j++)
294*57083Sakito 		printf("%d ", lp->d_drivedata[j]);
295*57083Sakito 	printf("\n\n%d partitions:\n", lp->d_npartitions);
296*57083Sakito 	printf("#        size   offset    fstype   [fsize bsize   cpg]\n");
297*57083Sakito 	pp = lp->d_partitions;
298*57083Sakito 	for (i = 0; i < lp->d_npartitions; i++, pp++) {
299*57083Sakito 		if (pp->p_size) {
300*57083Sakito 			printf("  %c: %d %d  ", 'a' + i,
301*57083Sakito 			   pp->p_size, pp->p_offset);
302*57083Sakito 			if ((unsigned) pp->p_fstype < FSMAXTYPES)
303*57083Sakito 				printf("%s", fstypenames[pp->p_fstype]);
304*57083Sakito 			else
305*57083Sakito 				printf("%d", pp->p_fstype);
306*57083Sakito 			switch (pp->p_fstype) {
307*57083Sakito 
308*57083Sakito 			case FS_UNUSED:				/* XXX */
309*57083Sakito 				printf("    %d %d %s ",
310*57083Sakito 				    pp->p_fsize, pp->p_fsize * pp->p_frag, "");
311*57083Sakito 				break;
312*57083Sakito 
313*57083Sakito 			case FS_BSDFFS:
314*57083Sakito 				printf("    %d %d %d ",
315*57083Sakito 				    pp->p_fsize, pp->p_fsize * pp->p_frag,
316*57083Sakito 				    pp->p_cpg);
317*57083Sakito 				break;
318*57083Sakito 
319*57083Sakito 			default:
320*57083Sakito 				printf("%s", "");
321*57083Sakito 				break;
322*57083Sakito 			}
323*57083Sakito 			printf("\t# (Cyl. %d",
324*57083Sakito 			    pp->p_offset / lp->d_secpercyl);
325*57083Sakito 			if (pp->p_offset % lp->d_secpercyl)
326*57083Sakito 			    cnputc('*');
327*57083Sakito 			else
328*57083Sakito 			    cnputc(' ');
329*57083Sakito 			printf("- %d",
330*57083Sakito 			    (pp->p_offset +
331*57083Sakito 			    pp->p_size + lp->d_secpercyl - 1) /
332*57083Sakito 			    lp->d_secpercyl - 1);
333*57083Sakito 			if (pp->p_size % lp->d_secpercyl)
334*57083Sakito 			    cnputc('*');
335*57083Sakito 			printf(")\n");
336*57083Sakito 		}
337*57083Sakito 	}
338*57083Sakito }
339