**/\r
\r
#include "BdsPlatform.h"\r
+#include <Guid/XenInfo.h>\r
#include <Guid/RootBridgesConnectedEventGroup.h>\r
\r
\r
IoOr16 ((PciRead32 (Pmba) & ~BIT0) + 4, BIT0);\r
}\r
\r
+/**\r
+ This function detects if OVMF is running on Xen.\r
+\r
+**/\r
+STATIC\r
+BOOLEAN\r
+XenDetected (\r
+ VOID\r
+ )\r
+{\r
+ EFI_HOB_GUID_TYPE *GuidHob;\r
+ STATIC INTN FoundHob = -1;\r
+\r
+ if (FoundHob == 0) {\r
+ return FALSE;\r
+ } else if (FoundHob == 1) {\r
+ return TRUE;\r
+ }\r
+\r
+ //\r
+ // See if a XenInfo HOB is available\r
+ //\r
+ GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);\r
+ if (GuidHob == NULL) {\r
+ FoundHob = 0;\r
+ return FALSE;\r
+ }\r
+\r
+ FoundHob = 1;\r
+ return TRUE;\r
+}\r
\r
EFI_STATUS\r
EFIAPI\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
CHAR16 *DevPathStr;\r
\r
- if (IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE)) {\r
+ //\r
+ // Recognize PCI Mass Storage, and Xen PCI devices\r
+ //\r
+ if (IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE) ||\r
+ (XenDetected() && IS_CLASS2 (PciHeader, 0xFF, 0x80))) {\r
DevicePath = NULL;\r
Status = gBS->HandleProtocol (\r
Handle,\r
if (DevPathStr != NULL) {\r
DEBUG((\r
EFI_D_INFO,\r
- "Found Mass Storage device: %s\n",\r
+ "Found %s device: %s\n",\r
+ IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE) ? L"Mass Storage" : L"Xen",\r
DevPathStr\r
));\r
FreePool(DevPathStr);\r