xref: /freebsd/usr.sbin/bsdinstall/partedit/partedit_x86.c (revision 7431dfd4580e850375fe5478d92ec770344db098)
1 /*-
2  * Copyright (c) 2011 Nathan Whitehorn
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28 
29 #include <sys/types.h>
30 #include <sys/sysctl.h>
31 #include <string.h>
32 
33 #include "partedit.h"
34 
35 static const char *
36 x86_bootmethod(void)
37 {
38 	static char fw[255] = "";
39 	size_t len = sizeof(fw);
40 	int error;
41 
42 	if (strlen(fw) == 0) {
43 		error = sysctlbyname("machdep.bootmethod", fw, &len, NULL, -1);
44 		if (error != 0)
45 			return ("BIOS");
46 	}
47 
48 	return (fw);
49 }
50 
51 const char *
52 default_scheme(void)
53 {
54 	return ("GPT");
55 }
56 
57 int
58 is_scheme_bootable(const char *part_type)
59 {
60 
61 	if (strcmp(part_type, "GPT") == 0)
62 		return (1);
63 	if (strcmp(x86_bootmethod(), "BIOS") == 0) {
64 		if (strcmp(part_type, "BSD") == 0)
65 			return (1);
66 		if (strcmp(part_type, "MBR") == 0)
67 			return (1);
68 	}
69 
70 	return (0);
71 }
72 
73 int
74 is_fs_bootable(const char *part_type, const char *fs)
75 {
76 
77 	if (strcmp(fs, "freebsd-ufs") == 0)
78 		return (1);
79 
80 	if (strcmp(fs, "freebsd-zfs") == 0 &&
81 	    strcmp(part_type, "GPT") == 0 &&
82 	    strcmp(x86_bootmethod(), "BIOS") == 0)
83 		return (1);
84 
85 	return (0);
86 }
87 
88 size_t
89 bootpart_size(const char *scheme)
90 {
91 
92 	/* No partcode except for GPT */
93 	if (strcmp(scheme, "GPT") != 0)
94 		return (0);
95 
96 	if (strcmp(x86_bootmethod(), "BIOS") == 0)
97 		return (512*1024);
98 	else
99 		return (800*1024);
100 
101 	return (0);
102 }
103 
104 const char *
105 bootpart_type(const char *scheme)
106 {
107 
108 	if (strcmp(x86_bootmethod(), "UEFI") == 0)
109 		return ("efi");
110 
111 	return ("freebsd-boot");
112 }
113 
114 const char *
115 bootcode_path(const char *part_type)
116 {
117 
118 	if (strcmp(x86_bootmethod(), "UEFI") == 0)
119 		return (NULL);
120 
121 	if (strcmp(part_type, "GPT") == 0)
122 		return ("/boot/pmbr");
123 	if (strcmp(part_type, "MBR") == 0)
124 		return ("/boot/mbr");
125 	if (strcmp(part_type, "BSD") == 0)
126 		return ("/boot/boot");
127 
128 	return (NULL);
129 }
130 
131 const char *
132 partcode_path(const char *part_type, const char *fs_type)
133 {
134 
135 	if (strcmp(part_type, "GPT") == 0) {
136 		if (strcmp(x86_bootmethod(), "UEFI") == 0)
137 			return ("/boot/boot1.efifat");
138 		else if (strcmp(fs_type, "zfs") == 0)
139 			return ("/boot/gptzfsboot");
140 		else
141 			return ("/boot/gptboot");
142 	}
143 
144 	/* No partcode except for GPT */
145 	return (NULL);
146 }
147 
148