1 /* $NetBSD: ufs_disksubr.c,v 1.6 2021/05/17 19:31:38 mrg Exp $ */
2
3 /*
4 * Copyright (c) 1992 OMRON Corporation.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * OMRON Corporation.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by the University of
20 * California, Berkeley and its contributors.
21 * 4. Neither the name of the University nor the names of its contributors
22 * may be used to endorse or promote products derived from this software
23 * without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 *
37 * @(#)ufs_disksubr.c 8.1 (Berkeley) 6/10/93
38 */
39 /*
40 * Copyright (c) 1992, 1993
41 * The Regents of the University of California. All rights reserved.
42 *
43 * This code is derived from software contributed to Berkeley by
44 * OMRON Corporation.
45 *
46 * Redistribution and use in source and binary forms, with or without
47 * modification, are permitted provided that the following conditions
48 * are met:
49 * 1. Redistributions of source code must retain the above copyright
50 * notice, this list of conditions and the following disclaimer.
51 * 2. Redistributions in binary form must reproduce the above copyright
52 * notice, this list of conditions and the following disclaimer in the
53 * documentation and/or other materials provided with the distribution.
54 * 3. Neither the name of the University nor the names of its contributors
55 * may be used to endorse or promote products derived from this software
56 * without specific prior written permission.
57 *
58 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
59 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
60 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
61 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
62 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
63 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
64 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
65 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
66 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
67 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
68 * SUCH DAMAGE.
69 *
70 * @(#)ufs_disksubr.c 8.1 (Berkeley) 6/10/93
71 */
72
73 /*
74 * ufs_disksubr.c -- disk utility routines
75 * by A.Fujita, FEB-26-1992
76 */
77
78 #include <sys/param.h>
79 #include <sys/disklabel.h>
80
81 #include <lib/libkern/libkern.h>
82
83 #include <luna68k/stand/boot/samachdep.h>
84 #include <luna68k/stand/boot/scsireg.h>
85
86 /*
87 * Attempt to read a disk label from a device
88 * using the indicated stategy routine.
89 * The label must be partly set up before this:
90 * secpercyl and anything required in the strategy routine
91 * (e.g., sector size) must be filled in before calling us.
92 * Returns null on success and an error string on failure.
93 */
94 char *
readdisklabel(int ctlr,int id,struct disklabel * lp)95 readdisklabel(int ctlr, int id, struct disklabel *lp)
96 {
97 uint8_t *bp = lbl_buff;
98 struct disklabel *dlp;
99 char *msg = NULL;
100 static struct scsi_generic_cdb cdb = {
101 6,
102 { CMD_READ, 0, 0, 0, 1, 0 }
103 };
104
105 if (lp->d_secperunit == 0)
106 lp->d_secperunit = 0x1fffffff;
107 lp->d_npartitions = 1;
108 if (lp->d_partitions[0].p_size == 0)
109 lp->d_partitions[0].p_size = 0x1fffffff;
110 lp->d_partitions[0].p_offset = 0;
111
112 if (scsi_immed_command(ctlr, id, 0, &cdb, bp, DEV_BSIZE) != 0) {
113 msg = "I/O error";
114 } else {
115 for (dlp = (struct disklabel *)bp;
116 dlp <= (struct disklabel *)(bp + DEV_BSIZE - sizeof(*dlp));
117 dlp = (struct disklabel *)((char *)dlp + sizeof(long))) {
118 if (dlp->d_magic != DISKMAGIC ||
119 dlp->d_magic2 != DISKMAGIC) {
120 if (msg == NULL)
121 msg = "no disk label";
122 } else if (dlp->d_npartitions > MAXPARTITIONS ||
123 dkcksum(dlp) != 0)
124 msg = "disk label corrupted";
125 else {
126 *lp = *dlp;
127 msg = NULL;
128 break;
129 }
130 }
131 }
132
133 return msg;
134 }
135