On Oct 30, 2014 10:42 AM, "Andrew Fish" <[email protected]> wrote:
>
>
>> On Oct 30, 2014, at 6:07 AM, Paulo Alcantara <[email protected]> wrote:
>>
>> Hi,
>>
>> On Thu, October 30, 2014 4:38 am, Tian, Feng wrote:
>>>
>>> Andrew,  no exact answer till now. Need dig into it further. I suppose
it
>>> should be something resembling Eltorito or hard drive device node.
>>
>>
>> I was thinking in something like this:
>>
>> typedef struct {
>> EFI_DEVICE_PATH_PROTOCOL  Header;
>> UINT64                    VolumeStart;
>> UINT64                    VolumeEnd;
>> } UDF_DEVICE_PATH;
>>
>
> Would we want to also record the 1st 7 bytes of the Volume Structure
Descriptor? Structure Type, Standard Identifier (5 bytes), and Structure
Version?
>

Right. So we wouldn't lack so much information on the device path.

> I think VolumeStart/VolumeEnd would be of type EFI_LBA.
>

Yes, I agree with you. I just tried to follow the type (UINT64) used in
CDROM_DEVICE_PATH.{PartitionStart,PartitionEnd} fields -- I start thinking
they are incorrect too, right?

>> Or it might be part of the hard drive device node and another flag (e.g.
>> SIGNATURE_TYPE_UDF) and added to HARDDRIVE_DEVICE_PATH.MBRType field.
>>
>>> Paulo, in your patch, you only handle BEA01, NSR02 and NSR03 volumes.
And
>>> from UDF 2.6 spec, looks like BOOT2 is not supported yet. Then how UDF
>>> supports bootable cd/dvd?
>>
>>
>> I wouldn't rely on those identifiers to decide whether the UDF volume is
>> bootable or not. If the firmware knows UDF filesystem (UdfDxe), and it
>> finds e.g. \EFI\BOOT\BOOTX64.EFI in it, then the volume is "bootable".
>>
>> Although, if we have an UDF bridge, then it would be better to let it
>> being parsed and handled by MdeModulePkg/PartitionDxe/ElTorito.c instead
>> (for the BIOS/EFI boot entries found in El Torito's boot catalogs).
>>
>
> We would probably need a description of how a UDF bridge and a pure UDF
environment would work.
>
> We would also need to define precedence. For example state that
\EFI\BOOT\BOOTX64.EFI  has priority over UDF bridge, if the platform
support UDF partitions.
>

OK. That would really clarify things a lot more. So, I am wondering where
exactly such definitions and/or documentations should go?

About the descriptions of UDF bridge and "conventional" UDF I would point
out to the OSTA and ECMA specifications, as long as the latter I would
expect more suggestions from the community.

> Thanks,
>
> Andrew Fish
>
>>>
>>> Thanks
>>> Feng
>>>
>>> -----Original Message-----
>>> From: Andrew Fish [mailto:[email protected]]
>>> Sent: Thursday, October 30, 2014 13:24
>>> To: [email protected]
>>> Subject: Re: [edk2] [PATCH RFC] MdeModulePkg/PartitionDxe: Add
>>> UDF/ECMA-167 filesystem support
>>>
>>>
>>>> On Oct 29, 2014, at 10:08 PM, Tian, Feng <[email protected]> wrote:
>>>>
>>>> Thanks for your great contribution, Paulo.
>>>>
>>>> For the device path issue, my personal idea is vendor device path may
>>>> not be a good idea and I prefer to introduce a new UDF device path
node.
>>>> But let's us wait other's comments at first.
>>>>
>>>
>>> What information would need to be present in an UDF device path node?
>>>
>>> Thanks,
>>>
>>> Andrew Fish
>>>
>>>> Thanks
>>>> Feng
>>>>
>>>> -----Original Message-----
>>>> From: Paulo Alcantara [mailto:[email protected]]
>>>> Sent: Thursday, October 30, 2014 10:53
>>>> To: [email protected]
>>>> Subject: [edk2] [PATCH RFC] MdeModulePkg/PartitionDxe: Add
>>>> UDF/ECMA-167 filesystem support
>>>>
>>>> This patch adds support to finding UDF/ECMA-167 volumes on disks by
>>>> looking at the UDF Standard Identifiers (BEA01, NSR02/NSR03, TEA01) and
>>>> the Anchor Volume Descriptor Pointer (AVDP) at LBAs 256, N - 256 or N.
>>>>
>>>> A new PcdsFeatureFlags (PcdUdfFileSystemSupport) has been added to
>>>> enable/disable such support -- it's disabled by default.
>>>>
>>>> I'm currently using VENDOR_DEVICE_PATH for UDF since there isn't any
>>>> defined for it yet. Should we create one specific for it? Or should we
>>>> keep using VENDOR_DEVICE_PATH?
>>>>
>>>> The tests were run under QEMU + OVMF:
>>>> $ qemu-kvm -m 1024 -L . -hda fat:hdd \
>>>> file=/dev/sdb,if=virtio,media=disk,cache=writeback \  -net none
>>>>
>>>> Where /dev/sdb is a external HDD previously formatted as an UDF
>>>> filesystem through the following command:
>>>>
>>>> $ mkudffs -b 512 --media-type=hd /dev/sdb
>>>>
>>>> Besides, I've made a good progress on the filesystem driver (UdfDxe).
>>>> It now supports symlinks, handle inodes which are either File Entry or
>>>> Extended File Entry, handle both long and short allocation
>>>> descriptors, as well as the usual
>>>> things: open, read and list files. I'm not going to send it now
>>>> because I need to test it more, rework the commit messages and a few
>>>> cleanups which are always good :-)
>>>>
>>>> My development branches:
>>>> git://git.zytor.com/users/pcacjr/edk2.git partitiondxe (PartitionDxe)
>>>> git://git.zytor.com/users/pcacjr/edk2.git udf-next (UdfDxe)
>>>>
>>>> Thanks,
>>>>
>>>>   -pcacjr
>>>>
>>>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Paulo Alcantara <[email protected]>
>>>> ---
>>>> MdeModulePkg/MdeModulePkg.dec                      |   6 +
>>>> .../Universal/Disk/PartitionDxe/Partition.c        |   1 +
>>>> .../Universal/Disk/PartitionDxe/Partition.h        |  29 +++
>>>> .../Universal/Disk/PartitionDxe/PartitionDxe.inf   |   9 +-
>>>> MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c     | 277
>>>> +++++++++++++++++++++
>>>> MdePkg/Include/IndustryStandard/Udf.h              |  88 +++++++
>>>> 6 files changed, 409 insertions(+), 1 deletion(-)  create mode 100644
>>>> MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c
>>>> create mode 100644 MdePkg/Include/IndustryStandard/Udf.h
>>>>
>>>> diff --git a/MdeModulePkg/MdeModulePkg.dec
>>>> b/MdeModulePkg/MdeModulePkg.dec index 60fb209..e320e1b 100644
>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>> @@ -597,6 +597,12 @@
>>>>  # @Prompt Enable S3 performance data support.
>>>>
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwarePerformanceDataTableS3Suppor
>>>> t|TRUE|BOOLEAN|0x00010064
>>>>
>>>> +  ## Indicates if UDF/ECMA-167 filesystem will be supported.<BR><BR>
>>>> +  #   TRUE  -  UDF/ECMA-167 filesystem will be supported.<BR>
>>>> +  #   FALSE - UDF/ECMA-167 filesystem will not be supported.<BR>
>>>> +  # @Prompt Enable UDF/ECMA-167 filesystem support.
>>>> +
>>>> + gEfiMdeModulePkgTokenSpaceGuid.PcdUdfFileSystemSupport|FALSE|BOOLEAN
>>>> + |0
>>>> + x00010069
>>>> +
>>>> [PcdsFeatureFlag.IA32, PcdsFeatureFlag.X64]
>>>>  ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
>>>>  #  It is assumed that 64-bit DxeCore is built in firmware if it is
>>>> true; otherwise 32-bit DxeCore diff --git
>>>> a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c
>>>> b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c
>>>> index 28639b0..27e460f 100644
>>>> --- a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c
>>>> +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c
>>>> @@ -45,6 +45,7 @@ PARTITION_DETECT_ROUTINE
>>>> mPartitionDetectRoutineTable[] = {
>>>>  PartitionInstallGptChildHandles,
>>>>  PartitionInstallElToritoChildHandles,
>>>>  PartitionInstallMbrChildHandles,
>>>> +  PartitionInstallUdfChildHandles,
>>>>  NULL
>>>> };
>>>>
>>>> diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.h
>>>> b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.h
>>>> index 06470f6..26107f0 100644
>>>> --- a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.h
>>>> +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.h
>>>> @@ -38,6 +38,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
>>>> EITHER EXPRESS OR IMPLIED.
>>>>
>>>> #include <IndustryStandard/Mbr.h>
>>>> #include <IndustryStandard/ElTorito.h>
>>>> +#include <IndustryStandard/Udf.h>
>>>>
>>>>
>>>> //
>>>> @@ -428,6 +429,34 @@ PartitionInstallMbrChildHandles (
>>>>  IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath
>>>>  );
>>>>
>>>> +/**
>>>> +  Install child handles if the Handle supports UDF/ECMA-167 volume
>>>> format.
>>>> +
>>>> +  @param[in]  This        Calling context.
>>>> +  @param[in]  Handle      Parent Handle.
>>>> +  @param[in]  DiskIo      Parent DiskIo interface.
>>>> +  @param[in]  DiskIo2     Parent DiskIo2 interface.
>>>> +  @param[in]  BlockIo     Parent BlockIo interface.
>>>> +  @param[in]  BlockIo2    Parent BlockIo2 interface.
>>>> +  @param[in]  DevicePath  Parent Device Path
>>>> +
>>>> +
>>>> +  @retval EFI_SUCCESS         Child handle(s) was added.
>>>> +  @retval EFI_MEDIA_CHANGED   Media changed Detected.
>>>> +  @retval other               no child handle was added.
>>>> +
>>>> +**/
>>>> +EFI_STATUS
>>>> +PartitionInstallUdfChildHandles (
>>>> +  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
>>>> +  IN  EFI_HANDLE                   Handle,
>>>> +  IN  EFI_DISK_IO_PROTOCOL         *DiskIo,
>>>> +  IN  EFI_DISK_IO2_PROTOCOL        *DiskIo2,
>>>> +  IN  EFI_BLOCK_IO_PROTOCOL        *BlockIo,
>>>> +  IN  EFI_BLOCK_IO2_PROTOCOL       *BlockIo2,
>>>> +  IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath
>>>> +  );
>>>> +
>>>> typedef
>>>> EFI_STATUS
>>>> (*PARTITION_DETECT_ROUTINE) (
>>>> diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
>>>> b/MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
>>>> index 6806263..1ce9b44 100644
>>>> --- a/MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
>>>> +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
>>>> @@ -46,13 +46,14 @@
>>>>  Mbr.c
>>>>  Gpt.c
>>>>  ElTorito.c
>>>> +  Udf.c
>>>>  Partition.c
>>>>  Partition.h
>>>>
>>>>
>>>> [Packages]
>>>>  MdePkg/MdePkg.dec
>>>> -
>>>> +  MdeModulePkg/MdeModulePkg.dec
>>>>
>>>> [LibraryClasses]
>>>>  DevicePathLib
>>>> @@ -63,6 +64,7 @@
>>>>  BaseLib
>>>>  UefiDriverEntryPoint
>>>>  DebugLib
>>>> +  PcdLib
>>>>
>>>>
>>>> [Guids]
>>>> @@ -85,5 +87,10 @@
>>>>  gEfiDiskIoProtocolGuid                        ## TO_START
>>>>  gEfiDiskIo2ProtocolGuid                       ## TO_START
>>>>
>>>> +
>>>> +[FeaturePcd]
>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUdfFileSystemSupport  ## CONSUMES
>>>> +
>>>> +
>>>> [UserExtensions.TianoCore."ExtraFiles"]
>>>>  PartitionDxeExtra.uni
>>>> diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c
>>>> b/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c
>>>> new file mode 100644
>>>> index 0000000..4c2fc4f
>>>> --- /dev/null
>>>> +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c
>>>> @@ -0,0 +1,277 @@
>>>> +/** @file
>>>> +  Decode an UDF/ECMA-167 formatted medium
>>>> +
>>>> +Copyright (c) 2014 Paulo Alcantara <[email protected]><BR> This
>>>> +program and the accompanying materials are licensed and made
>>>> +available under the terms and conditions of the BSD License which
>>>> +accompanies this distribution.  The full text of the license may be
>>>> +found at http://opensource.org/licenses/bsd-license.php
>>>> +
>>>> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>>>> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
>>>> IMPLIED.
>>>> +
>>>> +**/
>>>> +
>>>> +
>>>> +#include "Partition.h"
>>>> +
>>>> +
>>>> +EFI_GUID gUdfVolumeSignatureGuid = {
>>>> +  0xC5BD4D42, 0x1A76, 0x4996,
>>>> +  { 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } };
>>>> +
>>>> +UDF_STANDARD_IDENTIFIER
>>>> +gUdfStandardIdentifiers[NR_STANDARD_IDENTIFIERS] = {
>>>> +  { { 'B', 'E', 'A', '0', '1' } },
>>>> +  { { 'N', 'S', 'R', '0', '2' } },
>>>> +  { { 'N', 'S', 'R', '0', '3' } },
>>>> +  { { 'T', 'E', 'A', '0', '1' } },
>>>> +};
>>>> +
>>>> +typedef struct {
>>>> +  VENDOR_DEVICE_PATH         DevicePath;
>>>> +  EFI_DEVICE_PATH_PROTOCOL   End;
>>>> +} UDF_DEVICE_PATH;
>>>> +
>>>> +//
>>>> +// C5BD4D42-1A76-4996-8956-73CDA326CD0A
>>>> +//
>>>> +#define EFI_UDF_DEVICE_PATH_GUID \
>>>> +  { 0xC5BD4D42, 0x1A76, 0x4996, \
>>>> +    { 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } \
>>>> +  }
>>>> +
>>>> +UDF_DEVICE_PATH gUdfDevicePath = {
>>>> +  { { MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP,
>>>> +      { sizeof (VENDOR_DEVICE_PATH), 0 } },
>>>> +    EFI_UDF_DEVICE_PATH_GUID
>>>> +  },
>>>> +  { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
>>>> +    { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
>>>> +  }
>>>> +};
>>>> +
>>>> +EFI_STATUS
>>>> +FindAnchorVolumeDescriptorPointer (
>>>> +  IN  EFI_BLOCK_IO_PROTOCOL                  *BlockIo,
>>>> +  IN  EFI_DISK_IO_PROTOCOL                   *DiskIo,
>>>> +  OUT UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER   *AnchorPoint
>>>> +  )
>>>> +{
>>>> +  EFI_STATUS   Status;
>>>> +  UINT32       BlockSize;
>>>> +  EFI_LBA      EndLBA;
>>>> +
>>>> +  BlockSize = BlockIo->Media->BlockSize;
>>>> +  EndLBA = BlockIo->Media->LastBlock;
>>>> +  Status = DiskIo->ReadDisk (
>>>> +                       DiskIo,
>>>> +                       BlockIo->Media->MediaId,
>>>> +        MultU64x32 (0x100ULL, BlockSize),
>>>> +                       sizeof (UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER),
>>>> +                       (VOID *) AnchorPoint
>>>> +                       );
>>>> +  if (EFI_ERROR (Status)) {
>>>> +    goto Exit;
>>>> +  }
>>>> +  Status = EFI_VOLUME_CORRUPTED;
>>>> +  if (IS_AVDP (AnchorPoint)) {
>>>> +    Status = EFI_SUCCESS;
>>>> +    goto Exit;
>>>> +  }
>>>> +
>>>> +  Status = DiskIo->ReadDisk (
>>>> +                       DiskIo,
>>>> +                       BlockIo->Media->MediaId,
>>>> +        MultU64x32 (EndLBA - 0x100ULL, BlockSize),
>>>> +                       sizeof (UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER),
>>>> +                       (VOID *) AnchorPoint
>>>> +                       );
>>>> +  if (EFI_ERROR (Status)) {
>>>> +    goto Exit;
>>>> +  }
>>>> +  if (IS_AVDP (AnchorPoint)) {
>>>> +    Status = EFI_SUCCESS;
>>>> +    goto Exit;
>>>> +  }
>>>> +
>>>> +  Status = DiskIo->ReadDisk (
>>>> +                       DiskIo,
>>>> +                       BlockIo->Media->MediaId,
>>>> +        MultU64x32 (EndLBA, BlockSize),
>>>> +                       sizeof (UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER),
>>>> +                       (VOID *) AnchorPoint
>>>> +                       );
>>>> +  if (EFI_ERROR (Status)) {
>>>> +    goto Exit;
>>>> +  }
>>>> +  if (IS_AVDP (AnchorPoint)) {
>>>> +    Status = EFI_SUCCESS;
>>>> +  }
>>>> +
>>>> +Exit:
>>>> +  return Status;
>>>> +}
>>>> +
>>>> +EFI_STATUS
>>>> +IsSupportedUdfVolume (
>>>> +  IN  EFI_BLOCK_IO_PROTOCOL   *BlockIo,
>>>> +  IN  EFI_DISK_IO_PROTOCOL    *DiskIo,
>>>> +  OUT BOOLEAN                 *Supported
>>>> +  )
>>>> +{
>>>> +  EFI_STATUS                             Status;
>>>> +  UDF_NSR_DESCRIPTOR                     NsrDescriptor;
>>>> +  UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER   AnchorPoint;
>>>> +
>>>> +  *Supported = FALSE;
>>>> +  //
>>>> +  // Start Volume Recognition Sequence
>>>> +  //
>>>> +  Status = DiskIo->ReadDisk (
>>>> +                       DiskIo,
>>>> +                       BlockIo->Media->MediaId,
>>>> +                       BEA_DESCRIPTOR_LSN_OFFSET,
>>>> +                       sizeof (UDF_NSR_DESCRIPTOR),
>>>> +                       (VOID *) &NsrDescriptor
>>>> +                       );
>>>> +  if (EFI_ERROR (Status)) {
>>>> +    goto Exit;
>>>> +  }
>>>> +  if (CompareMem (
>>>> + (VOID *) &NsrDescriptor.StandardIdentifier,
>>>> + (VOID *) &gUdfStandardIdentifiers[BEA_IDENTIFIER],
>>>> + UDF_STANDARD_IDENTIFIER_LENGTH
>>>> + )
>>>> +    ) {
>>>> +    goto Exit;
>>>> +  }
>>>> +  Status = DiskIo->ReadDisk (
>>>> +                       DiskIo,
>>>> +                       BlockIo->Media->MediaId,
>>>> +                       BEA_DESCRIPTOR_LSN_OFFSET +
LOGICAL_SECTOR_SIZE,
>>>> +                       sizeof (UDF_NSR_DESCRIPTOR),
>>>> +                       (VOID *) &NsrDescriptor
>>>> +                       );
>>>> +  if (EFI_ERROR (Status)) {
>>>> +    goto Exit;
>>>> +  }
>>>> +  if (CompareMem (
>>>> + (VOID *) &NsrDescriptor.StandardIdentifier,
>>>> + (VOID *) &gUdfStandardIdentifiers[VSD_IDENTIFIER_0],
>>>> + UDF_STANDARD_IDENTIFIER_LENGTH
>>>> + )
>>>> +      &&
>>>> +      CompareMem (
>>>> + (VOID *) &NsrDescriptor.StandardIdentifier,
>>>> + (VOID *) &gUdfStandardIdentifiers[VSD_IDENTIFIER_1],
>>>> + UDF_STANDARD_IDENTIFIER_LENGTH
>>>> +        )
>>>> +    ) {
>>>> +    goto Exit;
>>>> +  }
>>>> +  Status = DiskIo->ReadDisk (
>>>> +                       DiskIo,
>>>> +                       BlockIo->Media->MediaId,
>>>> +                       BEA_DESCRIPTOR_LSN_OFFSET +
(LOGICAL_SECTOR_SIZE
>>>> << 1),
>>>> +                       sizeof (UDF_NSR_DESCRIPTOR),
>>>> +                       (VOID *)&NsrDescriptor
>>>> +                       );
>>>> +  if (EFI_ERROR (Status)) {
>>>> +    goto Exit;
>>>> +  }
>>>> +  if (CompareMem (
>>>> + (VOID *) &NsrDescriptor.StandardIdentifier,
>>>> + (VOID *) &gUdfStandardIdentifiers[TEA_IDENTIFIER],
>>>> + UDF_STANDARD_IDENTIFIER_LENGTH
>>>> + )
>>>> +    ) {
>>>> +    goto Exit;
>>>> +  }
>>>> +
>>>> +  Status = FindAnchorVolumeDescriptorPointer (BlockIo, DiskIo,
>>>> + &AnchorPoint);  if (!EFI_ERROR (Status)) {
>>>> +    *Supported = TRUE;
>>>> +  }
>>>> +
>>>> +Exit:
>>>> +  return Status;
>>>> +}
>>>> +
>>>> +/**
>>>> +  Install child handles if the Handle supports UDF/ECMA-167 volume
>>>> format.
>>>> +
>>>> +  @param[in]  This        Calling context.
>>>> +  @param[in]  Handle      Parent Handle.
>>>> +  @param[in]  DiskIo      Parent DiskIo interface.
>>>> +  @param[in]  DiskIo2     Parent DiskIo2 interface.
>>>> +  @param[in]  BlockIo     Parent BlockIo interface.
>>>> +  @param[in]  BlockIo2    Parent BlockIo2 interface.
>>>> +  @param[in]  DevicePath  Parent Device Path
>>>> +
>>>> +
>>>> +  @retval EFI_SUCCESS         Child handle(s) was added.
>>>> +  @retval EFI_MEDIA_CHANGED   Media changed Detected.
>>>> +  @retval other               no child handle was added.
>>>> +
>>>> +**/
>>>> +EFI_STATUS
>>>> +PartitionInstallUdfChildHandles (
>>>> +  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
>>>> +  IN  EFI_HANDLE                   Handle,
>>>> +  IN  EFI_DISK_IO_PROTOCOL         *DiskIo,
>>>> +  IN  EFI_DISK_IO2_PROTOCOL        *DiskIo2,
>>>> +  IN  EFI_BLOCK_IO_PROTOCOL        *BlockIo,
>>>> +  IN  EFI_BLOCK_IO2_PROTOCOL       *BlockIo2,
>>>> +  IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath
>>>> +  )
>>>> +{
>>>> +  EFI_STATUS                Status;
>>>> +  BOOLEAN                   Supported;
>>>> +  EFI_DEVICE_PATH_PROTOCOL  *LastDevicePathNode;
>>>> +  EFI_DEVICE_PATH_PROTOCOL  *DevicePathNode;
>>>> +  EFI_GUID                  *VendorDevGuid;
>>>> +  EFI_GUID                  UdfDevGuid = EFI_UDF_DEVICE_PATH_GUID;
>>>> +
>>>> +  if (!FeaturePcdGet (PcdUdfFileSystemSupport)) {
>>>> +    return EFI_NOT_FOUND;
>>>> +  }
>>>> +
>>>> +  Status = IsSupportedUdfVolume (BlockIo, DiskIo, &Supported);  if
>>>> + (EFI_ERROR (Status) || !Supported) {
>>>> +    return EFI_NOT_FOUND;
>>>> +  }
>>>> +
>>>> +  LastDevicePathNode = NULL;
>>>> +  DevicePathNode = DevicePath;
>>>> +  while (!IsDevicePathEnd (DevicePathNode)) {
>>>> +    LastDevicePathNode  = DevicePathNode;
>>>> +    DevicePathNode      = NextDevicePathNode (DevicePathNode);
>>>> +  }
>>>> +  if (LastDevicePathNode) {
>>>> +    VendorDevGuid = (EFI_GUID *) ((UINT8 *) LastDevicePathNode +
>>>> OFFSET_OF (VENDOR_DEVICE_PATH, Guid));
>>>> +    if (DevicePathSubType (LastDevicePathNode) == MEDIA_VENDOR_DP &&
>>>> + CompareGuid (VendorDevGuid, &UdfDevGuid)) {
>>>> +      return EFI_NOT_FOUND;
>>>> +    }
>>>> +  }
>>>> +
>>>> +  Status = PartitionInstallChildHandle (
>>>> +                                    This,
>>>> +     Handle,
>>>> +     DiskIo,
>>>> +     DiskIo2,
>>>> +                                    BlockIo,
>>>> +     BlockIo2,
>>>> +     DevicePath,
>>>> +     (EFI_DEVICE_PATH_PROTOCOL *) &gUdfDevicePath,
>>>> +     0,
>>>> +     BlockIo->Media->LastBlock,
>>>> +     BlockIo->Media->BlockSize,
>>>> +     FALSE
>>>> +                                    );
>>>> +  if (!EFI_ERROR (Status)) {
>>>> +    Status = EFI_NOT_FOUND;
>>>> +  }
>>>> +  return Status;
>>>> +}
>>>> diff --git a/MdePkg/Include/IndustryStandard/Udf.h
>>>> b/MdePkg/Include/IndustryStandard/Udf.h
>>>> new file mode 100644
>>>> index 0000000..8b41d05
>>>> --- /dev/null
>>>> +++ b/MdePkg/Include/IndustryStandard/Udf.h
>>>> @@ -0,0 +1,88 @@
>>>> +/** @file
>>>> +  UDF/ECMA-167 Volume and File Structure Format Definition.
>>>> +
>>>> +Copyright (c) 2014 Paulo Alcantara <[email protected]><BR> This
>>>> +program and the accompanying materials are licensed and made
>>>> +available under the terms and conditions of the BSD License which
>>>> +accompanies this distribution.  The full text of the license may be
>>>> +found at http://opensource.org/licenses/bsd-license.php
>>>> +
>>>> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>>>> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
>>>> IMPLIED.
>>>> +
>>>> +**/
>>>> +
>>>> +#ifndef _UDF_H_
>>>> +#define _UDF_H_
>>>> +
>>>> +//
>>>> +// As specified in ECMA-167 specification, the logical sector size
>>>> +shall be // 2048 bytes.
>>>> +//
>>>> +#define LOGICAL_SECTOR_SIZE             ((UINT64)
>>>> 0x0000000000000800ULL)
>>>> +#define FIRST_ANCHOR_POINT_LSN          ((UINT64)
>>>> 0x0000000000000100ULL)
>>>> +#define BEA_DESCRIPTOR_LSN_OFFSET       ((UINT64)
>>>> 0x0000000000008000ULL)
>>>> +#define UDF_STANDARD_IDENTIFIER_LENGTH  5
>>>> +
>>>> +#define _GET_TAG_ID(_Pointer) \
>>>> +  (((UDF_DESCRIPTOR_TAG *) (_Pointer))->TagIdentifier)
>>>> +
>>>> +#define IS_PVD(_Pointer) \
>>>> +  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 1)) #define IS_AVDP(_Pointer)
>>>> +\
>>>> +  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 2))
>>>> +
>>>> +typedef struct {
>>>> +  UINT8   StandardIdentifier[UDF_STANDARD_IDENTIFIER_LENGTH];
>>>> +} UDF_STANDARD_IDENTIFIER;
>>>> +
>>>> +enum {
>>>> +  BEA_IDENTIFIER,
>>>> +  VSD_IDENTIFIER_0,
>>>> +  VSD_IDENTIFIER_1,
>>>> +  TEA_IDENTIFIER,
>>>> +  NR_STANDARD_IDENTIFIERS,
>>>> +};
>>>> +
>>>> +#pragma pack(1)
>>>> +
>>>> +typedef struct {
>>>> +  UINT16   TagIdentifier;
>>>> +  UINT16   DescriptorVersion;
>>>> +  UINT8    TagChecksum;
>>>> +  UINT8    Reserved;
>>>> +  UINT16   TagSerialNumber; // Ignored. Intended for disaster
recovery.
>>>> +  UINT16   DescriptorCRC;
>>>> +  UINT16   DescriptorCRCLength;
>>>> +  UINT32   TagLocation;
>>>> +} UDF_DESCRIPTOR_TAG;
>>>> +
>>>> +//
>>>> +// ECMA 167 3/7.1
>>>> +//
>>>> +typedef struct {
>>>> +  UINT32   ExtentLength;
>>>> +  UINT32   ExtentLocation;
>>>> +} UDF_EXTENT_AD;
>>>> +
>>>> +//
>>>> +// ECMA 167 3/9.1
>>>> +//
>>>> +typedef struct {
>>>> +  UINT8   StructureType;
>>>> +  UINT8   StandardIdentifier[5];
>>>> +  UINT8   StructureVersion;
>>>> +  UINT8   Reserved;
>>>> +  UINT8   StructureData[2040];
>>>> +} UDF_NSR_DESCRIPTOR;
>>>> +
>>>> +typedef struct {
>>>> +  UDF_DESCRIPTOR_TAG   DescriptorTag;
>>>> +  UDF_EXTENT_AD        MainVolumeDescriptorSequenceExtent;
>>>> +  UDF_EXTENT_AD        ReserveVolumeDescriptorSequenceExtent;
>>>> +  UINT8                Reserved[480];
>>>> +} UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER;
>>>> +
>>>> +#pragma pack()
>>>> +
>>>> +#endif // _UDF_H_
>>>> --
>>>> 1.9.3
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>> -------- _______________________________________________
>>>> edk2-devel mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>>>
>>>> ----------------------------------------------------------------------
>>>> -------- _______________________________________________
>>>> edk2-devel mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>>
>>>
>>>
>>>
------------------------------------------------------------------------------
>>> _______________________________________________
>>> edk2-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>>
>>>
------------------------------------------------------------------------------
>>> _______________________________________________
>>> edk2-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>>
>>
>>
>> --
>> Paulo Alcantara, C.E.S.A.R
>> Speaking for myself only.
>>
>>
------------------------------------------------------------------------------
>> _______________________________________________
>> edk2-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
>
>
>
------------------------------------------------------------------------------
>
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to