md.c revision 1.29
1/*	$NetBSD: md.c,v 1.29 2012/01/05 21:32:36 christos 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.
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/* changes from the sparc version made by mrg */
36
37/* md.c -- sparc64 machine specific routines */
38/* This file is in close sync with pmax, vax, and x68k, sparc md.c */
39
40#include <sys/types.h>
41#include <sys/disklabel.h>
42#include <sys/ioctl.h>
43#include <sys/param.h>
44#include <stdio.h>
45#include <curses.h>
46#include <unistd.h>
47#include <fcntl.h>
48#include <util.h>
49
50#include "defs.h"
51#include "md.h"
52#include "msg_defs.h"
53#include "menu_defs.h"
54
55static void install_bootblocks(void);
56static void install_ofwboot(void);
57
58void
59md_init(void)
60{
61}
62
63void
64md_init_set_status(int flags)
65{
66	(void)flags;
67}
68
69int
70md_get_info(void)
71{
72	struct disklabel disklabel;
73	int fd;
74	char dev_name[100];
75
76	snprintf(dev_name, 100, "/dev/r%sc", diskdev);
77
78	fd = open(dev_name, O_RDONLY, 0);
79	if (fd < 0) {
80		if (logfp)
81			(void)fprintf(logfp, "Can't open %s\n", dev_name);
82		endwin();
83		fprintf(stderr, "Can't open %s\n", dev_name);
84		exit(1);
85	}
86	if (ioctl(fd, DIOCGDINFO, &disklabel) == -1) {
87		if (logfp)
88			(void)fprintf(logfp, "Can't read disklabel on %s.\n",
89				dev_name);
90		endwin();
91		fprintf(stderr, "Can't read disklabel on %s.\n", dev_name);
92		close(fd);
93		exit(1);
94	}
95	close(fd);
96
97	dlcyl = disklabel.d_ncylinders;
98	dlhead = disklabel.d_ntracks;
99	dlsec = disklabel.d_nsectors;
100	sectorsize = disklabel.d_secsize;
101	dlcylsize = disklabel.d_secpercyl;
102
103	/*
104	 * Compute whole disk size. Take max of (dlcyl*dlhead*dlsec)
105	 * and secperunit,  just in case the disk is already labelled.
106	 * (If our new label's RAW_PART size ends up smaller than the
107	 * in-core RAW_PART size  value, updating the label will fail.)
108	 */
109	dlsize = dlcyl*dlhead*dlsec;
110	if (disklabel.d_secperunit > dlsize)
111		dlsize = disklabel.d_secperunit;
112
113	return 1;
114}
115
116/*
117 * md back-end code for menu-driven BSD disklabel editor.
118 */
119int
120md_make_bsd_partitions(void)
121{
122	return make_bsd_partitions();
123}
124
125/*
126 * any additional partition validation
127 */
128int
129md_check_partitions(void)
130{
131	return 1;
132}
133
134/*
135 * hook called before writing new disklabel.
136 */
137int
138md_pre_disklabel(void)
139{
140	return 0;
141}
142
143/*
144 * hook called after writing disklabel to new target disk.
145 */
146int
147md_post_disklabel(void)
148{
149	install_bootblocks();
150	return 0;
151}
152
153/*
154 * hook called after upgrade() or install() has finished setting
155 * up the target disk but immediately before the user is given the
156 * ``disks are now set up'' message.
157 */
158int
159md_post_newfs(void)
160{
161	install_ofwboot();
162	return 0;
163}
164
165int
166md_post_extract(void)
167{
168	return 0;
169}
170
171void
172md_cleanup_install(void)
173{
174#ifndef DEBUG
175	enable_rc_conf();
176#endif
177}
178
179int
180md_pre_update(void)
181{
182	return 1;
183}
184
185/* Upgrade support */
186int
187md_update(void)
188{
189	md_post_newfs();
190	return 1;
191}
192
193/* install/update bootblocks */
194static void
195install_bootblocks(void)
196{
197	/* Install boot blocks before mounting the target disk */
198	msg_display(MSG_dobootblks, diskdev);
199	run_program(RUN_DISPLAY, "/sbin/disklabel -W %s", diskdev);
200	run_program(RUN_DISPLAY, "/usr/sbin/installboot /dev/r%sc"
201	    " /usr/mdec/bootblk", diskdev);
202}
203
204/* install/update secondary bootstrap */
205static void
206install_ofwboot(void)
207{
208	/* copy secondary bootstrap now that the target is mounted */
209	msg_display(MSG_doofwboot, targetroot_mnt);
210	run_program(RUN_DISPLAY, "/bin/cp -p /usr/mdec/ofwboot %s",
211	    targetroot_mnt);
212}
213
214int
215md_pre_mount()
216{
217	install_bootblocks();
218	return 0;
219}
220