150 lines
4.4 KiB
Diff
150 lines
4.4 KiB
Diff
|
From c19cef4b4a61c82ba9a2c323659a20ec5d1d7ba2 Mon Sep 17 00:00:00 2001
|
||
|
From: Peter Jones <pjones@redhat.com>
|
||
|
Date: Thu, 26 Sep 2013 09:44:50 -0400
|
||
|
Subject: [PATCH] MokManager needs to disable the graphics console.
|
||
|
|
||
|
Without this patch, on some machines we never see MokManager's UI. This
|
||
|
protocol has never (I think?) been officially published, and yet I still
|
||
|
have new hardware that needs it.
|
||
|
|
||
|
If you're looking for a reference, look at:
|
||
|
|
||
|
EdkCompatibilityPkg/Foundation/Protocol/ConsoleControl/ConsoleControl.c
|
||
|
|
||
|
in the edk2 tree from Tiano.
|
||
|
|
||
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
||
|
---
|
||
|
Makefile | 2 +-
|
||
|
MokManager.c | 32 ++++++++++++++++++++++++++++++++
|
||
|
console_control.h | 44 ++++++++++++++++++++++++++++++++++++++++++++
|
||
|
3 files changed, 77 insertions(+), 1 deletion(-)
|
||
|
create mode 100644 console_control.h
|
||
|
|
||
|
diff --git a/Makefile b/Makefile
|
||
|
index 77f3e52..1e4aed8 100644
|
||
|
--- a/Makefile
|
||
|
+++ b/Makefile
|
||
|
@@ -37,7 +37,7 @@ OBJS = shim.o netboot.o cert.o dbx.o
|
||
|
KEYS = shim_cert.h ocsp.* ca.* shim.crt shim.csr shim.p12 shim.pem shim.key
|
||
|
SOURCES = shim.c shim.h netboot.c signature.h PeImage.h
|
||
|
MOK_OBJS = MokManager.o PasswordCrypt.o crypt_blowfish.o
|
||
|
-MOK_SOURCES = MokManager.c shim.h PasswordCrypt.c PasswordCrypt.h crypt_blowfish.c crypt_blowfish.h
|
||
|
+MOK_SOURCES = MokManager.c shim.h console_control.h PasswordCrypt.c PasswordCrypt.h crypt_blowfish.c crypt_blowfish.h
|
||
|
FALLBACK_OBJS = fallback.o
|
||
|
FALLBACK_SRCS = fallback.c
|
||
|
|
||
|
diff --git a/MokManager.c b/MokManager.c
|
||
|
index 604129f..01362f2 100644
|
||
|
--- a/MokManager.c
|
||
|
+++ b/MokManager.c
|
||
|
@@ -6,6 +6,7 @@
|
||
|
#include "signature.h"
|
||
|
#include "PeImage.h"
|
||
|
#include "PasswordCrypt.h"
|
||
|
+#include "console_control.h"
|
||
|
|
||
|
#include "include/console.h"
|
||
|
#include "include/simple_file.h"
|
||
|
@@ -1741,6 +1742,34 @@ static EFI_STATUS check_mok_request(EFI_HANDLE image_handle)
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
+static VOID setup_console (int text)
|
||
|
+{
|
||
|
+ EFI_STATUS status;
|
||
|
+ EFI_GUID console_control_guid = EFI_CONSOLE_CONTROL_PROTOCOL_GUID;
|
||
|
+ EFI_CONSOLE_CONTROL_PROTOCOL *concon;
|
||
|
+ static EFI_CONSOLE_CONTROL_SCREEN_MODE mode =
|
||
|
+ EfiConsoleControlScreenGraphics;
|
||
|
+ EFI_CONSOLE_CONTROL_SCREEN_MODE new_mode;
|
||
|
+
|
||
|
+ status = LibLocateProtocol(&console_control_guid, (VOID **)&concon);
|
||
|
+ if (status != EFI_SUCCESS)
|
||
|
+ return;
|
||
|
+
|
||
|
+ if (text) {
|
||
|
+ new_mode = EfiConsoleControlScreenText;
|
||
|
+
|
||
|
+ status = uefi_call_wrapper(concon->GetMode, 4, concon, &mode,
|
||
|
+ 0, 0);
|
||
|
+ /* If that didn't work, assume it's graphics */
|
||
|
+ if (status != EFI_SUCCESS)
|
||
|
+ mode = EfiConsoleControlScreenGraphics;
|
||
|
+ } else {
|
||
|
+ new_mode = mode;
|
||
|
+ }
|
||
|
+
|
||
|
+ uefi_call_wrapper(concon->SetMode, 2, concon, new_mode);
|
||
|
+}
|
||
|
+
|
||
|
static EFI_STATUS setup_rand (void)
|
||
|
{
|
||
|
EFI_TIME time;
|
||
|
@@ -1772,9 +1801,12 @@ EFI_STATUS efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab)
|
||
|
|
||
|
InitializeLib(image_handle, systab);
|
||
|
|
||
|
+ setup_console(1);
|
||
|
+
|
||
|
setup_rand();
|
||
|
|
||
|
efi_status = check_mok_request(image_handle);
|
||
|
|
||
|
+ setup_console(0);
|
||
|
return efi_status;
|
||
|
}
|
||
|
diff --git a/console_control.h b/console_control.h
|
||
|
new file mode 100644
|
||
|
index 0000000..5fb8a4a
|
||
|
--- /dev/null
|
||
|
+++ b/console_control.h
|
||
|
@@ -0,0 +1,44 @@
|
||
|
+#ifndef _SHIM_CONSOLE_CONTROL_H
|
||
|
+#define _SHIM_CONSOLE_CONTROL_H 1
|
||
|
+
|
||
|
+#define EFI_CONSOLE_CONTROL_PROTOCOL_GUID \
|
||
|
+ { 0xf42f7782, 0x12e, 0x4c12, {0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21} }
|
||
|
+
|
||
|
+typedef struct _EFI_CONSOLE_CONTROL_PROTOCOL EFI_CONSOLE_CONTROL_PROTOCOL;
|
||
|
+
|
||
|
+typedef enum {
|
||
|
+ EfiConsoleControlScreenText,
|
||
|
+ EfiConsoleControlScreenGraphics,
|
||
|
+ EfiConsoleControlScreenMaxValue
|
||
|
+} EFI_CONSOLE_CONTROL_SCREEN_MODE;
|
||
|
+
|
||
|
+typedef
|
||
|
+EFI_STATUS
|
||
|
+(EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE) (
|
||
|
+ IN EFI_CONSOLE_CONTROL_PROTOCOL *This,
|
||
|
+ OUT EFI_CONSOLE_CONTROL_SCREEN_MODE *Mode,
|
||
|
+ OUT BOOLEAN *GopUgaExists, OPTIONAL
|
||
|
+ OUT BOOLEAN *StdInLocked OPTIONAL
|
||
|
+ );
|
||
|
+
|
||
|
+typedef
|
||
|
+EFI_STATUS
|
||
|
+(EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE) (
|
||
|
+ IN EFI_CONSOLE_CONTROL_PROTOCOL *This,
|
||
|
+ IN EFI_CONSOLE_CONTROL_SCREEN_MODE Mode
|
||
|
+ );
|
||
|
+
|
||
|
+typedef
|
||
|
+EFI_STATUS
|
||
|
+(EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN) (
|
||
|
+ IN EFI_CONSOLE_CONTROL_PROTOCOL *This,
|
||
|
+ IN CHAR16 *Password
|
||
|
+ );
|
||
|
+
|
||
|
+struct _EFI_CONSOLE_CONTROL_PROTOCOL {
|
||
|
+ EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE GetMode;
|
||
|
+ EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE SetMode;
|
||
|
+ EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN LockStdIn;
|
||
|
+};
|
||
|
+
|
||
|
+#endif /* _SHIM_CONSOLE_CONTROL_H */
|
||
|
--
|
||
|
1.8.1.4
|
||
|
|