mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
OcConsoleLib: Add console behaviour setting API
This commit is contained in:
parent
dbb63a6cb4
commit
df92113868
@ -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)
|
||||
|
||||
/**
|
||||
|
||||
@ -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.
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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.
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user