2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
20 #include <grub/types.h>
21 #include <grub/emu/misc.h>
22 #include <grub/util/misc.h>
23 #include <grub/misc.h>
24 #include <grub/device.h>
25 #include <grub/disk.h>
26 #include <grub/file.h>
29 #include <grub/term.h>
31 #include <grub/lib/hexdump.h>
32 #include <grub/crypto.h>
33 #include <grub/command.h>
34 #include <grub/i18n.h>
35 #include <grub/zfs/zfs.h>
36 #include <grub/util/install.h>
37 #include <grub/emu/getroot.h>
38 #include <grub/diskfilter.h>
39 #include <grub/cryptodisk.h>
40 #include <grub/legacy_parse.h>
41 #include <grub/gpt_partition.h>
42 #include <grub/emu/config.h>
43 #include <grub/util/ofpath.h>
44 #include <grub/hfsplus.h>
48 #pragma GCC diagnostic ignored "-Wmissing-prototypes"
49 #pragma GCC diagnostic ignored "-Wmissing-declarations"
51 #pragma GCC diagnostic error "-Wmissing-prototypes"
52 #pragma GCC diagnostic error "-Wmissing-declarations"
57 static int removable = 0;
58 static int recheck = 0;
59 static int update_nvram = 1;
60 static char *install_device = NULL;
61 static char *debug_image = NULL;
62 static char *rootdir = NULL;
63 static char *bootdir = NULL;
64 static int allow_floppy = 0;
65 static int force_file_id = 0;
66 static char *disk_module = NULL;
67 static char *efidir = NULL;
68 static char *macppcdir = NULL;
70 static int have_abstractions = 0;
71 static int have_cryptodisk = 0;
72 static char * bootloader_id;
73 static int have_load_cfg = 0;
74 static FILE * load_cfg_f = NULL;
75 static char *load_cfg;
76 static int install_bootsector = 1;
77 static char *label_font;
78 static char *label_color;
79 static char *label_bgcolor;
80 static char *product_version;
81 static int add_rs_codes = 1;
85 OPTION_BOOT_DIRECTORY = 0x301,
86 OPTION_ROOT_DIRECTORY,
100 OPTION_EFI_DIRECTORY,
106 OPTION_NO_BOOTSECTOR,
108 OPTION_MACPPC_DIRECTORY,
111 OPTION_LABEL_BGCOLOR,
112 OPTION_PRODUCT_VERSION
115 static int fs_probe = 1;
118 argp_parser (int key, char *arg, struct argp_state *state)
120 if (grub_install_parse (key, arg))
124 case OPTION_FORCE_FILE_ID:
132 if (!grub_strstr (arg, "setup"))
133 install_bootsector = 0;
136 case OPTION_PRODUCT_VERSION:
137 free (product_version);
138 product_version = xstrdup (arg);
140 case OPTION_LABEL_FONT:
142 label_font = xstrdup (arg);
145 case OPTION_LABEL_COLOR:
147 label_color = xstrdup (arg);
150 case OPTION_LABEL_BGCOLOR:
151 free (label_bgcolor);
152 label_bgcolor = xstrdup (arg);
155 /* Accept and ignore for compatibility. */
157 case OPTION_MKRELPATH:
160 case OPTION_MKDEVICEMAP:
161 case OPTION_NO_FLOPPY:
163 case OPTION_ROOT_DIRECTORY:
164 /* Accept for compatibility. */
166 rootdir = xstrdup (arg);
169 case OPTION_BOOT_DIRECTORY:
171 bootdir = xstrdup (arg);
174 case OPTION_MACPPC_DIRECTORY:
176 macppcdir = xstrdup (arg);
179 case OPTION_EFI_DIRECTORY:
181 efidir = xstrdup (arg);
184 case OPTION_DISK_MODULE:
186 disk_module = xstrdup (arg);
191 target = xstrdup (arg);
194 case OPTION_DEBUG_IMAGE:
196 debug_image = xstrdup (arg);
199 case OPTION_NO_NVRAM:
211 case OPTION_REMOVABLE:
215 case OPTION_ALLOW_FLOPPY:
219 case OPTION_NO_BOOTSECTOR:
220 install_bootsector = 0;
223 case OPTION_NO_RS_CODES:
231 case OPTION_BOOTLOADER_ID:
232 free (bootloader_id);
233 bootloader_id = xstrdup (arg);
238 grub_util_error ("%s", _("More than one install device?"));
239 install_device = xstrdup (arg);
243 return ARGP_ERR_UNKNOWN;
248 static struct argp_option options[] = {
249 GRUB_INSTALL_OPTIONS,
250 {"boot-directory", OPTION_BOOT_DIRECTORY, N_("DIR"),
251 0, N_("install GRUB images under the directory DIR/%s instead of the %s directory"), 2},
252 {"root-directory", OPTION_ROOT_DIRECTORY, N_("DIR"),
253 OPTION_HIDDEN, 0, 2},
254 {"font", OPTION_FONT, N_("FILE"),
255 OPTION_HIDDEN, 0, 2},
256 {"target", OPTION_TARGET, N_("TARGET"),
257 /* TRANSLATORS: "TARGET" as in "target platform". */
258 0, N_("install GRUB for TARGET platform [default=%s]; available targets: %s"), 2},
259 {"grub-setup", OPTION_SETUP, "FILE", OPTION_HIDDEN, 0, 2},
260 {"grub-mkrelpath", OPTION_MKRELPATH, "FILE", OPTION_HIDDEN, 0, 2},
261 {"grub-mkdevicemap", OPTION_MKDEVICEMAP, "FILE", OPTION_HIDDEN, 0, 2},
262 {"grub-probe", OPTION_PROBE, "FILE", OPTION_HIDDEN, 0, 2},
263 {"grub-editenv", OPTION_EDITENV, "FILE", OPTION_HIDDEN, 0, 2},
264 {"allow-floppy", OPTION_ALLOW_FLOPPY, 0, 0,
265 /* TRANSLATORS: "may break" doesn't just mean that option wouldn't have any
266 effect but that it will make the resulting install unbootable from HDD. */
267 N_("make the drive also bootable as floppy (default for fdX devices)."
268 " May break on some BIOSes."), 2},
269 {"recheck", OPTION_RECHECK, 0, 0,
270 N_("delete device map if it already exists"), 2},
271 {"force", OPTION_FORCE, 0, 0,
272 N_("install even if problems are detected"), 2},
273 {"force-file-id", OPTION_FORCE_FILE_ID, 0, 0,
274 N_("use identifier file even if UUID is available"), 2},
275 {"disk-module", OPTION_DISK_MODULE, N_("MODULE"), 0,
276 N_("disk module to use (biosdisk or native). "
277 "This option is only available on BIOS target."), 2},
278 {"no-nvram", OPTION_NO_NVRAM, 0, 0,
279 N_("don't update the `boot-device'/`Boot*' NVRAM variables. "
280 "This option is only available on EFI and IEEE1275 targets."), 2},
281 {"skip-fs-probe",'s',0, 0,
282 N_("do not probe for filesystems in DEVICE"), 0},
283 {"no-bootsector", OPTION_NO_BOOTSECTOR, 0, 0,
284 N_("do not install bootsector"), 0},
285 {"no-rs-codes", OPTION_NO_RS_CODES, 0, 0,
286 N_("Do not apply any reed-solomon codes when embedding core.img. "
287 "This option is only available on x86 BIOS targets."), 0},
289 {"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2},
290 {"no-floppy", OPTION_NO_FLOPPY, 0, OPTION_HIDDEN, 0, 2},
291 {"debug-image", OPTION_DEBUG_IMAGE, N_("STRING"), OPTION_HIDDEN, 0, 2},
292 {"removable", OPTION_REMOVABLE, 0, 0,
293 N_("the installation device is removable. "
294 "This option is only available on EFI."), 2},
295 {"bootloader-id", OPTION_BOOTLOADER_ID, N_("ID"), 0,
296 N_("the ID of bootloader. This option is only available on EFI and Macs."), 2},
297 {"efi-directory", OPTION_EFI_DIRECTORY, N_("DIR"), 0,
298 N_("use DIR as the EFI System Partition root."), 2},
299 {"macppc-directory", OPTION_MACPPC_DIRECTORY, N_("DIR"), 0,
300 N_("use DIR for PPC MAC install."), 2},
301 {"label-font", OPTION_LABEL_FONT, N_("FILE"), 0, N_("use FILE as font for label"), 2},
302 {"label-color", OPTION_LABEL_COLOR, N_("COLOR"), 0, N_("use COLOR for label"), 2},
303 {"label-bgcolor", OPTION_LABEL_BGCOLOR, N_("COLOR"), 0, N_("use COLOR for label background"), 2},
304 {"product-version", OPTION_PRODUCT_VERSION, N_("STRING"), 0, N_("use STRING as product version"), 2},
309 get_default_platform (void)
312 return "powerpc-ieee1275";
313 #elif defined (__sparc__) || defined (__sparc64__)
314 return "sparc64-ieee1275";
315 #elif defined (__MIPSEL__)
316 return "mipsel-loongson";
317 #elif defined (__MIPSEB__)
319 #elif defined (__ia64__)
321 #elif defined (__arm__)
323 #elif defined (__aarch64__)
325 #elif defined (__amd64__) || defined (__x86_64__) || defined (__i386__)
326 return grub_install_get_default_x86_platform ();
332 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
335 help_filter (int key, const char *text, void *input __attribute__ ((unused)))
339 case OPTION_BOOT_DIRECTORY:
340 return xasprintf (text, GRUB_DIR_NAME, GRUB_BOOT_DIR_NAME "/" GRUB_DIR_NAME);
343 char *plats = grub_install_get_platforms_string ();
345 ret = xasprintf (text, get_default_platform (), plats);
349 case ARGP_KEY_HELP_POST_DOC:
350 return xasprintf (text, program_name, GRUB_BOOT_DIR_NAME "/" GRUB_DIR_NAME);
352 return grub_install_help_filter (key, text, input);
356 #pragma GCC diagnostic error "-Wformat-nonliteral"
358 /* TRANSLATORS: INSTALL_DEVICE isn't an identifier and is the DEVICE you
361 options, argp_parser, N_("[OPTION] [INSTALL_DEVICE]"),
362 N_("Install GRUB on your drive.")"\v"
363 N_("INSTALL_DEVICE must be system device filename.\n"
364 "%s copies GRUB images into %s. On some platforms, it"
365 " may also install GRUB into the boot sector."),
366 NULL, help_filter, NULL
370 probe_raid_level (grub_disk_t disk)
372 /* disk might be NULL in the case of a LVM physical volume with no LVM
373 signature. Ignore such cases here. */
377 if (disk->dev->id != GRUB_DISK_DEVICE_DISKFILTER_ID)
380 if (disk->name[0] != 'm' || disk->name[1] != 'd')
383 if (!((struct grub_diskfilter_lv *) disk->data)->segments)
385 return ((struct grub_diskfilter_lv *) disk->data)->segments->type;
389 push_partmap_module (const char *map, void *data __attribute__ ((unused)))
393 if (strcmp (map, "openbsd") == 0 || strcmp (map, "netbsd") == 0)
395 grub_install_push_module ("part_bsd");
399 snprintf (buf, sizeof (buf), "part_%s", map);
400 grub_install_push_module (buf);
404 push_cryptodisk_module (const char *mod, void *data __attribute__ ((unused)))
406 grub_install_push_module (mod);
410 probe_mods (grub_disk_t disk)
412 grub_partition_t part;
413 grub_disk_memberlist_t list = NULL, tmp;
416 if (disk->partition == NULL)
417 grub_util_info ("no partition map found for %s", disk->name);
419 for (part = disk->partition; part; part = part->parent)
420 push_partmap_module (part->partmap->name, NULL);
422 if (disk->dev->id == GRUB_DISK_DEVICE_DISKFILTER_ID)
424 grub_diskfilter_get_partmap (disk, push_partmap_module, NULL);
425 have_abstractions = 1;
428 if (disk->dev->id == GRUB_DISK_DEVICE_DISKFILTER_ID
429 && (grub_memcmp (disk->name, "lvm/", sizeof ("lvm/") - 1) == 0 ||
430 grub_memcmp (disk->name, "lvmid/", sizeof ("lvmid/") - 1) == 0))
431 grub_install_push_module ("lvm");
433 if (disk->dev->id == GRUB_DISK_DEVICE_DISKFILTER_ID
434 && grub_memcmp (disk->name, "ldm/", sizeof ("ldm/") - 1) == 0)
435 grub_install_push_module ("ldm");
437 if (disk->dev->id == GRUB_DISK_DEVICE_CRYPTODISK_ID)
439 grub_util_cryptodisk_get_abstraction (disk,
440 push_cryptodisk_module, NULL);
441 have_abstractions = 1;
445 raid_level = probe_raid_level (disk);
448 grub_install_push_module ("diskfilter");
449 if (disk->dev->raidname)
450 grub_install_push_module (disk->dev->raidname (disk));
453 grub_install_push_module ("raid5rec");
455 grub_install_push_module ("raid6rec");
457 /* In case of LVM/RAID, check the member devices as well. */
458 if (disk->dev->memberlist)
459 list = disk->dev->memberlist (disk);
462 probe_mods (list->disk);
470 have_bootdev (enum grub_install_plat pl)
474 case GRUB_INSTALL_PLATFORM_I386_PC:
475 case GRUB_INSTALL_PLATFORM_I386_EFI:
476 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
477 case GRUB_INSTALL_PLATFORM_IA64_EFI:
478 case GRUB_INSTALL_PLATFORM_ARM_EFI:
479 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
480 case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
481 case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
482 case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
483 case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
484 case GRUB_INSTALL_PLATFORM_MIPS_ARC:
487 case GRUB_INSTALL_PLATFORM_I386_QEMU:
488 case GRUB_INSTALL_PLATFORM_I386_COREBOOT:
489 case GRUB_INSTALL_PLATFORM_ARM_COREBOOT:
490 case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT:
491 case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
492 case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
494 case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
495 case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
497 case GRUB_INSTALL_PLATFORM_I386_XEN:
498 case GRUB_INSTALL_PLATFORM_X86_64_XEN:
501 /* pacify warning. */
502 case GRUB_INSTALL_PLATFORM_MAX:
509 probe_cryptodisk_uuid (grub_disk_t disk)
511 grub_disk_memberlist_t list = NULL, tmp;
513 /* In case of LVM/RAID, check the member devices as well. */
514 if (disk->dev->memberlist)
516 list = disk->dev->memberlist (disk);
520 probe_cryptodisk_uuid (list->disk);
525 if (disk->dev->id == GRUB_DISK_DEVICE_CRYPTODISK_ID)
527 const char *uuid = grub_util_cryptodisk_get_uuid (disk);
529 load_cfg_f = grub_util_fopen (load_cfg, "wb");
532 fprintf (load_cfg_f, "cryptomount -u %s\n",
538 is_same_disk (const char *a, const char *b)
542 if ((*a == ',' || *a == '\0') && (*b == ',' || *b == '\0'))
562 grub_uint8_t rnd[15];
563 const size_t sz = sizeof (rnd) * GRUB_CHAR_BIT / 5;
564 char * ret = xmalloc (sz + 1);
566 if (grub_get_random (rnd, sizeof (rnd)))
567 grub_util_error ("%s", _("couldn't retrieve random data"));
568 for (i = 0; i < sz; i++)
570 grub_size_t b = i * 5;
572 grub_size_t f1 = GRUB_CHAR_BIT - b % GRUB_CHAR_BIT;
577 r = (rnd[b / GRUB_CHAR_BIT] >> (b % GRUB_CHAR_BIT)) & ((1 << f1) - 1);
579 r |= (rnd[b / GRUB_CHAR_BIT + 1] & ((1 << f2) - 1)) << f1;
583 ret[i] = 'a' + (r - 10);
590 escape (const char *in)
596 for (ptr = (char*)in; *ptr; ptr++)
599 ret = grub_malloc (ptr - in + overhead + 1);
603 grub_strchrsub (ret, in, '\'', "'\\''");
607 static struct grub_util_config config;
610 device_map_check_duplicates (const char *dev_map)
613 char buf[1024]; /* XXX */
619 if (dev_map[0] == '\0')
622 fp = grub_util_fopen (dev_map, "r");
626 d = xmalloc (alloced * sizeof (d[0]));
628 while (fgets (buf, sizeof (buf), fp))
633 /* Skip leading spaces. */
634 while (*p && grub_isspace (*p))
637 /* If the first character is `#' or NUL, skip this line. */
638 if (*p == '\0' || *p == '#')
651 if (filled >= alloced)
654 d = xrealloc (d, alloced * sizeof (d[0]));
659 d[filled++] = xstrdup (e);
664 qsort (d, filled, sizeof (d[0]), grub_qsort_strcmp);
666 for (i = 0; i + 1 < filled; i++)
667 if (strcmp (d[i], d[i+1]) == 0)
669 grub_util_error (_("the drive %s is defined multiple times in the device map %s"),
673 for (i = 0; i < filled; i++)
680 write_to_disk (grub_device_t dev, const char *fn)
686 core_size = grub_util_get_image_size (fn);
688 core_img = grub_util_read_image (fn);
690 grub_util_info ("writing `%s' to `%s'", fn, dev->disk->name);
691 err = grub_disk_write (dev->disk, 0, 0,
692 core_size, core_img);
698 is_prep_partition (grub_device_t dev)
702 if (!dev->disk->partition)
704 if (strcmp(dev->disk->partition->partmap->name, "msdos") == 0)
705 return (dev->disk->partition->msdostype == 0x41);
707 if (strcmp (dev->disk->partition->partmap->name, "gpt") == 0)
709 struct grub_gpt_partentry gptdata;
710 grub_partition_t p = dev->disk->partition;
712 dev->disk->partition = dev->disk->partition->parent;
714 if (grub_disk_read (dev->disk, p->offset, p->index,
715 sizeof (gptdata), &gptdata) == 0)
717 const grub_gpt_part_type_t template = {
718 grub_cpu_to_le32_compile_time (0x9e1a2d38),
719 grub_cpu_to_le16_compile_time (0xc612),
720 grub_cpu_to_le16_compile_time (0x4316),
721 { 0xaa, 0x26, 0x8b, 0x49, 0x52, 0x1e, 0x5a, 0x8b }
724 ret = grub_memcmp (&template, &gptdata.type,
725 sizeof (template)) == 0;
727 dev->disk->partition = p;
735 is_prep_empty (grub_device_t dev)
737 grub_disk_addr_t dsize, addr;
738 grub_uint32_t buffer[32768];
740 dsize = grub_disk_get_size (dev->disk);
741 for (addr = 0; addr < dsize;
742 addr += sizeof (buffer) / GRUB_DISK_SECTOR_SIZE)
744 grub_size_t sz = sizeof (buffer);
747 if (sizeof (buffer) / GRUB_DISK_SECTOR_SIZE > dsize - addr)
748 sz = (dsize - addr) * GRUB_DISK_SECTOR_SIZE;
749 grub_disk_read (dev->disk, addr, 0, sz, buffer);
751 if (addr == 0 && grub_memcmp (buffer, ELFMAG, SELFMAG) == 0)
754 for (ptr = buffer; ptr < buffer + sz / sizeof (*buffer); ptr++)
763 bless (grub_device_t dev, const char *path, int x86)
768 grub_util_info ("blessing %s", path);
770 if (stat (path, &st) < 0)
771 grub_util_error (N_("cannot stat `%s': %s"),
772 path, strerror (errno));
774 err = grub_mac_bless_inode (dev, st.st_ino, S_ISDIR (st.st_mode), x86);
776 grub_util_error ("%s", grub_errmsg);
777 grub_util_info ("blessed");
781 fill_core_services (const char *core_services)
786 char *label_string = xasprintf ("%s %s", bootloader_id, product_version);
789 label = grub_util_path_concat (2, core_services, ".disk_label");
790 grub_util_info ("rendering label %s", label_string);
791 grub_util_render_label (label_font, label_bgcolor ? : "white",
792 label_color ? : "black", label_string, label);
793 grub_util_info ("label rendered");
795 label_text = grub_util_path_concat (2, core_services, ".disk_label.contentDetails");
796 f = grub_util_fopen (label_text, "wb");
797 fprintf (f, "%s\n", label_string);
802 sysv_plist = grub_util_path_concat (2, core_services, "SystemVersion.plist");
803 f = grub_util_fopen (sysv_plist, "wb");
805 "<plist version=\"1.0\">\n"
807 " <key>ProductBuildVersion</key>\n"
808 " <string></string>\n"
809 " <key>ProductName</key>\n"
810 " <string>%s</string>\n"
811 " <key>ProductVersion</key>\n"
812 " <string>%s</string>\n"
814 "</plist>\n", bootloader_id, product_version);
820 main (int argc, char *argv[])
823 const char *efi_distributor = NULL;
824 const char *efi_file = NULL;
827 grub_device_t grub_dev = NULL;
828 enum grub_install_plat platform;
829 char *grubdir, *device_map;
830 char **curdev, **curdrive;
832 char *relative_grubdir;
833 char **efidir_device_names = NULL;
834 grub_device_t efidir_grub_dev = NULL;
835 char *efidir_grub_devname;
836 int efidir_is_mac = 0;
838 const char *pkgdatadir;
840 grub_util_host_init (&argc, &argv);
841 product_version = xstrdup (PACKAGE_VERSION);
842 pkgdatadir = grub_util_get_pkgdatadir ();
843 label_font = grub_util_path_concat (2, pkgdatadir, "unicode.pf2");
845 argp_parse (&argp, argc, argv, 0, 0, 0);
848 grub_env_set ("debug", "all");
850 grub_util_load_config (&config);
852 if (!bootloader_id && config.grub_distributor)
855 bootloader_id = xstrdup (config.grub_distributor);
856 for (ptr = bootloader_id; *ptr && *ptr != ' '; ptr++)
857 if (*ptr >= 'A' && *ptr <= 'Z')
858 *ptr = *ptr - 'A' + 'a';
861 if (!bootloader_id || bootloader_id[0] == '\0')
863 free (bootloader_id);
864 bootloader_id = xstrdup ("grub");
867 if (!grub_install_source_directory)
872 t = get_default_platform ();
874 grub_util_error ("%s",
875 _("Unable to determine your platform."
878 target = xstrdup (t);
880 grub_install_source_directory
881 = grub_util_path_concat (2, grub_util_get_pkglibdir (), target);
884 platform = grub_install_get_target (grub_install_source_directory);
887 char *platname = grub_install_get_platform_name (platform);
888 fprintf (stderr, _("Installing for %s platform.\n"), platname);
894 case GRUB_INSTALL_PLATFORM_I386_PC:
896 disk_module = xstrdup ("biosdisk");
898 case GRUB_INSTALL_PLATFORM_I386_EFI:
899 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
900 case GRUB_INSTALL_PLATFORM_ARM_EFI:
901 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
902 case GRUB_INSTALL_PLATFORM_IA64_EFI:
903 case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
904 case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
905 case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
906 case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
907 case GRUB_INSTALL_PLATFORM_MIPS_ARC:
908 case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
909 case GRUB_INSTALL_PLATFORM_I386_XEN:
910 case GRUB_INSTALL_PLATFORM_X86_64_XEN:
913 case GRUB_INSTALL_PLATFORM_I386_QEMU:
914 case GRUB_INSTALL_PLATFORM_I386_COREBOOT:
915 case GRUB_INSTALL_PLATFORM_ARM_COREBOOT:
916 case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT:
917 case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
918 case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
919 case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
920 disk_module = xstrdup ("native");
923 /* pacify warning. */
924 case GRUB_INSTALL_PLATFORM_MAX:
930 case GRUB_INSTALL_PLATFORM_I386_PC:
931 case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
933 grub_util_error ("%s", _("install device isn't specified"));
935 case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
939 case GRUB_INSTALL_PLATFORM_MIPS_ARC:
940 case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
942 case GRUB_INSTALL_PLATFORM_I386_EFI:
943 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
944 case GRUB_INSTALL_PLATFORM_ARM_EFI:
945 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
946 case GRUB_INSTALL_PLATFORM_IA64_EFI:
947 case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
948 case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
949 case GRUB_INSTALL_PLATFORM_I386_QEMU:
950 case GRUB_INSTALL_PLATFORM_I386_COREBOOT:
951 case GRUB_INSTALL_PLATFORM_ARM_COREBOOT:
952 case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT:
953 case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
954 case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
955 case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
956 case GRUB_INSTALL_PLATFORM_I386_XEN:
957 case GRUB_INSTALL_PLATFORM_X86_64_XEN:
958 free (install_device);
959 install_device = NULL;
962 /* pacify warning. */
963 case GRUB_INSTALL_PLATFORM_MAX:
968 bootdir = grub_util_path_concat (3, "/", rootdir, GRUB_BOOT_DIR_NAME);
971 char * t = grub_util_path_concat (2, bootdir, GRUB_DIR_NAME);
972 grub_install_mkdir_p (t);
973 grubdir = grub_canonicalize_file_name (t);
975 grub_util_error (_("failed to get canonical path of `%s'"), t);
978 device_map = grub_util_path_concat (2, grubdir, "device.map");
981 grub_util_unlink (device_map);
983 device_map_check_duplicates (device_map);
984 grub_util_biosdisk_init (device_map);
986 /* Initialize all modules. */
988 grub_gcry_init_all ();
994 case GRUB_INSTALL_PLATFORM_I386_EFI:
995 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
996 case GRUB_INSTALL_PLATFORM_ARM_EFI:
997 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
998 case GRUB_INSTALL_PLATFORM_IA64_EFI:
1005 /* pacify warning. */
1006 case GRUB_INSTALL_PLATFORM_MAX:
1010 /* Find the EFI System Partition. */
1015 free (install_device);
1016 install_device = NULL;
1019 char *d = grub_util_path_concat (2, bootdir, "efi");
1021 if (!grub_util_is_directory (d))
1024 d = grub_util_path_concat (2, bootdir, "EFI");
1027 The EFI System Partition may have been given directly using
1030 if (!grub_util_is_directory (d)
1031 && rootdir && grub_strcmp (rootdir, "/") != 0)
1034 d = xstrdup (rootdir);
1036 if (grub_util_is_directory (d))
1037 dr = grub_make_system_path_relative_to_its_root (d);
1038 /* Is it a mount point? */
1039 if (dr && dr[0] == '\0')
1046 grub_util_error ("%s", _("cannot find EFI directory"));
1047 efidir_device_names = grub_guess_root_devices (efidir);
1048 if (!efidir_device_names || !efidir_device_names[0])
1049 grub_util_error (_("cannot find a device for %s (is /dev mounted?)"),
1051 install_device = efidir_device_names[0];
1053 for (curdev = efidir_device_names; *curdev; curdev++)
1054 grub_util_pull_device (*curdev);
1056 efidir_grub_devname = grub_util_get_grub_dev (efidir_device_names[0]);
1057 if (!efidir_grub_devname)
1058 grub_util_error (_("cannot find a GRUB drive for %s. Check your device.map"),
1059 efidir_device_names[0]);
1061 efidir_grub_dev = grub_device_open (efidir_grub_devname);
1062 if (! efidir_grub_dev)
1063 grub_util_error ("%s", grub_errmsg);
1065 fs = grub_fs_probe (efidir_grub_dev);
1067 grub_util_error ("%s", grub_errmsg);
1071 if (grub_strcmp (fs->name, "hfs") == 0
1072 || grub_strcmp (fs->name, "hfsplus") == 0)
1075 if (!efidir_is_mac && grub_strcmp (fs->name, "fat") != 0)
1076 grub_util_error (_("%s doesn't look like an EFI partition"), efidir);
1078 /* The EFI specification requires that an EFI System Partition must
1079 contain an "EFI" subdirectory, and that OS loaders are stored in
1080 subdirectories below EFI. Vendors are expected to pick names that do
1081 not collide with other vendors. To minimise collisions, we use the
1082 name of our distributor if possible.
1085 efi_distributor = bootloader_id;
1088 /* The specification makes stricter requirements of removable
1089 devices, in order that only one image can be automatically loaded
1090 from them. The image must always reside under /EFI/BOOT, and it
1091 must have a specific file name depending on the architecture.
1093 efi_distributor = "BOOT";
1096 case GRUB_INSTALL_PLATFORM_I386_EFI:
1097 efi_file = "BOOTIA32.EFI";
1099 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
1100 efi_file = "BOOTX64.EFI";
1102 case GRUB_INSTALL_PLATFORM_IA64_EFI:
1103 efi_file = "BOOTIA64.EFI";
1105 case GRUB_INSTALL_PLATFORM_ARM_EFI:
1106 efi_file = "BOOTARM.EFI";
1108 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
1109 efi_file = "BOOTAA64.EFI";
1112 grub_util_error ("%s", _("You've found a bug"));
1118 /* It is convenient for each architecture to have a different
1119 efi_file, so that different versions can be installed in parallel.
1123 case GRUB_INSTALL_PLATFORM_I386_EFI:
1124 efi_file = "grubia32.efi";
1126 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
1127 efi_file = "grubx64.efi";
1129 case GRUB_INSTALL_PLATFORM_IA64_EFI:
1130 efi_file = "grubia64.efi";
1132 case GRUB_INSTALL_PLATFORM_ARM_EFI:
1133 efi_file = "grubarm.efi";
1135 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
1136 efi_file = "grubaa64.efi";
1139 efi_file = "grub.efi";
1143 t = grub_util_path_concat (3, efidir, "EFI", efi_distributor);
1146 grub_install_mkdir_p (efidir);
1149 if (platform == GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275)
1157 d = grub_util_path_concat (2, bootdir, "macppc");
1158 if (!grub_util_is_directory (d))
1161 d = grub_util_path_concat (2, bootdir, "efi");
1163 /* Find the Mac HFS(+) System Partition. */
1164 if (!grub_util_is_directory (d))
1167 d = grub_util_path_concat (2, bootdir, "EFI");
1169 if (!grub_util_is_directory (d))
1179 char **macppcdir_device_names = NULL;
1180 grub_device_t macppcdir_grub_dev = NULL;
1181 char *macppcdir_grub_devname;
1184 macppcdir_device_names = grub_guess_root_devices (macppcdir);
1185 if (!macppcdir_device_names || !macppcdir_device_names[0])
1186 grub_util_error (_("cannot find a device for %s (is /dev mounted?)"),
1189 for (curdev = macppcdir_device_names; *curdev; curdev++)
1190 grub_util_pull_device (*curdev);
1192 macppcdir_grub_devname = grub_util_get_grub_dev (macppcdir_device_names[0]);
1193 if (!macppcdir_grub_devname)
1194 grub_util_error (_("cannot find a GRUB drive for %s. Check your device.map"),
1195 macppcdir_device_names[0]);
1197 macppcdir_grub_dev = grub_device_open (macppcdir_grub_devname);
1198 if (! macppcdir_grub_dev)
1199 grub_util_error ("%s", grub_errmsg);
1201 fs = grub_fs_probe (macppcdir_grub_dev);
1203 grub_util_error ("%s", grub_errmsg);
1205 if (grub_strcmp (fs->name, "hfs") != 0
1206 && grub_strcmp (fs->name, "hfsplus") != 0
1208 grub_util_error (_("filesystem on %s is neither HFS nor HFS+"),
1210 if (grub_strcmp (fs->name, "hfs") == 0
1211 || grub_strcmp (fs->name, "hfsplus") == 0)
1213 install_device = macppcdir_device_names[0];
1219 grub_install_copy_files (grub_install_source_directory,
1222 char *envfile = grub_util_path_concat (2, grubdir, "grubenv");
1223 if (!grub_util_is_regular (envfile))
1224 grub_util_create_envblk_file (envfile);
1228 /* Write device to a variable so we don't have to traverse /dev every time. */
1229 grub_devices = grub_guess_root_devices (grubdir);
1230 if (!grub_devices || !grub_devices[0])
1231 grub_util_error (_("cannot find a device for %s (is /dev mounted?)"),
1234 for (curdev = grub_devices; *curdev; curdev++)
1236 grub_util_pull_device (*curdev);
1240 grub_drives = xmalloc (sizeof (grub_drives[0]) * (ndev + 1));
1242 for (curdev = grub_devices, curdrive = grub_drives; *curdev; curdev++,
1245 *curdrive = grub_util_get_grub_dev (*curdev);
1247 grub_util_error (_("cannot find a GRUB drive for %s. Check your device.map"),
1252 grub_dev = grub_device_open (grub_drives[0]);
1254 grub_util_error ("%s", grub_errmsg);
1256 grub_fs = grub_fs_probe (grub_dev);
1258 grub_util_error ("%s", grub_errmsg);
1260 grub_install_push_module (grub_fs->name);
1263 probe_mods (grub_dev->disk);
1265 for (curdrive = grub_drives + 1; *curdrive; curdrive++)
1267 grub_device_t dev = grub_device_open (*curdrive);
1271 probe_mods (dev->disk);
1272 grub_device_close (dev);
1275 if (!config.is_cryptodisk_enabled && have_cryptodisk)
1276 grub_util_error (_("attempt to install to encrypted disk without cryptodisk enabled. "
1277 "Set `%s' in file `%s'"), "GRUB_ENABLE_CRYPTODISK=y",
1278 grub_util_get_config_filename ());
1280 if (disk_module && grub_strcmp (disk_module, "ata") == 0)
1281 grub_install_push_module ("pata");
1282 else if (disk_module && grub_strcmp (disk_module, "native") == 0)
1284 grub_install_push_module ("pata");
1285 grub_install_push_module ("ahci");
1286 grub_install_push_module ("ohci");
1287 grub_install_push_module ("uhci");
1288 grub_install_push_module ("ehci");
1289 grub_install_push_module ("usbms");
1291 else if (disk_module && disk_module[0])
1292 grub_install_push_module (disk_module);
1294 relative_grubdir = grub_make_system_path_relative_to_its_root (grubdir);
1295 if (relative_grubdir[0] == '\0')
1297 free (relative_grubdir);
1298 relative_grubdir = xstrdup ("/");
1301 char *platname = grub_install_get_platform_name (platform);
1304 char *t = grub_util_path_concat (2, grubdir,
1306 platdir = grub_canonicalize_file_name (t);
1308 grub_util_error (_("failed to get canonical path of `%s'"),
1312 load_cfg = grub_util_path_concat (2, platdir,
1315 grub_util_unlink (load_cfg);
1317 if (debug_image && debug_image[0])
1319 load_cfg_f = grub_util_fopen (load_cfg, "wb");
1321 fprintf (load_cfg_f, "set debug='%s'\n",
1324 char *prefix_drive = NULL;
1325 char *install_drive = NULL;
1329 if (install_device[0] == '('
1330 && install_device[grub_strlen (install_device) - 1] == ')')
1332 size_t len = grub_strlen (install_device) - 2;
1333 install_drive = xmalloc (len + 1);
1334 memcpy (install_drive, install_device + 1, len);
1335 install_drive[len] = '\0';
1339 grub_util_pull_device (install_device);
1340 install_drive = grub_util_get_grub_dev (install_device);
1342 grub_util_error (_("cannot find a GRUB drive for %s. Check your device.map"),
1347 if (!have_abstractions)
1349 if ((disk_module && grub_strcmp (disk_module, "biosdisk") != 0)
1352 && platform != GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275)
1353 || (install_drive && !is_same_disk (grub_drives[0], install_drive))
1354 || !have_bootdev (platform))
1357 /* generic method (used on coreboot and ata mod). */
1358 if (!force_file_id && grub_fs->uuid && grub_fs->uuid (grub_dev,
1361 grub_print_error ();
1367 load_cfg_f = grub_util_fopen (load_cfg, "wb");
1371 fprintf (load_cfg_f, "search.fs_uuid %s root ",
1373 grub_install_push_module ("search_fs_uuid");
1377 char *rndstr = get_rndstr ();
1378 char *fl = grub_util_path_concat (3, grubdir,
1380 char *fldir = grub_util_path_concat (2, grubdir,
1384 grub_install_mkdir_p (fldir);
1385 flf = grub_util_fopen (fl, "w");
1387 grub_util_error (_("Can't create file: %s"), strerror (errno));
1389 relfl = grub_make_system_path_relative_to_its_root (fl);
1390 fprintf (load_cfg_f, "search.file %s root ",
1392 grub_install_push_module ("search_fs_file");
1394 for (curdev = grub_devices, curdrive = grub_drives; *curdev; curdev++,
1400 if (curdrive == grub_drives)
1403 dev = grub_device_open (*curdrive);
1407 if (dev->disk->dev->id != GRUB_DISK_DEVICE_HOSTDISK_ID)
1409 grub_util_fprint_full_disk_name (load_cfg_f,
1412 fprintf (load_cfg_f, " ");
1413 if (dev != grub_dev)
1414 grub_device_close (dev);
1418 map = grub_util_biosdisk_get_compatibility_hint (dev->disk);
1422 grub_util_fprint_full_disk_name (load_cfg_f, map, dev);
1423 fprintf (load_cfg_f, " ");
1427 if (disk_module && disk_module[0]
1428 && grub_strcmp (disk_module, "biosdisk") != 0)
1429 g = grub_util_guess_baremetal_drive (*curdev);
1433 case GRUB_INSTALL_PLATFORM_I386_PC:
1434 g = grub_util_guess_bios_drive (*curdev);
1436 case GRUB_INSTALL_PLATFORM_I386_EFI:
1437 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
1438 case GRUB_INSTALL_PLATFORM_ARM_EFI:
1439 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
1440 case GRUB_INSTALL_PLATFORM_IA64_EFI:
1441 g = grub_util_guess_efi_drive (*curdev);
1443 case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
1444 case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
1445 case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
1447 const char * ofpath = grub_util_devname_to_ofpath (*curdev);
1448 g = xasprintf ("ieee1275/%s", ofpath);
1451 case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
1452 case GRUB_INSTALL_PLATFORM_I386_QEMU:
1453 case GRUB_INSTALL_PLATFORM_I386_COREBOOT:
1454 case GRUB_INSTALL_PLATFORM_ARM_COREBOOT:
1455 case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT:
1456 case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
1457 case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
1458 g = grub_util_guess_baremetal_drive (*curdev);
1460 case GRUB_INSTALL_PLATFORM_MIPS_ARC:
1461 case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
1462 case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
1463 case GRUB_INSTALL_PLATFORM_I386_XEN:
1464 case GRUB_INSTALL_PLATFORM_X86_64_XEN:
1465 grub_util_warn ("%s", _("no hints available for your platform. Expect reduced performance"));
1467 /* pacify warning. */
1468 case GRUB_INSTALL_PLATFORM_MAX:
1473 grub_util_fprint_full_disk_name (load_cfg_f, g, dev);
1474 fprintf (load_cfg_f, " ");
1477 if (dev != grub_dev)
1478 grub_device_close (dev);
1480 fprintf (load_cfg_f, "\n");
1481 char *escaped_relpath = escape (relative_grubdir);
1482 fprintf (load_cfg_f, "set prefix=($root)'%s'\n",
1487 /* We need to hardcode the partition number in the core image's prefix. */
1489 for (p = grub_drives[0]; *p; )
1491 if (*p == '\\' && p[1])
1496 if (*p == ',' || *p == '\0')
1500 prefix_drive = xasprintf ("(%s)", p);
1505 if (config.is_cryptodisk_enabled)
1508 probe_cryptodisk_uuid (grub_dev->disk);
1510 for (curdrive = grub_drives + 1; *curdrive; curdrive++)
1512 grub_device_t dev = grub_device_open (*curdrive);
1516 probe_cryptodisk_uuid (dev->disk);
1517 grub_device_close (dev);
1520 prefix_drive = xasprintf ("(%s)", grub_drives[0]);
1523 char mkimage_target[200];
1524 const char *core_name = NULL;
1528 case GRUB_INSTALL_PLATFORM_I386_EFI:
1529 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
1530 case GRUB_INSTALL_PLATFORM_ARM_EFI:
1531 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
1532 case GRUB_INSTALL_PLATFORM_IA64_EFI:
1533 core_name = "core.efi";
1534 snprintf (mkimage_target, sizeof (mkimage_target),
1536 grub_install_get_platform_cpu (platform),
1537 grub_install_get_platform_platform (platform));
1539 case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
1540 case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
1541 case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
1542 core_name = "core.elf";
1543 snprintf (mkimage_target, sizeof (mkimage_target),
1545 grub_install_get_platform_cpu (platform),
1546 grub_install_get_platform_platform (platform));
1549 case GRUB_INSTALL_PLATFORM_I386_COREBOOT:
1550 case GRUB_INSTALL_PLATFORM_ARM_COREBOOT:
1551 case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT:
1552 case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
1553 case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
1554 case GRUB_INSTALL_PLATFORM_I386_XEN:
1555 case GRUB_INSTALL_PLATFORM_X86_64_XEN:
1556 core_name = "core.elf";
1557 snprintf (mkimage_target, sizeof (mkimage_target),
1559 grub_install_get_platform_cpu (platform),
1560 grub_install_get_platform_platform (platform));
1564 case GRUB_INSTALL_PLATFORM_I386_PC:
1565 case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
1566 case GRUB_INSTALL_PLATFORM_MIPS_ARC:
1567 case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
1568 case GRUB_INSTALL_PLATFORM_I386_QEMU:
1569 snprintf (mkimage_target, sizeof (mkimage_target),
1571 grub_install_get_platform_cpu (platform),
1572 grub_install_get_platform_platform (platform));
1573 core_name = "core.img";
1575 case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
1576 strcpy (mkimage_target, "sparc64-ieee1275-raw");
1577 core_name = "core.img";
1579 /* pacify warning. */
1580 case GRUB_INSTALL_PLATFORM_MAX:
1585 grub_util_error ("%s", _("You've found a bug"));
1588 fclose (load_cfg_f);
1590 char *imgfile = grub_util_path_concat (2, platdir,
1592 char *prefix = xasprintf ("%s%s", prefix_drive ? : "",
1594 grub_install_make_image_wrap (/* source dir */ grub_install_source_directory,
1596 /* output */ imgfile,
1598 have_load_cfg ? load_cfg : NULL,
1599 /* image target */ mkimage_target, 0);
1600 /* Backward-compatibility kludges. */
1603 case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
1605 char *dst = grub_util_path_concat (2, bootdir, "grub.elf");
1606 grub_install_copy_file (imgfile, dst, 1);
1611 case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
1612 case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
1614 char *dst = grub_util_path_concat (2, grubdir, "grub");
1615 grub_install_copy_file (imgfile, dst, 1);
1620 case GRUB_INSTALL_PLATFORM_I386_EFI:
1621 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
1623 char *dst = grub_util_path_concat (2, platdir, "grub.efi");
1624 grub_install_make_image_wrap (/* source dir */ grub_install_source_directory,
1628 have_load_cfg ? load_cfg : NULL,
1629 /* image target */ mkimage_target, 0);
1632 case GRUB_INSTALL_PLATFORM_ARM_EFI:
1633 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
1634 case GRUB_INSTALL_PLATFORM_IA64_EFI:
1635 case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
1636 case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
1637 case GRUB_INSTALL_PLATFORM_I386_COREBOOT:
1638 case GRUB_INSTALL_PLATFORM_ARM_COREBOOT:
1639 case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT:
1640 case GRUB_INSTALL_PLATFORM_I386_PC:
1641 case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
1642 case GRUB_INSTALL_PLATFORM_MIPS_ARC:
1643 case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
1644 case GRUB_INSTALL_PLATFORM_I386_QEMU:
1645 case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
1646 case GRUB_INSTALL_PLATFORM_I386_XEN:
1647 case GRUB_INSTALL_PLATFORM_X86_64_XEN:
1649 /* pacify warning. */
1650 case GRUB_INSTALL_PLATFORM_MAX:
1654 /* Perform the platform-dependent install */
1658 case GRUB_INSTALL_PLATFORM_I386_PC:
1660 char *boot_img_src = grub_util_path_concat (2,
1661 grub_install_source_directory,
1663 char *boot_img = grub_util_path_concat (2, platdir,
1665 grub_install_copy_file (boot_img_src, boot_img, 1);
1667 grub_util_info ("%sgrub-bios-setup %s %s %s %s %s --directory='%s' --device-map='%s' '%s'",
1668 /* TRANSLATORS: This is a prefix in the log to indicate that usually
1669 a command would be executed but due to an option was skipped. */
1670 install_bootsector ? "" : _("NOT RUNNING: "),
1671 allow_floppy ? "--allow-floppy " : "",
1672 verbosity ? "--verbose " : "",
1673 force ? "--force " : "",
1674 !fs_probe ? "--skip-fs-probe" : "",
1675 !add_rs_codes ? "--no-rs-codes" : "",
1680 /* Now perform the installation. */
1681 if (install_bootsector)
1682 grub_util_bios_setup (platdir, "boot.img", "core.img",
1683 install_drive, force,
1684 fs_probe, allow_floppy, add_rs_codes);
1687 case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
1689 char *boot_img_src = grub_util_path_concat (2,
1690 grub_install_source_directory,
1692 char *boot_img = grub_util_path_concat (2, platdir,
1694 grub_install_copy_file (boot_img_src, boot_img, 1);
1696 grub_util_info ("%sgrub-sparc64-setup %s %s %s %s --directory='%s' --device-map='%s' '%s'",
1697 install_bootsector ? "" : "NOT RUNNING: ",
1698 allow_floppy ? "--allow-floppy " : "",
1699 verbosity ? "--verbose " : "",
1700 force ? "--force " : "",
1701 !fs_probe ? "--skip-fs-probe" : "",
1706 /* Now perform the installation. */
1707 if (install_bootsector)
1708 grub_util_sparc_setup (platdir, "boot.img", "core.img",
1709 install_drive, force,
1710 fs_probe, allow_floppy,
1715 case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
1718 char *core_services = grub_util_path_concat (4, macppcdir,
1719 "System", "Library",
1721 char *mach_kernel = grub_util_path_concat (2, macppcdir,
1723 char *grub_elf, *bootx;
1725 grub_device_t ins_dev;
1726 char *grub_chrp = grub_util_path_concat (2,
1727 grub_install_source_directory,
1730 grub_install_mkdir_p (core_services);
1732 bootx = grub_util_path_concat (2, core_services, "BootX");
1733 grub_install_copy_file (grub_chrp, bootx, 1);
1735 grub_elf = grub_util_path_concat (2, core_services, "grub.elf");
1736 grub_install_copy_file (imgfile, grub_elf, 1);
1738 f = grub_util_fopen (mach_kernel, "a+");
1740 grub_util_error (_("Can't create file: %s"), strerror (errno));
1743 fill_core_services (core_services);
1745 ins_dev = grub_device_open (install_drive);
1747 bless (ins_dev, core_services, 0);
1754 partno = ins_dev->disk->partition
1755 ? ins_dev->disk->partition->number + 1 : 0;
1756 dev = grub_util_get_os_disk (install_device);
1757 grub_install_register_ieee1275 (0, dev, partno,
1760 grub_device_close (ins_dev);
1767 /* If a install device is defined, copy the core.elf to PReP partition. */
1768 if (is_prep && install_device && install_device[0])
1770 grub_device_t ins_dev;
1771 ins_dev = grub_device_open (install_drive);
1772 if (!ins_dev || !is_prep_partition (ins_dev))
1774 grub_util_error ("%s", _("the chosen partition is not a PReP partition"));
1776 if (is_prep_empty (ins_dev))
1778 if (write_to_disk (ins_dev, imgfile))
1779 grub_util_error ("%s", _("failed to copy Grub to the PReP partition"));
1783 char *s = xasprintf ("dd if=/dev/zero of=%s", install_device);
1784 grub_util_error (_("the PReP partition is not empty. If you are sure you want to use it, run dd to clear it: `%s'"),
1787 grub_device_close (ins_dev);
1789 grub_install_register_ieee1275 (1, grub_util_get_os_disk (install_device),
1794 case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
1800 relpath = grub_make_system_path_relative_to_its_root (imgfile);
1801 partno = grub_dev->disk->partition
1802 ? grub_dev->disk->partition->number + 1 : 0;
1803 dev = grub_util_get_os_disk (grub_devices[0]);
1804 grub_install_register_ieee1275 (0, dev,
1808 case GRUB_INSTALL_PLATFORM_MIPS_ARC:
1809 grub_install_sgi_setup (install_device, imgfile, "grub");
1812 case GRUB_INSTALL_PLATFORM_I386_EFI:
1815 char *dst = grub_util_path_concat (2, efidir, "grub.efi");
1816 /* For old macs. Suggested by Peter Jones. */
1817 grub_install_copy_file (imgfile, dst, 1);
1821 case GRUB_INSTALL_PLATFORM_X86_64_EFI:
1825 char *core_services = grub_util_path_concat (4, efidir,
1826 "System", "Library",
1828 char *mach_kernel = grub_util_path_concat (2, efidir,
1831 grub_device_t ins_dev;
1833 grub_install_mkdir_p (core_services);
1835 boot_efi = grub_util_path_concat (2, core_services, "boot.efi");
1836 grub_install_copy_file (imgfile, boot_efi, 1);
1838 f = grub_util_fopen (mach_kernel, "r+");
1840 grub_util_error (_("Can't create file: %s"), strerror (errno));
1843 fill_core_services(core_services);
1845 ins_dev = grub_device_open (install_drive);
1847 bless (ins_dev, boot_efi, 1);
1848 if (!removable && update_nvram)
1850 /* Try to make this image bootable using the EFI Boot Manager, if available. */
1851 grub_install_register_efi (efidir_grub_dev,
1852 "\\System\\Library\\CoreServices",
1856 grub_device_close (ins_dev);
1862 case GRUB_INSTALL_PLATFORM_ARM_EFI:
1863 case GRUB_INSTALL_PLATFORM_ARM64_EFI:
1864 case GRUB_INSTALL_PLATFORM_IA64_EFI:
1866 char *dst = grub_util_path_concat (2, efidir, efi_file);
1867 grub_install_copy_file (imgfile, dst, 1);
1870 if (!removable && update_nvram)
1872 char * efifile_path;
1875 /* Try to make this image bootable using the EFI Boot Manager, if available. */
1876 if (!efi_distributor || efi_distributor[0] == '\0')
1877 grub_util_error ("%s", _("EFI bootloader id isn't specified."));
1878 efifile_path = xasprintf ("\\EFI\\%s\\%s",
1881 part = (efidir_grub_dev->disk->partition
1882 ? grub_partition_get_name (efidir_grub_dev->disk->partition)
1884 grub_util_info ("Registering with EFI: distributor = `%s',"
1885 " path = `%s', ESP at %s%s%s",
1886 efi_distributor, efifile_path,
1887 efidir_grub_dev->disk->name,
1888 (part ? ",": ""), (part ? : ""));
1890 grub_install_register_efi (efidir_grub_dev,
1891 efifile_path, efi_distributor);
1895 case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
1896 case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
1897 case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
1898 case GRUB_INSTALL_PLATFORM_I386_COREBOOT:
1899 case GRUB_INSTALL_PLATFORM_ARM_COREBOOT:
1900 case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT:
1901 case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
1902 case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
1903 case GRUB_INSTALL_PLATFORM_I386_QEMU:
1904 case GRUB_INSTALL_PLATFORM_I386_XEN:
1905 case GRUB_INSTALL_PLATFORM_X86_64_XEN:
1906 grub_util_warn ("%s",
1907 _("WARNING: no platform-specific install was performed"));
1909 /* pacify warning. */
1910 case GRUB_INSTALL_PLATFORM_MAX:
1914 fprintf (stderr, "%s\n", _("Installation finished. No error reported."));
1916 /* Free resources. */
1917 grub_gcry_fini_all ();