Hi, Laszlo Shall we cleanup all of APIs in UefiScsiLib? Looks like TEST_UNIT_READY, INQUIRY, MODE_SENSE, REQUEST_SENSE and READ_CAPACITY cmds all have same issue.
Thanks Feng -----Original Message----- From: Laszlo Ersek [mailto:ler...@redhat.com] Sent: Tuesday, November 25, 2014 18:47 To: edk2-devel@lists.sourceforge.net Subject: Re: [edk2] [PATCH v2] MdePkg: UefiScsiLib: do not encode LUN in CDB for READ and WRITE On 11/24/14 20:34, Laszlo Ersek wrote: > The "SCSI Block Commands - 2" (SBC-2) standard defines bits [7:5] of > the CDB byte 1 as Reserved, for the READ and WRITE commands. > > The updated "SCSI Block Commands - 3" (SBC-3) standard defines the > same bitfield as RDPROTECT and WRPROTECT, respectively. > > After reviewing the above standards, and the following commits: > - SVN r8331 (git 676e2a32), > - SVN r8334 (git 6b3ecf5c), > we've determined that UefiScsiLib is incorrect in encoding the LUN in > this bitfield for the READ and WRITE commands. > > Encoding a nonzero LUN there creates unintended RDPROTECT and > WRPROTECT values, which the recipient device is required to reject if > it does not support protection information, with CHECK CONDITION, > ILLEGAL REQUEST, INVALID FIELD IN CDB: > > ScsiDiskRead10: Check Condition happened! > ScsiDisk: Sense Key = 0x5 ASC = 0x24! > ScsiDiskRead10: Check Condition happened! > ScsiDisk: Sense Key = 0x5 ASC = 0x24! > ScsiDiskRead10: Check Condition happened! > ScsiDisk: Sense Key = 0x5 ASC = 0x24! > ScsiDiskRead10: Check Condition happened! > ScsiDisk: Sense Key = 0x5 ASC = 0x24! > FatOpenDevice: read of part_lba failed Device Error > > In practice this flaw breaks UefiScsiLib minimally on SCSI disks with > nonzero LUNs that are emulated by QEMU (after QEMU commit 96bdbbab, > part of v1.2.0). > > RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1166971 > Reported-by: Cole Robinson <crobi...@redhat.com> > Suggested-by: Paolo Bonzini <pbonz...@redhat.com> > Suggested-by: Feng Tian <feng.t...@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Laszlo Ersek <ler...@redhat.com> > --- > > Notes: > v2: > - permanently remove the LUN encoding [Paolo, Feng] > - > https://github.com/lersek/edk2/commits/bz1166971_rdwrvr_cdb_lun_encode > _v2 > > MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 4 ---- > 1 file changed, 4 deletions(-) > > diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c > b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c > index bd838c4..dc1847f 100644 > --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c > +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c > @@ -930,7 +930,6 @@ ScsiRead10Command ( > ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); > > Cdb[0] = EFI_SCSI_OP_READ10; > - Cdb[1] = (UINT8) (LShiftU64 (Lun, 5) & > EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK); > WriteUnaligned32 ((UINT32 *)&Cdb[2], SwapBytes32 (StartLba)); > WriteUnaligned16 ((UINT16 *)&Cdb[7], SwapBytes16 ((UINT16) > SectorSize)); > > @@ -1028,7 +1027,6 @@ ScsiWrite10Command ( > ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); > > Cdb[0] = EFI_SCSI_OP_WRITE10; > - Cdb[1] = (UINT8) (LShiftU64 (Lun, 5) & > EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK); > WriteUnaligned32 ((UINT32 *)&Cdb[2], SwapBytes32 (StartLba)); > WriteUnaligned16 ((UINT16 *)&Cdb[7], SwapBytes16 ((UINT16) > SectorSize)); > > @@ -1126,7 +1124,6 @@ ScsiRead16Command ( > ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); > > Cdb[0] = EFI_SCSI_OP_READ16; > - Cdb[1] = (UINT8) (LShiftU64 (Lun, 5) & > EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK); > WriteUnaligned64 ((UINT64 *)&Cdb[2], SwapBytes64 (StartLba)); > WriteUnaligned32 ((UINT32 *)&Cdb[10], SwapBytes32 (SectorSize)); > > @@ -1224,7 +1221,6 @@ ScsiWrite16Command ( > ScsiIo->GetDeviceLocation (ScsiIo, &Target, &Lun); > > Cdb[0] = EFI_SCSI_OP_WRITE16; > - Cdb[1] = (UINT8) (LShiftU64 (Lun, 5) & > EFI_SCSI_LOGICAL_UNIT_NUMBER_MASK); > WriteUnaligned64 ((UINT64 *)&Cdb[2], SwapBytes64 (StartLba)); > WriteUnaligned32 ((UINT32 *)&Cdb[10], SwapBytes32 (SectorSize)); > > Self-NAK, we can now kill a few dead variables and a dead function call too, as Feng indicated earlier; reverting a larger portion of SVN r8334. v3 coming up. Laszlo ------------------------------------------------------------------------------ Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration & more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration & more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel