md.c revision 1.2 1 /* $NetBSD: md.c,v 1.2 2014/08/03 16:09:41 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 process_menu(MENU_yesno, NULL);
180 if (yesno)
181 return 0;
182 }
183 start = pm->bsdlabel[part].pi_offset;
184 }
185 }
186
187 return 1;
188 }
189
190 #ifdef notyet
191 static int
192 md_check_partitions(void)
193 {
194 int i, j;
195 int preserve;
196
197 /* check existing BSD partitions. */
198 for (i = 0; i < NDOSPART; i++) {
199 if (md_disklabel.dosparts[i].dp_size == 0)
200 break;
201 if (memcmp(md_disklabel.dosparts[i].dp_typename, "Human68k", 8)) {
202 msg_display(MSG_existing);
203 process_menu(MENU_noyes);
204 preserve = yesno;
205 break;
206 }
207 }
208 emptylabel(pm->bsdlabel);
209 pm->bsdlabel[C].pi_fstype = FS_UNUSED;
210 pm->bsdlabel[C].pi_offset = 0;
211 pm->bsdlabel[C].pi_size = pm->dlsize;
212 for (i = 0, j = A; i < NDOSPART;) {
213 if (j == C) {
214 j++;
215 continue;
216 }
217 if (!preserve &&
218 memcmp(md_disklabel.dosparts[i].dp_typename,
219 "Human68k", 8)) {
220 /* discard it. */
221 i++;
222 continue;
223 }
224 pm->bsdlabel[j].pi_fstype = (i == 1) ? FS_SWAP : FS_BSDFFS;
225 pm->bsdlabel[j].pi_offset = md_disklabel.dosparts[i].dp_start*2;
226 pm->bsdlabel[j].pi_size = md_disklabel.dosparts[i].dp_size*2;
227 i++;
228 j++;
229 }
230 if (j > 6) {
231 msg_display(MSG_nofreepart, pm->diskdev);
232 return 0;
233 }
234 md_nfreepart = 8 - j;
235
236 /* check for free space */
237 fspm->ptsize = pm->bsdlabel[A].pi_offset - 64;
238 if (fpm->ptsize <= 0) { /* XXX: should not be 0; minfsdb? */
239 msg_display(MSG_notfirst, pm->diskdev);
240 process_menu(MENU_ok);
241 exit(1);
242 }
243
244 /* Partitions should be preserved in md_make_bsdpartitions() */
245 }
246 #endif /* notyet */
247
248 /*
249 * hook called before writing new disklabel.
250 */
251 int
252 md_pre_disklabel(void)
253 {
254 if (md_need_newdisk)
255 md_newdisk ();
256 return 0;
257 }
258
259 /*
260 * hook called after writing disklabel to new target disk.
261 */
262 int
263 md_post_disklabel(void)
264 {
265 if (get_ramsize() < 6)
266 set_swap(pm->diskdev, pm->bsdlabel);
267 return 0;
268 }
269
270 /*
271 * hook called after upgrade() or install() has finished setting
272 * up the target disk but immediately before the user is given the
273 * ``disks are now set up'' message.
274 *
275 * On the x68k, we use this opportunity to install the boot blocks.
276 */
277 int
278 md_post_newfs(void)
279 {
280 /* boot blocks ... */
281 msg_display(MSG_dobootblks, pm->diskdev);
282 cp_to_target("/usr/mdec/boot", "/boot");
283 if (run_program(RUN_DISPLAY | RUN_NO_CLEAR,
284 "/usr/mdec/installboot.new /usr/mdec/sdboot_ufs /dev/r%sa",
285 pm->diskdev))
286 process_menu(MENU_ok,
287 deconst("Warning: disk is probably not bootable"));
288 return 0;
289 }
290
291 int
292 md_post_extract(void)
293 {
294 return 0;
295 }
296
297 void
298 md_cleanup_install(void)
299 {
300 #ifndef DEBUG
301 enable_rc_conf();
302 #endif
303 }
304
305 int
306 md_pre_update(void)
307 {
308 if (get_ramsize() < 6)
309 set_swap(pm->diskdev, NULL);
310 return 1;
311 }
312
313 /* Upgrade support */
314 int
315 md_update(void)
316 {
317 md_post_newfs();
318 return 1;
319 }
320
321 static int
322 md_newdisk(void)
323 {
324 msg_display(MSG_newdisk, pm->diskdev, pm->diskdev);
325
326 return run_program(RUN_FATAL|RUN_DISPLAY,
327 "/usr/mdec/newdisk -v %s", pm->diskdev);
328 }
329
330
331 int
332 md_pre_mount()
333 {
334 return 0;
335 }
336