From 0f34a051104e2b1b9123d56d48673de4b21bc533 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Wed, 21 Oct 2015 12:44:12 +0000 Subject: OvmfPkg: XenPvBlkDxe: handle empty cdrom drives Empty cdroms are not going to connect, avoid waiting for the backend to switch to state 4, which is never going to happen, and return error instead from XenPvBlockFrontInitialization(). Detect an empty cdrom by looking at the "params" node on xenstore, which is set to "" or "aio:" for empty drives by libxl. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Stefano Stabellini Reviewed-by: Laszlo Ersek git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18651 6f19259b-4bc3-4df7-8a09-765794883524 --- OvmfPkg/XenPvBlkDxe/BlockFront.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'OvmfPkg/XenPvBlkDxe') diff --git a/OvmfPkg/XenPvBlkDxe/BlockFront.c b/OvmfPkg/XenPvBlkDxe/BlockFront.c index 256ac55..d07e980 100644 --- a/OvmfPkg/XenPvBlkDxe/BlockFront.c +++ b/OvmfPkg/XenPvBlkDxe/BlockFront.c @@ -169,6 +169,7 @@ XenPvBlockFrontInitialization ( XEN_BLOCK_FRONT_DEVICE *Dev; XenbusState State; UINT64 Value; + CHAR8 *Params; ASSERT (NodeName != NULL); @@ -186,6 +187,20 @@ XenPvBlockFrontInitialization ( } FreePool (DeviceType); + if (Dev->MediaInfo.CdRom) { + Status = XenBusIo->XsBackendRead (XenBusIo, XST_NIL, "params", (VOID**)&Params); + if (Status != XENSTORE_STATUS_SUCCESS) { + DEBUG ((EFI_D_ERROR, "%a: Failed to read params (%d)\n", __FUNCTION__, Status)); + goto Error; + } + if (AsciiStrLen (Params) == 0 || AsciiStrCmp (Params, "aio:") == 0) { + FreePool (Params); + DEBUG ((EFI_D_INFO, "%a: Empty cdrom\n", __FUNCTION__)); + goto Error; + } + FreePool (Params); + } + Status = XenBusReadUint64 (XenBusIo, "backend-id", FALSE, &Value); if (Status != XENSTORE_STATUS_SUCCESS || Value > MAX_UINT16) { DEBUG ((EFI_D_ERROR, "XenPvBlk: Failed to get backend-id (%d)\n", -- cgit v1.1