| From 834b0793bae1e72d483dd2dccb74e2c81d35b0b1 Mon Sep 17 00:00:00 2001 |
| From: Josh Triplett <josh@joshtriplett.org> |
| Date: Wed, 31 Jul 2013 13:54:36 -0700 |
| Subject: [PATCH 1/2] Forward-port ChromeOS-specific GRUB environment variables |
| for boot disk and partitions |
| |
| This commit forward-ports the following changes previously applied in the |
| ChromeOS version of GRUB, with updates for changes to the surrounding code and |
| GRUB API changes: |
| |
| 144e40aca61589db1d286c82508f9328ec861158 Add variables to grub2 for Chrome OS bringup workarounds. |
| as modified by e63c2ee074c3c0abb5717fc8b7df62cf32066782 Support standard EFI ordering |
| and 5dfc8e1ae8c7d6836f2faef2545e4c5e6d516dff Add variable 'grubdisk' to export boot disk |
| |
| In particular, grub2 now has a grub_snprintf, and no longer has a grub_sprintf. |
| |
| BUG=chromium:265918 |
| TEST=With the complete patch series, built a complete x86-generic image, |
| and booted it via UEFI on both 32-bit and 64-bit UEFI platforms. |
| |
| CQ-DEPEND=I8d4cdde878efe73e15fddb250b10cfd4b88d88d1 |
| |
| Change-Id: Ie865f3d5ab0ecd8e9138bfd5b576a8147a205757 |
| Reviewed-on: https://gerrit.chromium.org/gerrit/63985 |
| Tested-by: Josh Triplett <josh@joshtriplett.org> |
| Reviewed-by: Liam McLoughlin <lmcloughlin@chromium.org> |
| Commit-Queue: Josh Triplett <josh@joshtriplett.org> |
| --- |
| grub-core/disk/efi/efidisk.c | 41 ++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 41 insertions(+) |
| |
| diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.c |
| index 5d2400f66..760f482e7 100644 |
| --- a/grub-core/disk/efi/efidisk.c |
| +++ b/grub-core/disk/efi/efidisk.c |
| @@ -26,6 +26,7 @@ |
| #include <grub/efi/api.h> |
| #include <grub/efi/efi.h> |
| #include <grub/efi/disk.h> |
| +#include <grub/env.h> |
| |
| struct grub_efidisk_data |
| { |
| @@ -882,6 +883,46 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle) |
| ctx.partition_name); |
| grub_free (ctx.partition_name); |
| } |
| + |
| + { |
| + // This block is a temporary workaround used by Chrome OS. We set |
| + // some variables that we can use in the grub.cfg file to ensure that |
| + // we get the kernel and rootfs from the boot device, regardless of |
| + // which device that is. |
| + grub_size_t tmpbuf_len = grub_strlen (parent->name) + 5; |
| + char *tmpbuf = grub_malloc (tmpbuf_len); |
| + if (! tmpbuf) |
| + { |
| + grub_free (dev_name); |
| + grub_disk_close (parent); |
| + return 0; |
| + } |
| + |
| + grub_snprintf (tmpbuf, tmpbuf_len, "(%s,3)", parent->name); |
| + grub_env_set ("grubpartA", tmpbuf); |
| + grub_env_export ("grubpartA"); |
| + grub_snprintf (tmpbuf, tmpbuf_len, "(%s,5)", parent->name); |
| + grub_env_set ("grubpartB", tmpbuf); |
| + grub_env_export ("grubpartB"); |
| + grub_free (tmpbuf); |
| + |
| + grub_env_set ("grubdisk", parent->name); |
| + grub_env_export ("grubdisk"); |
| + |
| + // Translate hd0 to sda, hd1 to sdb, etc. parent->name is always |
| + // either "fdN", "hdN", or "cdN". This trick won't work if N is > 9. |
| + int index = parent->name[2] - '0'; |
| + |
| + char devname[] = "sdXN"; |
| + devname[2] = 'a' + index; |
| + devname[3] = '3'; |
| + grub_env_set ("linuxpartA", devname); |
| + grub_env_export ("linuxpartA"); |
| + devname[3] = '5'; |
| + grub_env_set ("linuxpartB", devname); |
| + grub_env_export ("linuxpartB"); |
| + } |
| + |
| grub_disk_close (parent); |
| |
| return dev_name; |
| -- |
| 2.17.0 |
| |