1 /* 2 * Copyright (c) 1992 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * This software was developed by the Computer Systems Engineering group 6 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 7 * contributed to Berkeley. 8 * 9 * %sccs.include.redist.c% 10 * 11 * @(#)sun_disklabel.c 7.1 (Berkeley) 07/13/92 12 * 13 * from: $Header: sun_disklabel.c,v 1.5 92/06/17 07:04:12 torek Exp $ 14 */ 15 16 /* 17 * SunOS disk label code. 18 */ 19 20 #include "sys/param.h" 21 #include "sys/disklabel.h" 22 #include "sys/device.h" 23 #include "sys/disk.h" 24 #include "sys/ioctl.h" 25 26 #include "sun_disklabel.h" 27 28 /* 29 * Take a sector (cp) containing a SunOS disk label and set lp to a BSD 30 * disk label. 31 */ 32 int 33 sun_disklabel(cp, lp) 34 register caddr_t cp; 35 register struct disklabel *lp; 36 { 37 register u_short *sp; 38 register struct sun_disklabel *sl; 39 register int i, v; 40 41 sp = (u_short *)(cp + sizeof(struct sun_disklabel)); 42 --sp; 43 v = 0; 44 while (sp >= (u_short *)cp) 45 v ^= *sp--; 46 if (v) 47 return (0); 48 sl = (struct sun_disklabel *)cp; 49 lp->d_magic = 0; /* denote as pseudo */ 50 lp->d_ncylinders = sl->sl_ncylinders; 51 lp->d_acylinders = sl->sl_acylinders; 52 v = (lp->d_ntracks = sl->sl_ntracks) * 53 (lp->d_nsectors = sl->sl_nsectors); 54 lp->d_secpercyl = v; 55 lp->d_npartitions = 8; 56 for (i = 0; i < 8; i++) { 57 lp->d_partitions[i].p_offset = 58 sl->sl_part[i].sdkp_cyloffset * v; 59 lp->d_partitions[i].p_size = sl->sl_part[i].sdkp_nsectors; 60 } 61 return (1); 62 } 63 64 int 65 sun_dkioctl(dk, cmd, data, partition) 66 struct dkdevice *dk; 67 int cmd; 68 caddr_t data; 69 int partition; 70 { 71 register struct partition *p; 72 73 switch (cmd) { 74 75 case DKIOCGGEOM: 76 #define geom ((struct sun_dkgeom *)data) 77 bzero(data, sizeof(*geom)); 78 geom->sdkc_ncylinders = dk->dk_label.d_ncylinders; 79 geom->sdkc_acylinders = dk->dk_label.d_acylinders; 80 geom->sdkc_ntracks = dk->dk_label.d_ntracks; 81 geom->sdkc_nsectors = dk->dk_label.d_nsectors; 82 geom->sdkc_interleave = dk->dk_label.d_interleave; 83 geom->sdkc_sparespercyl = dk->dk_label.d_sparespercyl; 84 geom->sdkc_rpm = dk->dk_label.d_rpm; 85 geom->sdkc_pcylinders = 86 dk->dk_label.d_ncylinders + dk->dk_label.d_acylinders; 87 #undef geom 88 break; 89 90 case DKIOCINFO: 91 /* Homey don't do DKIOCINFO */ 92 bzero(data, sizeof(struct sun_dkctlr)); 93 break; 94 95 case DKIOCGPART: 96 if (dk->dk_label.d_secpercyl == 0) 97 return (ERANGE); /* XXX */ 98 p = &dk->dk_label.d_partitions[partition]; 99 if (p->p_offset % dk->dk_label.d_secpercyl != 0) 100 return (ERANGE); /* XXX */ 101 #define part ((struct sun_dkpart *)data) 102 part->sdkp_cyloffset = p->p_offset / dk->dk_label.d_secpercyl; 103 part->sdkp_nsectors = p->p_size; 104 #undef part 105 break; 106 107 default: 108 return (-1); 109 } 110 return (0); 111 } 112