mirror of
https://git.proxmox.com/git/efi-boot-shim
synced 2025-08-03 01:55:21 +00:00
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>
This commit is contained in:
parent
5ccacd3a48
commit
a869915a1d
2
Makefile
2
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
|
||||
MOK_SOURCES = MokManager.c shim.h
|
||||
MOK_SOURCES = MokManager.c shim.h console_control.h
|
||||
FALLBACK_OBJS = fallback.o
|
||||
FALLBACK_SRCS = fallback.c
|
||||
|
||||
|
32
MokManager.c
32
MokManager.c
@ -5,6 +5,7 @@
|
||||
#include "shim.h"
|
||||
#include "signature.h"
|
||||
#include "PeImage.h"
|
||||
#include "console_control.h"
|
||||
|
||||
#define PASSWORD_MAX 16
|
||||
#define PASSWORD_MIN 8
|
||||
@ -1894,6 +1895,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;
|
||||
@ -1925,9 +1954,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;
|
||||
}
|
||||
|
44
console_control.h
Normal file
44
console_control.h
Normal file
@ -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 */
|
Loading…
Reference in New Issue
Block a user