mirror of https://github.com/acidanthera/audk.git
In BootScriptSaver, put INFORMATION_OPCODE message to LockBox.
In BootScriptExecutor, add code to display this INFORMATION_OPCODE message. Signed-off-by: jyao1 Reviewed-by: rsun3 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12735 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
9bb1fced77
commit
f6ec0c771a
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Interpret and execute the S3 data in S3 boot script.
|
Interpret and execute the S3 data in S3 boot script.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
|
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions
|
are licensed and made available under the terms and conditions
|
||||||
|
@ -1199,8 +1199,18 @@ BootScriptExecuteInformation (
|
||||||
)
|
)
|
||||||
|
|
||||||
{
|
{
|
||||||
UINT8 Index;
|
UINT32 Index;
|
||||||
for (Index = 0; Index < 10; Index++);
|
EFI_BOOT_SCRIPT_INFORMATION Information;
|
||||||
|
|
||||||
|
CopyMem ((VOID*)&Information, (VOID*)Script, sizeof(Information));
|
||||||
|
|
||||||
|
DEBUG ((EFI_D_INFO, "BootScriptExecuteInformation - 0x%08x\n", (UINTN)Information.Information));
|
||||||
|
|
||||||
|
DEBUG ((EFI_D_INFO, "BootScriptInformation: "));
|
||||||
|
for (Index = 0; Index < Information.InformationLength; Index++) {
|
||||||
|
DEBUG ((EFI_D_INFO, "%02x ", *(UINT8 *)(UINTN)(Information.Information + Index)));
|
||||||
|
}
|
||||||
|
DEBUG ((EFI_D_INFO, "\n"));
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
calculate the mask value for 'and' and 'or' operation
|
calculate the mask value for 'and' and 'or' operation
|
||||||
|
|
|
@ -54,6 +54,10 @@ EFI_GUID mBootScriptHeaderDataGuid = {
|
||||||
0x1810ab4a, 0x2314, 0x4df6, 0x81, 0xeb, 0x67, 0xc6, 0xec, 0x5, 0x85, 0x91
|
0x1810ab4a, 0x2314, 0x4df6, 0x81, 0xeb, 0x67, 0xc6, 0xec, 0x5, 0x85, 0x91
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EFI_GUID mBootScriptInformationGuid = {
|
||||||
|
0x2c680508, 0x2b87, 0x46ab, 0xb9, 0x8a, 0x49, 0xfc, 0x23, 0xf9, 0xf5, 0x95
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This is an internal function to add a terminate node the entry, recalculate the table
|
This is an internal function to add a terminate node the entry, recalculate the table
|
||||||
length and fill into the table.
|
length and fill into the table.
|
||||||
|
@ -99,6 +103,113 @@ S3BootScriptInternalCloseTable (
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function return the total size of INFORMATION OPCODE in boot script table.
|
||||||
|
|
||||||
|
@return InformationBufferSize The total size of INFORMATION OPCODE in boot script table.
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
GetBootScriptInformationBufferSize (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINT8 *S3TableBase;
|
||||||
|
UINT8 *Script;
|
||||||
|
UINTN TableLength;
|
||||||
|
EFI_BOOT_SCRIPT_COMMON_HEADER ScriptHeader;
|
||||||
|
EFI_BOOT_SCRIPT_TABLE_HEADER TableHeader;
|
||||||
|
EFI_BOOT_SCRIPT_INFORMATION Information;
|
||||||
|
UINTN InformationBufferSize;
|
||||||
|
|
||||||
|
InformationBufferSize = 0;
|
||||||
|
|
||||||
|
S3TableBase = mS3BootScriptTablePtr->TableBase;
|
||||||
|
Script = S3TableBase;
|
||||||
|
CopyMem ((VOID*)&TableHeader, Script, sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER));
|
||||||
|
TableLength = TableHeader.TableLength;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Go through the ScriptTable
|
||||||
|
//
|
||||||
|
while ((UINTN) Script < (UINTN) (S3TableBase + TableLength)) {
|
||||||
|
CopyMem ((VOID*)&ScriptHeader, Script, sizeof(EFI_BOOT_SCRIPT_COMMON_HEADER));
|
||||||
|
switch (ScriptHeader.OpCode) {
|
||||||
|
case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
|
||||||
|
CopyMem ((VOID*)&Information, (VOID*)Script, sizeof(Information));
|
||||||
|
InformationBufferSize += Information.InformationLength;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Script = Script + ScriptHeader.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return InformationBufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function fix INFORMATION OPCODE in boot script table.
|
||||||
|
Originally, the Information buffer is pointer to EfiRuntimeServicesCode,
|
||||||
|
EfiRuntimeServicesData, or EfiACPIMemoryNVS. They are seperated.
|
||||||
|
Now, in order to save it to LockBox, we allocate a big EfiACPIMemoryNVS,
|
||||||
|
and fix the pointer for INFORMATION opcode InformationBuffer.
|
||||||
|
|
||||||
|
@param InformationBuffer The address of new Information buffer.
|
||||||
|
@param InformationBufferSize The size of new Information buffer.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
FixBootScriptInformation (
|
||||||
|
IN VOID *InformationBuffer,
|
||||||
|
IN UINTN InformationBufferSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINT8 *S3TableBase;
|
||||||
|
UINT8 *Script;
|
||||||
|
UINTN TableLength;
|
||||||
|
EFI_BOOT_SCRIPT_COMMON_HEADER ScriptHeader;
|
||||||
|
EFI_BOOT_SCRIPT_TABLE_HEADER TableHeader;
|
||||||
|
EFI_BOOT_SCRIPT_INFORMATION Information;
|
||||||
|
UINTN FixedInformationBufferSize;
|
||||||
|
|
||||||
|
FixedInformationBufferSize = 0;
|
||||||
|
|
||||||
|
S3TableBase = mS3BootScriptTablePtr->TableBase;
|
||||||
|
Script = S3TableBase;
|
||||||
|
CopyMem ((VOID*)&TableHeader, Script, sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER));
|
||||||
|
TableLength = TableHeader.TableLength;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Go through the ScriptTable
|
||||||
|
//
|
||||||
|
while ((UINTN) Script < (UINTN) (S3TableBase + TableLength)) {
|
||||||
|
CopyMem ((VOID*)&ScriptHeader, Script, sizeof(EFI_BOOT_SCRIPT_COMMON_HEADER));
|
||||||
|
switch (ScriptHeader.OpCode) {
|
||||||
|
case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:
|
||||||
|
CopyMem ((VOID*)&Information, (VOID*)Script, sizeof(Information));
|
||||||
|
|
||||||
|
CopyMem (
|
||||||
|
(VOID *)((UINTN)InformationBuffer + FixedInformationBufferSize),
|
||||||
|
(VOID *)(UINTN)Information.Information,
|
||||||
|
Information.InformationLength
|
||||||
|
);
|
||||||
|
gBS->FreePool ((VOID *)(UINTN)Information.Information);
|
||||||
|
Information.Information = (EFI_PHYSICAL_ADDRESS)((UINTN)InformationBuffer + FixedInformationBufferSize);
|
||||||
|
|
||||||
|
CopyMem ((VOID*)Script, (VOID*)&Information, sizeof(Information));
|
||||||
|
|
||||||
|
FixedInformationBufferSize += Information.InformationLength;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Script = Script + ScriptHeader.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT (FixedInformationBufferSize == InformationBufferSize);
|
||||||
|
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function save boot script data to LockBox.
|
This function save boot script data to LockBox.
|
||||||
1. BootSriptPrivate data, BootScript data - Image and DispatchContext are handled by platform.
|
1. BootSriptPrivate data, BootScript data - Image and DispatchContext are handled by platform.
|
||||||
|
@ -111,7 +222,45 @@ SaveBootScriptDataToLockBox (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
EFI_PHYSICAL_ADDRESS InformationBuffer;
|
||||||
|
UINTN InformationBufferSize;
|
||||||
|
|
||||||
|
//
|
||||||
|
// We need save BootScriptInformation to LockBox, because it is in
|
||||||
|
// EfiRuntimeServicesCode, EfiRuntimeServicesData, or EfiACPIMemoryNVS.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
InformationBufferSize = GetBootScriptInformationBufferSize ();
|
||||||
|
if (InformationBufferSize != 0) {
|
||||||
|
InformationBuffer = 0xFFFFFFFF;
|
||||||
|
Status = gBS->AllocatePages (
|
||||||
|
AllocateMaxAddress,
|
||||||
|
EfiACPIMemoryNVS,
|
||||||
|
EFI_SIZE_TO_PAGES(InformationBufferSize),
|
||||||
|
&InformationBuffer
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fix BootScript information pointer
|
||||||
|
//
|
||||||
|
FixBootScriptInformation ((VOID *)(UINTN)InformationBuffer, InformationBufferSize);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Save BootScript information to lockbox
|
||||||
|
//
|
||||||
|
Status = SaveLockBox (
|
||||||
|
&mBootScriptInformationGuid,
|
||||||
|
(VOID *)(UINTN)InformationBuffer,
|
||||||
|
InformationBufferSize
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
Status = SetLockBoxAttributes (&mBootScriptInformationGuid, LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// mS3BootScriptTablePtr->TableLength does not include EFI_BOOT_SCRIPT_TERMINATE, because we need add entry at runtime.
|
// mS3BootScriptTablePtr->TableLength does not include EFI_BOOT_SCRIPT_TERMINATE, because we need add entry at runtime.
|
||||||
// Save all info here, just in case that no one will add boot script entry in SMM.
|
// Save all info here, just in case that no one will add boot script entry in SMM.
|
||||||
|
@ -1237,7 +1386,7 @@ S3BootScriptSaveInformation (
|
||||||
RETURN_STATUS Status;
|
RETURN_STATUS Status;
|
||||||
UINT8 Length;
|
UINT8 Length;
|
||||||
UINT8 *Script;
|
UINT8 *Script;
|
||||||
EFI_PHYSICAL_ADDRESS Buffer;
|
VOID *Buffer;
|
||||||
EFI_BOOT_SCRIPT_INFORMATION ScriptInformation;
|
EFI_BOOT_SCRIPT_INFORMATION ScriptInformation;
|
||||||
|
|
||||||
if (mS3BootScriptTablePtr->AtRuntime) {
|
if (mS3BootScriptTablePtr->AtRuntime) {
|
||||||
|
@ -1245,11 +1394,13 @@ S3BootScriptSaveInformation (
|
||||||
}
|
}
|
||||||
Length = (UINT8)(sizeof (EFI_BOOT_SCRIPT_INFORMATION));
|
Length = (UINT8)(sizeof (EFI_BOOT_SCRIPT_INFORMATION));
|
||||||
|
|
||||||
Buffer = 0xFFFFFFFF;
|
//
|
||||||
Status = gBS->AllocatePages (
|
// Use BootServicesData to hold the data, just in case caller free it.
|
||||||
AllocateMaxAddress,
|
// It will be copied into ACPINvs later.
|
||||||
EfiACPIMemoryNVS,
|
//
|
||||||
EFI_SIZE_TO_PAGES(InformationLength),
|
Status = gBS->AllocatePool (
|
||||||
|
EfiBootServicesData,
|
||||||
|
InformationLength,
|
||||||
&Buffer
|
&Buffer
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
|
Loading…
Reference in New Issue