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