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