Detailed when kvm proc list is clobbered.
[unix-history] / usr / src / sys / sparc / sunos / sun_disklabel.c
CommitLineData
eb616ef0
CT
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) %G%
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 */
32int
33sun_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
64int
65sun_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}