efi: Add quirks for some unicorn Apple EFI protocols
* grub and linux do the same thing. * Based on MIT code here: https://github.com/0xbb/apple_set_os.efi/blob/master/apple_set_os.c Change-Id: I299b3721197c5cdd4406d313d8769d4923f7edb4 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2239 Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
committed by
Alex von Gluck IV
parent
e79dc1ff93
commit
d38ba84d44
@@ -0,0 +1,17 @@
|
|||||||
|
// Copyright 2015 Bruno Bierbaumer
|
||||||
|
// Released under the terms of the MIT License
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <efi/types.h>
|
||||||
|
|
||||||
|
#define EFI_APPLE_SET_OS_GUID \
|
||||||
|
{0xc5c5da95, 0x7d5c, 0x45e6, {0xb2, 0xf1, 0x3f, 0xd5, 0x2b, 0xb1, 0x00, 0x77}}
|
||||||
|
extern efi_guid AppleSetOSProtocol;
|
||||||
|
|
||||||
|
typedef struct efi_apple_set_os_protocol {
|
||||||
|
uint64_t Revision;
|
||||||
|
|
||||||
|
efi_status (*SetOSVersion) (char* version) EFIAPI;
|
||||||
|
efi_status (*SetOSVendor) (char* vendor) EFIAPI;
|
||||||
|
} efi_apple_set_os_protocol;
|
||||||
@@ -26,6 +26,7 @@ local platform_src =
|
|||||||
menu.cpp
|
menu.cpp
|
||||||
devices.cpp
|
devices.cpp
|
||||||
cpu.cpp
|
cpu.cpp
|
||||||
|
quirks.cpp
|
||||||
smp.cpp
|
smp.cpp
|
||||||
serial.cpp
|
serial.cpp
|
||||||
smp_trampoline.S
|
smp_trampoline.S
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015, Bruno Bierbaumer. All rights reserved.
|
||||||
|
* Copyright 2019-2020, Haiku, Inc. All rights reserved.
|
||||||
|
* Released under the terms of the MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <efi/protocol/apple-setos.h>
|
||||||
|
#include <KernelExport.h>
|
||||||
|
|
||||||
|
#include "efi_platform.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define APPLE_FAKE_OS_VENDOR "Apple Inc."
|
||||||
|
#define APPLE_FAKE_OS_VERSION "Mac OS X 10.9"
|
||||||
|
|
||||||
|
|
||||||
|
// Apple Hardware configures hardware differently depending on
|
||||||
|
// the operating system being booted. Examples include disabling
|
||||||
|
// and powering down the internal GPU on some device models.
|
||||||
|
static void
|
||||||
|
quirks_fake_apple(void)
|
||||||
|
{
|
||||||
|
efi_guid appleSetOSProtocolGUID = EFI_APPLE_SET_OS_GUID;
|
||||||
|
efi_apple_set_os_protocol* set_os = NULL;
|
||||||
|
|
||||||
|
efi_status status = kSystemTable->BootServices->LocateProtocol(
|
||||||
|
&appleSetOSProtocolGUID, NULL, (void**)&set_os);
|
||||||
|
|
||||||
|
// If not relevant, we will exit here (the protocol doesn't exist)
|
||||||
|
if (status != EFI_SUCCESS || set_os == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dprintf("Located Apple set_os protocol, applying EFI Apple Quirks...\n");
|
||||||
|
|
||||||
|
if (set_os->Revision != 0) {
|
||||||
|
status = set_os->SetOSVersion((char*)APPLE_FAKE_OS_VERSION);
|
||||||
|
if (status != EFI_SUCCESS) {
|
||||||
|
dprintf("%s: unable to set os version!\n", __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status = set_os->SetOSVendor((char*)APPLE_FAKE_OS_VENDOR);
|
||||||
|
if (status != EFI_SUCCESS) {
|
||||||
|
dprintf("%s: unable to set os version!\n", __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
quirks_init(void)
|
||||||
|
{
|
||||||
|
quirks_fake_apple();
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020, Haiku, Inc. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Alexander von Gluck IV <[email protected]>
|
||||||
|
*/
|
||||||
|
#ifndef _QUIRKS_H
|
||||||
|
#define _QUIRKS_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <SupportDefs.h>
|
||||||
|
|
||||||
|
|
||||||
|
void quirks_init();
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _QUIRKS_H */
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
#include "console.h"
|
#include "console.h"
|
||||||
#include "efi_platform.h"
|
#include "efi_platform.h"
|
||||||
#include "mmu.h"
|
#include "mmu.h"
|
||||||
|
#include "quirks.h"
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "smp.h"
|
#include "smp.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
@@ -150,6 +151,9 @@ platform_start_kernel(void)
|
|||||||
+ KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE;
|
+ KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE;
|
||||||
dprintf("Kernel stack at %#lx\n", gKernelArgs.cpu_kstack[0].start);
|
dprintf("Kernel stack at %#lx\n", gKernelArgs.cpu_kstack[0].start);
|
||||||
|
|
||||||
|
// Apply any weird EFI quirks
|
||||||
|
quirks_init();
|
||||||
|
|
||||||
// Prepare to exit EFI boot services.
|
// Prepare to exit EFI boot services.
|
||||||
// Read the memory map.
|
// Read the memory map.
|
||||||
// First call is to determine the buffer size.
|
// First call is to determine the buffer size.
|
||||||
|
|||||||
Reference in New Issue
Block a user