}\r
}\r
\r
+/**\r
+ Disable NULL pointer detection\r
+*/\r
+VOID\r
+DisableNullDetection (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_GCD_MEMORY_SPACE_DESCRIPTOR Desc;\r
+\r
+ if ((PcdGet8 (PcdNullPointerDetectionPropertyMask) & BIT0) == 0) {\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Check current capabilities and attributes\r
+ //\r
+ Status = gDS->GetMemorySpaceDescriptor (0, &Desc);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Try to add EFI_MEMORY_RP support if necessary\r
+ //\r
+ if ((Desc.Capabilities & EFI_MEMORY_RP) == 0) {\r
+ Desc.Capabilities |= EFI_MEMORY_RP;\r
+ Status = gDS->SetMemorySpaceCapabilities (0, EFI_PAGES_TO_SIZE(1),\r
+ Desc.Capabilities);\r
+ ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Don't bother if EFI_MEMORY_RP is already cleared.\r
+ //\r
+ if ((Desc.Attributes & EFI_MEMORY_RP) != 0) {\r
+ Desc.Attributes &= ~EFI_MEMORY_RP;\r
+ Status = gDS->SetMemorySpaceAttributes (0, EFI_PAGES_TO_SIZE(1),\r
+ Desc.Attributes);\r
+ ASSERT_EFI_ERROR (Status);\r
+ } else {\r
+ DEBUG ((DEBUG_WARN, "!!! Page 0 is supposed to be disabled !!!\r\n"));\r
+ }\r
+}\r
+\r
+/**\r
+ Enable NULL pointer detection\r
+*/\r
+VOID\r
+EnableNullDetection (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_GCD_MEMORY_SPACE_DESCRIPTOR Desc;\r
+\r
+ if ((PcdGet8 (PcdNullPointerDetectionPropertyMask) & BIT0) == 0) {\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Check current capabilities and attributes\r
+ //\r
+ Status = gDS->GetMemorySpaceDescriptor (0, &Desc);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Try to add EFI_MEMORY_RP support if necessary\r
+ //\r
+ if ((Desc.Capabilities & EFI_MEMORY_RP) == 0) {\r
+ Desc.Capabilities |= EFI_MEMORY_RP;\r
+ Status = gDS->SetMemorySpaceCapabilities (0, EFI_PAGES_TO_SIZE(1),\r
+ Desc.Capabilities);\r
+ ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Don't bother if EFI_MEMORY_RP is already set.\r
+ //\r
+ if ((Desc.Attributes & EFI_MEMORY_RP) == 0) {\r
+ Desc.Attributes |= EFI_MEMORY_RP;\r
+ Status = gDS->SetMemorySpaceAttributes (0, EFI_PAGES_TO_SIZE(1),\r
+ Desc.Attributes);\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+}\r
+\r
/**\r
Timer event handler: read a series of key stroke from 8042\r
and put them into memory key buffer. \r
// 0 Right Shift pressed\r
\r
\r
+ //\r
+ // Disable NULL pointer detection temporarily\r
+ //\r
+ DisableNullDetection ();\r
+\r
//\r
// Clear the CTRL and ALT BDA flag\r
//\r
KbFlag1 &= ~0x0C; \r
*((UINT8 *) (UINTN) 0x417) = KbFlag1; \r
\r
+ //\r
+ // Restore NULL pointer detection\r
+ //\r
+ EnableNullDetection ();\r
\r
//\r
// Output EFI input key and shift/toggle state\r