OcConsoleLib: Add console behaviour setting API

This commit is contained in:
vit9696 2019-05-01 15:42:49 +03:00
parent dbb63a6cb4
commit df92113868
4 changed files with 119 additions and 53 deletions

View File

@ -206,7 +206,9 @@
_(BOOLEAN , ShowPicker , , FALSE , ()) \
_(UINT32 , Timeout , , 0 , ()) \
_(OC_STRING , Resolution , , OC_STRING_CONSTR ("", _, __), OC_DESTR (OC_STRING)) \
_(OC_STRING , ConsoleMode , , OC_STRING_CONSTR ("", _, __), OC_DESTR (OC_STRING))
_(OC_STRING , ConsoleMode , , OC_STRING_CONSTR ("", _, __), OC_DESTR (OC_STRING)) \
_(OC_STRING , ConsoleBehaviourOs , , OC_STRING_CONSTR ("", _, __), OC_DESTR (OC_STRING)) \
_(OC_STRING , ConsoleBehaviourUi , , OC_STRING_CONSTR ("", _, __), OC_DESTR (OC_STRING))
OC_DECLARE (OC_MISC_BOOT)
#define OC_MISC_DEBUG_FIELDS(_, __) \
@ -274,8 +276,7 @@
_(BOOLEAN , ReleaseUsbOwnership , , FALSE , ()) \
_(BOOLEAN , RequestBootVarRouting , , FALSE , ()) \
_(BOOLEAN , ProvideConsoleControl , , FALSE , ()) \
_(BOOLEAN , ProvideConsoleGop , , FALSE , ()) \
_(OC_STRING , SetConsoleControl , , OC_STRING_CONSTR ("", _, __), OC_DESTR (OC_STRING) )
_(BOOLEAN , ProvideConsoleGop , , FALSE , ())
OC_DECLARE (OC_UEFI_QUIRKS)
/**

View File

@ -20,26 +20,36 @@
**/
typedef enum {
OcConsoleControlDefault,
OcConsoleControlGraphics,
OcConsoleControlText,
OcConsoleControlForceGraphics,
OcConsoleControlGraphics,
OcConsoleControlForceText,
OcConsoleControlForceGraphics,
} OC_CONSOLE_CONTROL_BEHAVIOUR;
/**
Configure console control protocol with given options.
@param[in] Behaviour Custom console behaviour.
@param[in] IgnoreTextOutput Skip console output in text mode.
@retval EFI_SUCCESS on success.
**/
EFI_STATUS
ConfigureConsoleControl (
IN OC_CONSOLE_CONTROL_BEHAVIOUR Behaviour,
ConsoleControlConfigure (
IN BOOLEAN IgnoreTextOutput
);
/**
Configure console control behaviour.
@param[in] Behaviour Custom console behaviour.
@retval EFI_SUCCESS on success.
**/
EFI_STATUS
ConsoleControlSetBehaviour (
IN OC_CONSOLE_CONTROL_BEHAVIOUR Behaviour
);
/**
Parse screen resolution from string.

View File

@ -240,6 +240,8 @@ STATIC
OC_SCHEMA
mMiscConfigurationBootSchema[] = {
OC_SCHEMA_STRING_IN ("ConsoleMode", OC_GLOBAL_CONFIG, Misc.Boot.ConsoleMode),
OC_SCHEMA_STRING_IN ("ConsoleBehaviourOs",OC_GLOBAL_CONFIG, Misc.Boot.ConsoleBehaviourOs),
OC_SCHEMA_STRING_IN ("ConsoleBehaviourUi",OC_GLOBAL_CONFIG, Misc.Boot.ConsoleBehaviourUi),
OC_SCHEMA_BOOLEAN_IN ("HideSelf", OC_GLOBAL_CONFIG, Misc.Boot.HideSelf),
OC_SCHEMA_BOOLEAN_IN ("ReinstallProtocol", OC_GLOBAL_CONFIG, Misc.Boot.ReinstallProtocol),
OC_SCHEMA_STRING_IN ("Resolution", OC_GLOBAL_CONFIG, Misc.Boot.Resolution),
@ -404,8 +406,7 @@ mUefiQuirksSchema[] = {
OC_SCHEMA_BOOLEAN_IN ("ProvideConsoleControl", OC_GLOBAL_CONFIG, Uefi.Quirks.ProvideConsoleControl),
OC_SCHEMA_BOOLEAN_IN ("ProvideConsoleGop", OC_GLOBAL_CONFIG, Uefi.Quirks.ProvideConsoleGop),
OC_SCHEMA_BOOLEAN_IN ("ReleaseUsbOwnership", OC_GLOBAL_CONFIG, Uefi.Quirks.ReleaseUsbOwnership),
OC_SCHEMA_BOOLEAN_IN ("RequestBootVarRouting", OC_GLOBAL_CONFIG, Uefi.Quirks.RequestBootVarRouting),
OC_SCHEMA_STRING_IN ("SetConsoleControl", OC_GLOBAL_CONFIG, Uefi.Quirks.SetConsoleControl),
OC_SCHEMA_BOOLEAN_IN ("RequestBootVarRouting", OC_GLOBAL_CONFIG, Uefi.Quirks.RequestBootVarRouting)
};
STATIC

View File

@ -24,14 +24,30 @@
#include <Library/OcGuardLib.h>
#include <Library/UefiBootServicesTableLib.h>
STATIC EFI_CONSOLE_CONTROL_SCREEN_MODE mConsoleMode = EfiConsoleControlScreenText;
//
// Current reported console mode.
//
STATIC
EFI_CONSOLE_CONTROL_SCREEN_MODE
mConsoleMode = EfiConsoleControlScreenText;
STATIC OC_CONSOLE_CONTROL_BEHAVIOUR mConsoleBehaviour = OcConsoleControlDefault;
//
// Stick to previously set console mode.
//
STATIC
BOOLEAN
mForceConsoleMode = FALSE;
//
// Original text output function.
//
STATIC
EFI_TEXT_STRING
mOriginalOutputString;
//
// Original console control protocol functions.
//
STATIC
EFI_CONSOLE_CONTROL_PROTOCOL
mOriginalConsoleControlProtocol;
@ -63,10 +79,7 @@ ConsoleControlGetMode (
{
EFI_STATUS Status;
if (mOriginalConsoleControlProtocol.GetMode != NULL
&& mConsoleBehaviour != OcConsoleControlForceGraphics
&& mConsoleBehaviour != OcConsoleControlForceText) {
if (mOriginalConsoleControlProtocol.GetMode != NULL && !mForceConsoleMode) {
Status = mOriginalConsoleControlProtocol.GetMode (
This,
Mode,
@ -102,12 +115,11 @@ ConsoleControlSetMode (
IN EFI_CONSOLE_CONTROL_SCREEN_MODE Mode
)
{
DEBUG ((DEBUG_INFO, "Setting mode %d -> %d\n", mConsoleMode, Mode));
mConsoleMode = Mode;
if (mOriginalConsoleControlProtocol.SetMode != NULL
&& mConsoleBehaviour != OcConsoleControlForceGraphics
&& mConsoleBehaviour != OcConsoleControlForceText) {
if (mOriginalConsoleControlProtocol.SetMode != NULL && !mForceConsoleMode) {
return mOriginalConsoleControlProtocol.SetMode (
This,
Mode
@ -144,24 +156,13 @@ mConsoleControlProtocol = {
};
EFI_STATUS
ConfigureConsoleControl (
IN OC_CONSOLE_CONTROL_BEHAVIOUR Behaviour,
IN BOOLEAN IgnoreTextOutput
ConsoleControlConfigure (
IN BOOLEAN IgnoreTextOutput
)
{
EFI_STATUS Status;
EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;
EFI_HANDLE NewHandle;
BOOLEAN WrapExisting;
WrapExisting = Behaviour != OcConsoleControlDefault || IgnoreTextOutput;
mConsoleBehaviour = Behaviour;
if (Behaviour == OcConsoleControlGraphics || Behaviour == OcConsoleControlForceGraphics) {
mConsoleMode = EfiConsoleControlScreenGraphics;
} else if (Behaviour == OcConsoleControlText || Behaviour == OcConsoleControlForceText) {
mConsoleMode = EfiConsoleControlScreenText;
}
Status = gBS->LocateProtocol (
&gEfiConsoleControlProtocolGuid,
@ -171,10 +172,9 @@ ConfigureConsoleControl (
DEBUG ((
DEBUG_INFO,
"OCC: Configuring behaviour %u ignore %d curr %r\n",
Behaviour,
IgnoreTextOutput,
Status
"OCC: Configuring console (%r) ignore %d\n",
Status,
IgnoreTextOutput
));
if (IgnoreTextOutput) {
@ -186,22 +186,16 @@ ConfigureConsoleControl (
// Native implementation exists, ignore.
//
if (!EFI_ERROR (Status)) {
if (WrapExisting) {
CopyMem (
&mOriginalConsoleControlProtocol,
ConsoleControl,
sizeof (mOriginalConsoleControlProtocol)
);
CopyMem (
ConsoleControl,
&mConsoleControlProtocol,
sizeof (mOriginalConsoleControlProtocol)
);
}
if (mConsoleBehaviour != OcConsoleControlDefault) {
mOriginalConsoleControlProtocol.SetMode (ConsoleControl, mConsoleMode);
}
CopyMem (
&mOriginalConsoleControlProtocol,
ConsoleControl,
sizeof (mOriginalConsoleControlProtocol)
);
CopyMem (
ConsoleControl,
&mConsoleControlProtocol,
sizeof (mOriginalConsoleControlProtocol)
);
return EFI_SUCCESS;
}
@ -217,6 +211,66 @@ ConfigureConsoleControl (
return Status;
}
EFI_STATUS
ConsoleControlSetBehaviour (
IN OC_CONSOLE_CONTROL_BEHAVIOUR Behaviour
)
{
EFI_STATUS Status;
EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;
DEBUG ((
DEBUG_INFO,
"OCC: Configuring behaviour %u\n",
Behaviour
));
if (Behaviour == OcConsoleControlDefault) {
return EFI_SUCCESS;
}
Status = gBS->LocateProtocol (
&gEfiConsoleControlProtocolGuid,
NULL,
(VOID *) &ConsoleControl
);
if (EFI_ERROR (Status)) {
return Status;
}
if (Behaviour == OcConsoleControlText) {
return ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);
}
if (Behaviour == OcConsoleControlGraphics) {
return ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenGraphics);
}
//
// We are setting a forced mode, do not let console changes.
//
mForceConsoleMode = TRUE;
if (Behaviour == OcConsoleControlForceText) {
mConsoleMode = EfiConsoleControlScreenText;
} else {
mConsoleMode = EfiConsoleControlScreenGraphics;
}
//
// Ensure that the mode is changed if original protocol is available.
//
if (mOriginalConsoleControlProtocol.SetMode != NULL) {
Status = mOriginalConsoleControlProtocol.SetMode (
ConsoleControl,
mConsoleMode
);
}
return Status;
}
/**
Parse resolution string.