From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1VxfKh-00012G-Jr for mharc-grub-devel@gnu.org; Mon, 30 Dec 2013 11:04:47 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50558) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VxfKa-0000yw-SM for grub-devel@gnu.org; Mon, 30 Dec 2013 11:04:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VxfKU-000420-VV for grub-devel@gnu.org; Mon, 30 Dec 2013 11:04:40 -0500 Received: from ks35366.kimsufi.com ([213.251.186.122]:57263 helo=meetr.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VxfKU-00041s-L3 for grub-devel@gnu.org; Mon, 30 Dec 2013 11:04:34 -0500 Received: from localhost (localhost.localdomain [127.0.0.1]) by meetr.de (Postfix) with ESMTP id 4E2F64E04B6; Mon, 30 Dec 2013 17:04:33 +0100 (CET) Received: from meetr.de ([127.0.0.1]) by localhost (ks35366.kimsufi.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id IARPkIaR0jLJ; Mon, 30 Dec 2013 17:04:33 +0100 (CET) Received: from localhost.localdomain (p4FECB82B.dip0.t-ipconnect.de [79.236.184.43]) (Authenticated sender: andreas@heider.io) by meetr.de (Postfix) with ESMTPSA id CB84E4E04B1; Mon, 30 Dec 2013 17:04:32 +0100 (CET) From: Andreas Heider To: grub-devel@gnu.org Subject: [PATCH] Add apple_set_os command Date: Mon, 30 Dec 2013 17:04:26 +0100 Message-Id: <1388419466-2023-1-git-send-email-andreas@heider.io> X-Mailer: git-send-email 1.8.5.2 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 213.251.186.122 Cc: Andreas Heider X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Dec 2013 16:04:46 -0000 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[] = "Mac OS X 10.9"; +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_efi_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) + { + efi_call_1 (set_os->set_os_version, apple_os_version); + grub_printf("Set os version to %s\n", apple_os_version); + } + + if (set_os->version == 2) + { + efi_call_1 (set_os->set_os_vendor, apple_os_vendor); + grub_printf("Set os vendor to %s\n", apple_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