1 /* $NetBSD: md.c,v 1.37 2009/09/19 14:57:30 abs Exp $ */
4 * Copyright 1997 Piermont Information Systems Inc.
7 * Based on code written by Philip A. Nelson for Piermont Information
8 * Systems Inc. Modified by Minoura Makoto for x68k.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
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. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed for the NetBSD Project by
21 * Piermont Information Systems Inc.
22 * 4. The name of Piermont Information Systems Inc. may not be used to endorse
23 * or promote products derived from this software without specific prior
26 * THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS''
27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE
30 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
36 * THE POSSIBILITY OF SUCH DAMAGE.
39 /* md.c -- x68k machine specific routines */
40 /* This file is in close sync with pmax, sparc, and vax md.c */
44 #include <sys/disklabel.h>
45 #include <sys/ioctl.h>
46 #include <sys/param.h>
52 #include "menu_defs.h"
57 typedef struct parttab
{
58 struct dos_partition dosparts
[NDOSPART
];
66 int md_need_newdisk
= 0;
69 static int md_newdisk(void);
77 md_init_set_status(int minimal
)
88 struct disklabel disklabel
;
90 snprintf(dev_name
, 100, "/dev/r%sc", diskdev
);
92 fd
= open(dev_name
, O_RDONLY
, 0);
95 (void)fprintf(logfp
, "Can't open %s\n", dev_name
);
97 fprintf(stderr
, "Can't open %s\n", dev_name
);
100 if (ioctl(fd
, DIOCGDINFO
, &disklabel
) == -1) {
102 (void)fprintf(logfp
, "Can't read disklabel on %s.\n",
105 fprintf(stderr
, "Can't read disklabel on %s.\n", dev_name
);
109 if (disklabel
.d_secsize
!= 512) {
111 fprintf(stderr
, "Non-512byte/sector disk is not supported.\n");
116 dlcyl
= disklabel
.d_ncylinders
;
117 dlhead
= disklabel
.d_ntracks
;
118 dlsec
= disklabel
.d_nsectors
;
119 sectorsize
= disklabel
.d_secsize
;
120 dlcylsize
= disklabel
.d_secpercyl
;
121 dlsize
= dlcyl
*dlhead
*dlsec
;
123 if (read(fd
, buf
, 1024) < 0) {
125 fprintf(stderr
, "Can't read %s\n", dev_name
);
129 if (memcmp(buf
, "X68SCSI1", 8) != 0)
133 if (read(fd
, md_disklabel
, sizeof(md_disklabel
)) < 0) {
135 fprintf(stderr
, "Can't read %s\n", dev_name
);
140 /* preserve first 64 sectors for system. */
143 /* preserve existing partitions? */
151 * md back-end code for menu-driven BSD disklabel editor.
154 md_make_bsd_partitions(void)
156 return(make_bsd_partitions());
160 * any additional partition validation
163 md_check_partitions(void)
165 /* X68k partitions must be in order of the range. */
166 int part
, last
= PART_A
-1;
169 for (part
= PART_A
; part
< 8; part
++) {
172 if (last
>= PART_A
&& bsdlabel
[part
].pi_size
> 0) {
173 msg_display(MSG_emptypart
, part
+'a');
174 process_menu(MENU_ok
, NULL
);
177 if (bsdlabel
[part
].pi_size
== 0) {
181 if (start
>= bsdlabel
[part
].pi_offset
) {
182 msg_display(MSG_ordering
, part
+'a');
183 process_menu(MENU_yesno
, NULL
);
187 start
= bsdlabel
[part
].pi_offset
;
196 md_check_partitions(void)
201 /* check existing BSD partitions. */
202 for (i
= 0; i
< NDOSPART
; i
++) {
203 if (md_disklabel
.dosparts
[i
].dp_size
== 0)
205 if (memcmp(md_disklabel
.dosparts
[i
].dp_typename
, "Human68k", 8)) {
206 msg_display(MSG_existing
);
207 process_menu(MENU_noyes
);
212 emptylabel(bsdlabel
);
213 bsdlabel
[C
].pi_fstype
= FS_UNUSED
;
214 bsdlabel
[C
].pi_offset
= 0;
215 bsdlabel
[C
].pi_size
= dlsize
;
216 for (i
= 0, j
= A
; i
< NDOSPART
;) {
222 memcmp(md_disklabel
.dosparts
[i
].dp_typename
,
228 bsdlabel
[j
].pi_fstype
= (i
== 1) ? FS_SWAP
: FS_BSDFFS
;
229 bsdlabel
[j
].pi_offset
= md_disklabel
.dosparts
[i
].dp_start
*2;
230 bsdlabel
[j
].pi_size
= md_disklabel
.dosparts
[i
].dp_size
*2;
235 msg_display(MSG_nofreepart
, diskdev
);
238 md_nfreepart
= 8 - j
;
240 /* check for free space */
241 fsptsize
= bsdlabel
[A
].pi_offset
- 64;
242 if (fptsize
<= 0) { /* XXX: should not be 0; minfsdb? */
243 msg_display(MSG_notfirst
, diskdev
);
244 process_menu(MENU_ok
);
248 /* Partitions should be preserved in md_make_bsdpartitions() */
253 * hook called before writing new disklabel.
256 md_pre_disklabel(void)
264 * hook called after writing disklabel to new target disk.
267 md_post_disklabel(void)
269 if (get_ramsize() < 6)
270 set_swap(diskdev
, bsdlabel
);
275 * hook called after upgrade() or install() has finished setting
276 * up the target disk but immediately before the user is given the
277 * ``disks are now set up'' message.
279 * On the x68k, we use this opportunity to install the boot blocks.
284 /* boot blocks ... */
285 msg_display(MSG_dobootblks
, diskdev
);
286 cp_to_target("/usr/mdec/boot", "/boot");
287 if (run_program(RUN_DISPLAY
| RUN_NO_CLEAR
,
288 "/usr/mdec/installboot.new /usr/mdec/sdboot_ufs /dev/r%sa",
290 process_menu(MENU_ok
,
291 deconst("Warning: disk is probably not bootable"));
296 md_post_extract(void)
302 md_cleanup_install(void)
304 #ifdef notyet /* sed is too large for ramdisk */
312 if (get_ramsize() < 6)
313 set_swap(diskdev
, NULL
);
317 /* Upgrade support */
328 msg_display(MSG_newdisk
, diskdev
, diskdev
);
330 return run_program(RUN_FATAL
|RUN_DISPLAY
,
331 "/usr/mdec/newdisk -v %s", diskdev
);