+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+Virtio10AllocateSharedPages (\r
+ IN VIRTIO_DEVICE_PROTOCOL *This,\r
+ IN UINTN Pages,\r
+ IN OUT VOID **HostAddress\r
+ )\r
+{\r
+ VIRTIO_1_0_DEV *Dev;\r
+ EFI_STATUS Status;\r
+\r
+ Dev = VIRTIO_1_0_FROM_VIRTIO_DEVICE (This);\r
+\r
+ Status = Dev->PciIo->AllocateBuffer (\r
+ Dev->PciIo,\r
+ AllocateAnyPages,\r
+ EfiBootServicesData,\r
+ Pages,\r
+ HostAddress,\r
+ EFI_PCI_ATTRIBUTE_MEMORY_CACHED\r
+ );\r
+ return Status;\r
+}\r
+\r
+STATIC\r
+VOID\r
+EFIAPI\r
+Virtio10FreeSharedPages (\r
+ IN VIRTIO_DEVICE_PROTOCOL *This,\r
+ IN UINTN Pages,\r
+ IN VOID *HostAddress\r
+ )\r
+{\r
+ VIRTIO_1_0_DEV *Dev;\r
+\r
+ Dev = VIRTIO_1_0_FROM_VIRTIO_DEVICE (This);\r
+\r
+ Dev->PciIo->FreeBuffer (\r
+ Dev->PciIo,\r
+ Pages,\r
+ HostAddress\r
+ );\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+Virtio10MapSharedBuffer (\r
+ IN VIRTIO_DEVICE_PROTOCOL *This,\r
+ IN VIRTIO_MAP_OPERATION Operation,\r
+ IN VOID *HostAddress,\r
+ IN OUT UINTN *NumberOfBytes,\r
+ OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,\r
+ OUT VOID **Mapping\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ VIRTIO_1_0_DEV *Dev;\r
+ EFI_PCI_IO_PROTOCOL_OPERATION PciIoOperation;\r
+\r
+ Dev = VIRTIO_1_0_FROM_VIRTIO_DEVICE (This);\r
+\r
+ //\r
+ // Map VIRTIO_MAP_OPERATION to EFI_PCI_IO_PROTOCOL_OPERATION\r
+ //\r
+ switch (Operation) {\r
+ case VirtioOperationBusMasterRead:\r
+ PciIoOperation = EfiPciIoOperationBusMasterRead;\r
+ break;\r
+ case VirtioOperationBusMasterWrite:\r
+ PciIoOperation = EfiPciIoOperationBusMasterWrite;\r
+ break;\r
+ case VirtioOperationBusMasterCommonBuffer:\r
+ PciIoOperation = EfiPciIoOperationBusMasterCommonBuffer;\r
+ break;\r
+ default:\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Status = Dev->PciIo->Map (\r
+ Dev->PciIo,\r
+ PciIoOperation,\r
+ HostAddress,\r
+ NumberOfBytes,\r
+ DeviceAddress,\r
+ Mapping\r
+ );\r
+ return Status;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+Virtio10UnmapSharedBuffer (\r
+ IN VIRTIO_DEVICE_PROTOCOL *This,\r
+ IN VOID *Mapping\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ VIRTIO_1_0_DEV *Dev;\r
+\r
+ Dev = VIRTIO_1_0_FROM_VIRTIO_DEVICE (This);\r
+\r
+ Status = Dev->PciIo->Unmap (\r
+ Dev->PciIo,\r
+ Mapping\r
+ );\r
+\r
+ return Status;\r
+}\r