md.c revision 1.4 1 /* $NetBSD: md.c,v 1.4 2015/05/10 10:14:03 martin Exp $ */
2
3 /*
4 * Copyright 1997 Piermont Information Systems Inc.
5 * All rights reserved.
6 *
7 * Based on code written by Philip A. Nelson for Piermont Information
8 * Systems Inc. Modified by Minoura Makoto for x68k.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. The name of Piermont Information Systems Inc. may not be used to endorse
19 * or promote products derived from this software without specific prior
20 * written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS''
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32 * THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35 /* md.c -- x68k machine specific routines */
36 /* This file is in close sync with pmax, sparc, and vax md.c */
37
38 #include <stdio.h>
39 #include <unistd.h>
40 #include <sys/disklabel.h>
41 #include <sys/ioctl.h>
42 #include <sys/param.h>
43 #include <util.h>
44
45 #include "defs.h"
46 #include "md.h"
47 #include "msg_defs.h"
48 #include "menu_defs.h"
49
50 #ifdef notyet
51 #undef NDOSPART 8
52 #define NDOSPART 16
53 typedef struct parttab {
54 struct dos_partition dosparts[NDOSPART];
55 } parttab;
56
57 parttab md_disklabel;
58 int md_freepart;
59 int md_nfreepart;
60 #endif /* notyet */
61
62 int md_need_newdisk = 0;
63
64 /* prototypes */
65 static int md_newdisk(void);
66
67 void
68 md_init(void)
69 {
70 }
71
72 void
73 md_init_set_status(int flags)
74 {
75 (void)flags;
76 }
77
78 int
79 md_get_info(void)
80 {
81 char buf[1024];
82 int fd;
83 char dev_name[100];
84 struct disklabel disklabel;
85
86 snprintf(dev_name, 100, "/dev/r%sc", pm->diskdev);
87
88 fd = open(dev_name, O_RDONLY, 0);
89 if (fd < 0) {
90 if (logfp)
91 (void)fprintf(logfp, "Can't open %s\n", dev_name);
92 endwin();
93 fprintf(stderr, "Can't open %s\n", dev_name);
94 exit(1);
95 }
96 if (ioctl(fd, DIOCGDINFO, &disklabel) == -1) {
97 if (logfp)
98 (void)fprintf(logfp, "Can't read disklabel on %s.\n",
99 dev_name);
100 endwin();
101 fprintf(stderr, "Can't read disklabel on %s.\n", dev_name);
102 close(fd);
103 exit(1);
104 }
105 if (disklabel.d_secsize != 512) {
106 endwin();
107 fprintf(stderr, "Non-512byte/sector disk is not supported.\n");
108 close(fd);
109 exit(1);
110 }
111
112 pm->dlcyl = disklabel.d_ncylinders;
113 pm->dlhead = disklabel.d_ntracks;
114 pm->dlsec = disklabel.d_nsectors;
115 pm->sectorsize = disklabel.d_secsize;
116 pm->dlcylsize = disklabel.d_secpercyl;
117 pm->dlsize = pm->dlcyl*pm->dlhead*pm->dlsec;
118
119 if (read(fd, buf, 1024) < 0) {
120 endwin();
121 fprintf(stderr, "Can't read %s\n", dev_name);
122 close(fd);
123 exit(1);
124 }
125 if (memcmp(buf, "X68SCSI1", 8) != 0)
126 md_need_newdisk = 1;
127 #ifdef notyet
128 else
129 if (read(fd, md_disklabel, sizeof(md_disklabel)) < 0) {
130 endwin();
131 fprintf(stderr, "Can't read %s\n", dev_name);
132 close(fd);
133 exit(1);
134 }
135 #endif
136 /* preserve first 64 sectors for system. */
137 pm->ptstart = 64;
138
139 /* preserve existing partitions? */
140
141 close(fd);
142
143 return 1;
144 }
145
146 /*
147 * md back-end code for menu-driven BSD disklabel editor.
148 */
149 int
150 md_make_bsd_partitions(void)
151 {
152 return(make_bsd_partitions());
153 }
154
155 /*
156 * any additional partition validation
157 */
158 int
159 md_check_partitions(void)
160 {
161 /* X68k partitions must be in order of the range. */
162 int part, last = PART_A-1;
163 uint32_t start = 0;
164
165 for (part = PART_A; part < 8; part++) {
166 if (part == PART_C)
167 continue;
168 if (last >= PART_A && pm->bsdlabel[part].pi_size > 0) {
169 msg_display(MSG_emptypart, part+'a');
170 process_menu(MENU_ok, NULL);
171 return 0;
172 }
173 if (pm->bsdlabel[part].pi_size == 0) {
174 if (last < PART_A)
175 last = part;
176 } else {
177 if (start >= pm->bsdlabel[part].pi_offset) {
178 msg_display(MSG_ordering, part+'a');
179 if (ask_yesno(NULL))
180 return 0;
181 }
182 start = pm->bsdlabel[part].pi_offset;
183 }
184 }
185
186 return 1;
187 }
188
189 #ifdef notyet
190 static int
191 md_check_partitions(void)
192 {
193 int i, j;
194 int preserve;
195
196 /* check existing BSD partitions. */
197 for (i = 0; i < NDOSPART; i++) {
198 if (md_disklabel.dosparts[i].dp_size == 0)
199 break;
200 if (memcmp(md_disklabel.dosparts[i].dp_typename, "Human68k", 8)) {
201 msg_display(MSG_existing);
202 preserve = ask_noyes(NULL);
203 break;
204 }
205 }
206 emptylabel(pm->bsdlabel);
207 pm->bsdlabel[C].pi_fstype = FS_UNUSED;
208 pm->bsdlabel[C].pi_offset = 0;
209 pm->bsdlabel[C].pi_size = pm->dlsize;
210 for (i = 0, j = A; i < NDOSPART;) {
211 if (j == C) {
212 j++;
213 continue;
214 }
215 if (!preserve &&
216 memcmp(md_disklabel.dosparts[i].dp_typename,
217 "Human68k", 8)) {
218 /* discard it. */
219 i++;
220 continue;
221 }
222 pm->bsdlabel[j].pi_fstype = (i == 1) ? FS_SWAP : FS_BSDFFS;
223 pm->bsdlabel[j].pi_offset = md_disklabel.dosparts[i].dp_start*2;
224 pm->bsdlabel[j].pi_size = md_disklabel.dosparts[i].dp_size*2;
225 i++;
226 j++;
227 }
228 if (j > 6) {
229 msg_display(MSG_nofreepart, pm->diskdev);
230 return 0;
231 }
232 md_nfreepart = 8 - j;
233
234 /* check for free space */
235 fspm->ptsize = pm->bsdlabel[A].pi_offset - 64;
236 if (fpm->ptsize <= 0) { /* XXX: should not be 0; minfsdb? */
237 msg_display(MSG_notfirst, pm->diskdev);
238 process_menu(MENU_ok);
239 exit(1);
240 }
241
242 /* Partitions should be preserved in md_make_bsdpartitions() */
243 }
244 #endif /* notyet */
245
246 /*
247 * hook called before writing new disklabel.
248 */
249 int
250 md_pre_disklabel(void)
251 {
252 if (md_need_newdisk)
253 md_newdisk ();
254 return 0;
255 }
256
257 /*
258 * hook called after writing disklabel to new target disk.
259 */
260 int
261 md_post_disklabel(void)
262 {
263 return 0;
264 }
265
266 /*
267 * hook called after upgrade() or install() has finished setting
268 * up the target disk but immediately before the user is given the
269 * ``disks are now set up'' message.
270 *
271 * On the x68k, we use this opportunity to install the boot blocks.
272 */
273 int
274 md_post_newfs(void)
275 {
276 /* boot blocks ... */
277 msg_display(MSG_dobootblks, pm->diskdev);
278 cp_to_target("/usr/mdec/boot", "/boot");
279 if (run_program(RUN_DISPLAY | RUN_NO_CLEAR,
280 "/usr/mdec/installboot.new /usr/mdec/sdboot_ufs /dev/r%sa",
281 pm->diskdev))
282 process_menu(MENU_ok,
283 deconst("Warning: disk is probably not bootable"));
284 return 0;
285 }
286
287 int
288 md_post_extract(void)
289 {
290 return 0;
291 }
292
293 void
294 md_cleanup_install(void)
295 {
296 #ifndef DEBUG
297 enable_rc_conf();
298 #endif
299 }
300
301 int
302 md_pre_update(void)
303 {
304 return 1;
305 }
306
307 /* Upgrade support */
308 int
309 md_update(void)
310 {
311 md_post_newfs();
312 return 1;
313 }
314
315 static int
316 md_newdisk(void)
317 {
318 msg_display(MSG_newdisk, pm->diskdev, pm->diskdev);
319
320 return run_program(RUN_FATAL|RUN_DISPLAY,
321 "/usr/mdec/newdisk -v %s", pm->diskdev);
322 }
323
324
325 int
326 md_pre_mount()
327 {
328 return 0;
329 }
330