# --- T2-COPYRIGHT-NOTE-BEGIN ---
# T2 SDE: package/*/grub2/applesetos.patch
# Copyright (C) 2017 - 2024 The T2 SDE Project
#
# This Copyright note is generated by scripts/Create-CopyPatch,
# more information can be found in the files COPYING and README.
#
# This patch file is dual-licensed. It is available under the license the
# patched project is licensed under, as long as it is an OpenSource license
# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms
# of the GNU General Public License version 2 as used by the T2 SDE.
# --- T2-COPYRIGHT-NOTE-END ---
The EFI on current macbooks configures hardware differently depending
on wether it is booting Mac OS X or a different os, for example
disabling the internal GPU completely on some models.
Mac OS X identifies itself using a custom EFI protocol.
This adds a command that fakes the os identification, making all
hardware accessible.
---
grub-core/Makefile.core.def | 6 +++
grub-core/commands/efi/applesetos.c | 82 +++++++++++++++++++++++++++++++++++++
2 files changed, 88 insertions(+)
create mode 100644 grub-core/commands/efi/applesetos.c
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index 42443bc..dc9c4de 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -742,6 +742,12 @@ module = {
};
module = {
+ name = applesetos;
+ common = commands/efi/applesetos.c;
+ enable = efi;
+};
+
+module = {
name = blocklist;
common = commands/blocklist.c;
};
diff --git a/grub-core/commands/efi/applesetos.c
b/grub-core/commands/efi/applesetos.c
new file mode 100644
index 0000000..9464307
--- /dev/null
+++ b/grub-core/commands/efi/applesetos.c
@@ -0,0 +1,82 @@
+/* applesetos.c - Pretend to be Mac OS X. */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see .
+ */
+#include
+#include
+#include
+/* For NULL. */
+#include
+
+GRUB_MOD_LICENSE ("GPLv3+");
+
+#define GRUB_EFI_APPLE_SET_OS_PROTOCOL_GUID \
+ { 0xc5c5da95, 0x7d5c, 0x45e6, \
+ { 0xb2, 0xf1, 0x3f, 0xd5, 0x2b, 0xb1, 0x00, 0x77 } \
+ }
+
+struct grub_efi_apple_set_os_interface
+{
+ grub_efi_uint64_t version;
+ void (*set_os_version) (const grub_efi_char8_t *os_version);
+ void (*set_os_vendor) (const grub_efi_char8_t *os_vendor);
+};
+typedef struct grub_efi_apple_set_os_interface grub_efi_apple_set_os_interface_t;
+
+static const grub_efi_char8_t apple_os_version[] = "macOS-ish";
+static const grub_efi_char8_t apple_os_vendor[] = "Apple Inc.";
+
+static grub_err_t
+grub_cmd_apple_set_os (grub_command_t cmd __attribute__ ((unused)),
+ int argc __attribute__ ((unused)),
+ char **args __attribute__ ((unused)))
+{
+ grub_guid_t apple_set_os_guid = GRUB_EFI_APPLE_SET_OS_PROTOCOL_GUID;
+ grub_efi_apple_set_os_interface_t *set_os;
+ set_os = grub_efi_locate_protocol (&apple_set_os_guid, 0);
+ if (!set_os) {
+ return grub_error (GRUB_ERR_FILE_NOT_FOUND,
+ "Could not locate the apple set os protocol.");
+ }
+
+ if (set_os->version != 0)
+ {
+ const grub_efi_char8_t* os_version = argc > 0 ? (const grub_efi_char8_t*)args[0] : apple_os_version;
+ const grub_efi_char8_t* os_vendor = argc > 1 ? (const grub_efi_char8_t*)args[1] : apple_os_vendor;
+
+ set_os->set_os_version(os_version);
+ grub_printf("Set os version to %s\n", os_version);
+
+ set_os->set_os_vendor(os_vendor);
+ grub_printf("Set os vendor to %s\n", os_vendor);
+ }
+
+ return 0;
+}
+
+static grub_command_t cmd;
+
+GRUB_MOD_INIT(applesetos)
+{
+ cmd = grub_register_command ("apple_set_os", grub_cmd_apple_set_os, NULL,
+ "Register as Apple Inc. Mac OS X 10.9.");
+}
+
+GRUB_MOD_FINI(applesetos)
+{
+ grub_unregister_command (cmd);
+}
--
1.8.5.2