IntelFrameworkModulePkg/Csm: Add code to bypass NULL pointer detection
Legacy has to access interrupt vector, BDA, etc. located in memory between 0-4095. To allow as much code as possible to be monitored by NULL pointer detection, we add code to temporarily disable this feature right before those memory access and enable it again afterwards. Cc: Star Zeng <star.zeng@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Michael Kinney <michael.d.kinney@intel.com> Cc: Ayellet Wolman <ayellet.wolman@intel.com> Suggested-by: Ayellet Wolman <ayellet.wolman@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jian J Wang <jian.j.wang@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
@@ -1073,8 +1073,10 @@ GenericLegacyBoot (
|
||||
// Use 182/10 to avoid floating point math.
|
||||
//
|
||||
LocalTime = (LocalTime * 182) / 10;
|
||||
DisableNullDetection ();
|
||||
BdaPtr = (UINT32 *) (UINTN)0x46C;
|
||||
*BdaPtr = LocalTime;
|
||||
EnableNullDetection ();
|
||||
|
||||
//
|
||||
// Shadow PCI ROMs. We must do this near the end since this will kick
|
||||
@@ -1320,6 +1322,7 @@ GenericLegacyBoot (
|
||||
// set of TIANO vectors) or takes it over.
|
||||
//
|
||||
//
|
||||
DisableNullDetection ();
|
||||
BaseVectorMaster = (UINT32 *) (sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER);
|
||||
for (Index = 0; Index < 8; Index++) {
|
||||
Private->ThunkSavedInt[Index] = BaseVectorMaster[Index];
|
||||
@@ -1327,6 +1330,7 @@ GenericLegacyBoot (
|
||||
BaseVectorMaster[Index] = (UINT32) (Private->BiosUnexpectedInt);
|
||||
}
|
||||
}
|
||||
EnableNullDetection ();
|
||||
|
||||
ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET));
|
||||
Regs.X.AX = Legacy16Boot;
|
||||
@@ -1340,10 +1344,12 @@ GenericLegacyBoot (
|
||||
0
|
||||
);
|
||||
|
||||
DisableNullDetection ();
|
||||
BaseVectorMaster = (UINT32 *) (sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER);
|
||||
for (Index = 0; Index < 8; Index++) {
|
||||
BaseVectorMaster[Index] = Private->ThunkSavedInt[Index];
|
||||
}
|
||||
EnableNullDetection ();
|
||||
}
|
||||
Private->LegacyBootEntered = TRUE;
|
||||
if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) {
|
||||
@@ -1731,9 +1737,11 @@ LegacyBiosBuildE820 (
|
||||
//
|
||||
// First entry is 0 to (640k - EBDA)
|
||||
//
|
||||
DisableNullDetection ();
|
||||
E820Table[0].BaseAddr = 0;
|
||||
E820Table[0].Length = (UINT64) ((*(UINT16 *) (UINTN)0x40E) << 4);
|
||||
E820Table[0].Type = EfiAcpiAddressRangeMemory;
|
||||
EnableNullDetection ();
|
||||
|
||||
//
|
||||
// Second entry is (640k - EBDA) to 640k
|
||||
@@ -1967,6 +1975,8 @@ LegacyBiosCompleteBdaBeforeBoot (
|
||||
UINT16 MachineConfig;
|
||||
DEVICE_PRODUCER_DATA_HEADER *SioPtr;
|
||||
|
||||
DisableNullDetection ();
|
||||
|
||||
Bda = (BDA_STRUC *) ((UINTN) 0x400);
|
||||
MachineConfig = 0;
|
||||
|
||||
@@ -2025,6 +2035,8 @@ LegacyBiosCompleteBdaBeforeBoot (
|
||||
MachineConfig = (UINT16) (MachineConfig + 0x00 + 0x02 + (SioPtr->MousePresent * 0x04));
|
||||
Bda->MachineConfig = MachineConfig;
|
||||
|
||||
EnableNullDetection ();
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -2049,15 +2061,20 @@ LegacyBiosUpdateKeyboardLedStatus (
|
||||
UINT8 LocalLeds;
|
||||
EFI_IA32_REGISTER_SET Regs;
|
||||
|
||||
Bda = (BDA_STRUC *) ((UINTN) 0x400);
|
||||
|
||||
Private = LEGACY_BIOS_INSTANCE_FROM_THIS (This);
|
||||
|
||||
DisableNullDetection ();
|
||||
|
||||
Bda = (BDA_STRUC *) ((UINTN) 0x400);
|
||||
LocalLeds = Leds;
|
||||
Bda->LedStatus = (UINT8) ((Bda->LedStatus &~0x07) | LocalLeds);
|
||||
LocalLeds = (UINT8) (LocalLeds << 4);
|
||||
Bda->ShiftStatus = (UINT8) ((Bda->ShiftStatus &~0x70) | LocalLeds);
|
||||
LocalLeds = (UINT8) (Leds & 0x20);
|
||||
Bda->KeyboardStatus = (UINT8) ((Bda->KeyboardStatus &~0x20) | LocalLeds);
|
||||
|
||||
EnableNullDetection ();
|
||||
|
||||
//
|
||||
// Call into Legacy16 code to allow it to do any processing
|
||||
//
|
||||
@@ -2102,7 +2119,9 @@ LegacyBiosCompleteStandardCmosBeforeBoot (
|
||||
// to large capacity drives
|
||||
// CMOS 14 = BDA 40:10 plus bit 3(display enabled)
|
||||
//
|
||||
DisableNullDetection ();
|
||||
Bda = (UINT8)(*((UINT8 *)((UINTN)0x410)) | BIT3);
|
||||
EnableNullDetection ();
|
||||
|
||||
//
|
||||
// Force display enabled
|
||||
|
Reference in New Issue
Block a user