From: "Pedro Falcato" <pedro.falcato@gmail.com>
To: "Kinney, Michael D" <michael.d.kinney@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: Leif Lindholm <leif@nuviainc.com>,
Bret Barkelew <Bret.Barkelew@microsoft.com>
Subject: Re: [Patch 0/3] Ext4Pkg: Add Ext4Pkg
Date: Thu, 5 Aug 2021 23:50:15 +0100 [thread overview]
Message-ID: <CAKbZUD00SLJyoxzqYq=RCLGFme8J2PtkNZKqqi_PejMQL87VVw@mail.gmail.com> (raw)
In-Reply-To: <SA2PR11MB493897076BDCC8FFC211F4C5D2F29@SA2PR11MB4938.namprd11.prod.outlook.com>
Hi Mike,
Thanks for the helpful pointers. I'll consider everything for V2,
which I'll submit as soon as possible (hopefully tomorrow).
RE: Code style. I'll re-run ECC and try to solve the issues. One thing
though: Is it possible to make an exception for the naming of
ext4-specific struct members?
Example: Members' names like "bg_block_bitmap_lo" in
EXT4_BLOCK_GROUP_DESC. I'd like to make a case for it; from my
experience with my own hobby project's ext2 driver, having names
similar to what's used in the documentation/other source code is
incredibly helpful when trying to work on the code; with the original
docs' names, which are admittedly not compliant with the EDK2 coding
style, it really makes everything much clearer when using other code
or documentation as reference. Of course, if it's not possible I'll
rename them all.
Thanks,
Pedro
On Thu, 5 Aug 2021 at 19:33, Kinney, Michael D
<michael.d.kinney@intel.com> wrote:
>
> Hi Pedro,
>
> 1) Ext4Pkg/Ext4Dxe/Ext4Dxe.inf:
>
> * To be consistent with other drivers, BASE_NAME should be changed from Ext4 to Ext4Dxe.
> * For proper dependency checking in incremental builds, please add the .h files to the [Sources] section
>
> Ext4Disk.h
> Ext4Dxe.h
>
> 2) There are a number of code style issues that need to be addressed. Can you fix those for V2?
>
> 3) I did a quick pass to find the IA32 NOOPT VS2019 issues. With the following changes, I can get it to build. Do not know if I introduced any functional changes by mistake.
>
> diff --git a/Features/Ext4Pkg/Ext4Dxe/BlockGroup.c b/Features/Ext4Pkg/Ext4Dxe/BlockGroup.c
> index 10a82d40a0..f2db93f02c 100644
> --- a/Features/Ext4Pkg/Ext4Dxe/BlockGroup.c
> +++ b/Features/Ext4Pkg/Ext4Dxe/BlockGroup.c
> @@ -61,7 +61,7 @@ Ext4ReadInode (
> Partition,
> Inode,
> Partition->InodeSize,
> - Ext4BlockToByteOffset (Partition, InodeTableStart) + InodeOffset * Partition->InodeSize
> + Ext4BlockToByteOffset (Partition, InodeTableStart) + MultU64x32 (InodeOffset, Partition->InodeSize)
> );
>
> if (EFI_ERROR (Status)) {
> diff --git a/Features/Ext4Pkg/Ext4Dxe/DiskUtil.c b/Features/Ext4Pkg/Ext4Dxe/DiskUtil.c
> index 1cafdd64cd..65109809c0 100644
> --- a/Features/Ext4Pkg/Ext4Dxe/DiskUtil.c
> +++ b/Features/Ext4Pkg/Ext4Dxe/DiskUtil.c
> @@ -45,7 +45,7 @@ Ext4ReadBlocks (
> IN EXT4_BLOCK_NR BlockNumber
> )
> {
> - return Ext4ReadDiskIo (Partition, Buffer, NumberBlocks * Partition->BlockSize, BlockNumber * Partition->BlockSize);
> + return Ext4ReadDiskIo (Partition, Buffer, NumberBlocks * Partition->BlockSize, MultU64x32 (BlockNumber, Partition->BlockSize));
> }
>
> /**
> diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h b/Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h
> index d790e70be1..8aa584df14 100644
> --- a/Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h
> +++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h
> @@ -445,6 +445,6 @@ typedef struct {
> typedef UINT64 EXT4_BLOCK_NR;
> typedef UINT32 EXT4_INO_NR;
>
> -#define EXT4_INODE_SIZE(ino) (((UINT64)ino->i_size_hi << 32) | ino->i_size_lo)
> +#define EXT4_INODE_SIZE(ino) (LShiftU64 (ino->i_size_hi, 32) | ino->i_size_lo)
>
> #endif
> diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h
> index f6875c919e..a055a139e1 100644
> --- a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h
> +++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h
> @@ -244,7 +244,7 @@ Ext4MakeBlockNumberFromHalfs (
> )
> {
> // High might have garbage if it's not a 64 bit filesystem
> - return Ext4Is64Bit (Partition) ? Low | ((UINT64)High << 32) : Low;
> + return Ext4Is64Bit (Partition) ? (Low | LShiftU64 (High, 32)) : Low;
> }
>
> /**
> @@ -297,7 +297,7 @@ Ext4BlockToByteOffset (
> IN EXT4_BLOCK_NR Block
> )
> {
> - return Partition->BlockSize * Block;
> + return MultU64x32 (Block, Partition->BlockSize);
> }
>
> /**
> @@ -333,7 +333,7 @@ Ext4InodeSize (
> CONST EXT4_INODE *Inode
> )
> {
> - return ((UINT64)Inode->i_size_hi << 32) | Inode->i_size_lo;
> + return (LShiftU64 (Inode->i_size_hi, 32) | Inode->i_size_lo);
> }
>
> /**
> diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.inf b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.inf
> index 102b12d613..fc0185285e 100644
> --- a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.inf
> +++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.inf
> @@ -111,6 +111,8 @@ [Sources]
> Collation.c
> Crc32c.c
> Crc16.c
> + Ext4Disk.h
> + Ext4Dxe.h
>
> [Packages]
> MdePkg/MdePkg.dec
> diff --git a/Features/Ext4Pkg/Ext4Dxe/Extents.c b/Features/Ext4Pkg/Ext4Dxe/Extents.c
> index db4bf5aa3f..8c9b4a4c75 100644
> --- a/Features/Ext4Pkg/Ext4Dxe/Extents.c
> +++ b/Features/Ext4Pkg/Ext4Dxe/Extents.c
> @@ -210,7 +210,7 @@ Ext4ExtentIdxLeafBlock (
> IN EXT4_EXTENT_INDEX *Index
> )
> {
> - return ((UINT64)Index->ei_leaf_hi << 32) | Index->ei_leaf_lo;
> + return LShiftU64(Index->ei_leaf_hi, 32) | Index->ei_leaf_lo;
> }
>
> STATIC UINTN GetExtentRequests = 0;
> diff --git a/Features/Ext4Pkg/Ext4Dxe/File.c b/Features/Ext4Pkg/Ext4Dxe/File.c
> index 10dda64b16..71d36d1990 100644
> --- a/Features/Ext4Pkg/Ext4Dxe/File.c
> +++ b/Features/Ext4Pkg/Ext4Dxe/File.c
> @@ -487,8 +487,8 @@ Ext4GetFilesystemInfo (
> Info->BlockSize = Part->BlockSize;
> Info->Size = NeededLength;
> Info->ReadOnly = Part->ReadOnly;
> - Info->VolumeSize = TotalBlocks * Part->BlockSize;
> - Info->FreeSpace = FreeBlocks * Part->BlockSize;
> + Info->VolumeSize = MultU64x32 (TotalBlocks, Part->BlockSize);
> + Info->FreeSpace = MultU64x32 (FreeBlocks, Part->BlockSize);
>
> if (VolumeName != NULL) {
> StrCpyS (Info->VolumeLabel, VolNameLength + 1, VolumeName);
> diff --git a/Features/Ext4Pkg/Ext4Dxe/Inode.c b/Features/Ext4Pkg/Ext4Dxe/Inode.c
> index 304bf0c4a9..2a9f534d7e 100644
> --- a/Features/Ext4Pkg/Ext4Dxe/Inode.c
> +++ b/Features/Ext4Pkg/Ext4Dxe/Inode.c
> @@ -154,7 +154,7 @@ Ext4Read (
> UINT64 ExtentOffset;
> UINTN ExtentMayRead;
>
> - ExtentStartBytes = (((UINT64)Extent.ee_start_hi << 32) | Extent.ee_start_lo) * Partition->BlockSize;
> + ExtentStartBytes = MultU64x32 (LShiftU64 (Extent.ee_start_hi, 32) | Extent.ee_start_lo, Partition->BlockSize);
> ExtentLengthBytes = Extent.ee_len * Partition->BlockSize;
> ExtentLogicalBytes = (UINT64)Extent.ee_block * Partition->BlockSize;
> ExtentOffset = CurrentSeek - ExtentLogicalBytes;
> @@ -276,17 +276,17 @@ Ext4FilePhysicalSpace (
> Blocks = File->Inode->i_blocks;
>
> if(HugeFile) {
> - Blocks |= ((UINT64)File->Inode->i_osd2.data_linux.l_i_blocks_high) << 32;
> + Blocks |= LShiftU64 (File->Inode->i_osd2.data_linux.l_i_blocks_high, 32);
>
> // If HUGE_FILE is enabled and EXT4_HUGE_FILE_FL is set in the inode's flags, each unit
> // in i_blocks corresponds to an actual filesystem block
> if(File->Inode->i_flags & EXT4_HUGE_FILE_FL) {
> - return Blocks * File->Partition->BlockSize;
> + return MultU64x32 (Blocks, File->Partition->BlockSize);
> }
> }
>
> // Else, each i_blocks unit corresponds to 512 bytes
> - return Blocks * 512;
> + return MultU64x32 (Blocks, 512);
> }
>
> // Copied from EmbeddedPkg at my mentor's request.
> @@ -368,7 +368,7 @@ EpochToEfiTime (
> UINT32 Nanoseconds = 0; \
> \
> if (Ext4InodeHasField (Inode, Field ## _extra)) { \
> - SecondsEpoch |= ((UINT64)(Inode->Field ## _extra & EXT4_EXTRA_TIMESTAMP_MASK)) << 32; \
> + SecondsEpoch |= LShiftU64 ((UINT64)(Inode->Field ## _extra & EXT4_EXTRA_TIMESTAMP_MASK), 32); \
> Nanoseconds = Inode->Field ## _extra >> 2; \
> } \
> EpochToEfiTime ((UINTN)SecondsEpoch, Time); \
> diff --git a/Features/Ext4Pkg/Ext4Dxe/Superblock.c b/Features/Ext4Pkg/Ext4Dxe/Superblock.c
> index 18d8295a1f..88d01b62a8 100644
> --- a/Features/Ext4Pkg/Ext4Dxe/Superblock.c
> +++ b/Features/Ext4Pkg/Ext4Dxe/Superblock.c
> @@ -161,7 +161,7 @@ Ext4OpenSuperblock (
>
> DEBUG ((EFI_D_INFO, "Read only = %u\n", Partition->ReadOnly));
>
> - Partition->BlockSize = 1024 << Sb->s_log_block_size;
> + Partition->BlockSize = (UINT32)LShiftU64 (1024, Sb->s_log_block_size);
>
> // The size of a block group can also be calculated as 8 * Partition->BlockSize
> if(Sb->s_blocks_per_group != 8 * Partition->BlockSize) {
> @@ -195,7 +195,7 @@ Ext4OpenSuperblock (
> }
>
> NrBlocks = (UINTN)DivU64x32Remainder (
> - Partition->NumberBlockGroups * Partition->DescSize,
> + MultU64x32 (Partition->NumberBlockGroups, Partition->DescSize),
> Partition->BlockSize,
> &NrBlocksRem
> );
> diff --git a/Features/Ext4Pkg/Ext4Pkg.dsc b/Features/Ext4Pkg/Ext4Pkg.dsc
> index 62cb4e69cf..57f279a4d9 100644
> --- a/Features/Ext4Pkg/Ext4Pkg.dsc
> +++ b/Features/Ext4Pkg/Ext4Pkg.dsc
> @@ -20,6 +20,8 @@ [Defines]
> BUILD_TARGETS = DEBUG|RELEASE|NOOPT
> SKUID_IDENTIFIER = DEFAULT
>
> +!include MdePkg/MdeLibs.dsc.inc
> +
> [BuildOptions]
> *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES
>
>
>
>
> Thanks,
>
> Mike
>
>
>
>
> > -----Original Message-----
> > From: Pedro Falcato <pedro.falcato@gmail.com>
> > Sent: Friday, July 30, 2021 9:17 AM
> > To: devel@edk2.groups.io
> > Cc: Pedro Falcato <pedro.falcato@gmail.com>; Leif Lindholm <leif@nuviainc.com>; Kinney, Michael D
> > <michael.d.kinney@intel.com>; Bret Barkelew <Bret.Barkelew@microsoft.com>
> > Subject: [Patch 0/3] Ext4Pkg: Add Ext4Pkg
> >
> > This patch-set adds Ext4Pkg, a package designed to hold various drivers and
> > utilities related to the EXT4 filesystem.
> >
> > Right now, it holds a single read-only UEFI EXT4 driver (Ext4Dxe), which consumes the
> > DISK_IO, BLOCK_IO and DISK_IO2 protocols and produce EFI_FILE_PROTOCOL and
> > EFI_SIMPLE_FILE_SYSTEM_PROTOCOL; this driver allows the mounting of EXT4 partitions and
> > the reading of their contents.
> >
> > Relevant RFC discussion, which includes a more in-depth walkthrough of EXT4 internals and
> > driver limitations is available at https://edk2.groups.io/g/devel/topic/84368561.
> >
> > Cc: Leif Lindholm <leif@nuviainc.com>
> > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
> >
> > Pedro Falcato (3):
> > Ext4Pkg: Add Ext4Pkg.dec and Ext4Pkg.uni.
> > Ext4Pkg: Add Ext4Dxe driver.
> > Ext4Pkg: Add .DSC file.
> >
> > Features/Ext4Pkg/Ext4Dxe/BlockGroup.c | 208 ++++++
> > Features/Ext4Pkg/Ext4Dxe/Collation.c | 157 +++++
> > Features/Ext4Pkg/Ext4Dxe/Crc16.c | 75 ++
> > Features/Ext4Pkg/Ext4Dxe/Crc32c.c | 84 +++
> > Features/Ext4Pkg/Ext4Dxe/Directory.c | 492 ++++++++++++++
> > Features/Ext4Pkg/Ext4Dxe/DiskUtil.c | 83 +++
> > Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h | 450 ++++++++++++
> > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c | 454 +++++++++++++
> > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h | 942 ++++++++++++++++++++++++++
> > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.inf | 147 ++++
> > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.uni | 15 +
> > Features/Ext4Pkg/Ext4Dxe/Extents.c | 616 +++++++++++++++++
> > Features/Ext4Pkg/Ext4Dxe/File.c | 583 ++++++++++++++++
> > Features/Ext4Pkg/Ext4Dxe/Inode.c | 468 +++++++++++++
> > Features/Ext4Pkg/Ext4Dxe/Partition.c | 120 ++++
> > Features/Ext4Pkg/Ext4Dxe/Superblock.c | 257 +++++++
> > Features/Ext4Pkg/Ext4Pkg.dec | 17 +
> > Features/Ext4Pkg/Ext4Pkg.dsc | 68 ++
> > Features/Ext4Pkg/Ext4Pkg.uni | 14 +
> > 19 files changed, 5250 insertions(+)
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/BlockGroup.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Collation.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Crc16.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Crc32c.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Directory.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/DiskUtil.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.inf
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.uni
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Extents.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/File.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Inode.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Partition.c
> > create mode 100644 Features/Ext4Pkg/Ext4Dxe/Superblock.c
> > create mode 100644 Features/Ext4Pkg/Ext4Pkg.dec
> > create mode 100644 Features/Ext4Pkg/Ext4Pkg.dsc
> > create mode 100644 Features/Ext4Pkg/Ext4Pkg.uni
> >
> > --
> > 2.32.0
>
--
Pedro Falcato
next prev parent reply other threads:[~2021-08-05 22:50 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-30 16:16 [Patch 0/3] Ext4Pkg: Add Ext4Pkg Pedro Falcato
2021-07-30 16:16 ` [Patch 1/3] Ext4Pkg: Add Ext4Pkg.dec and Ext4Pkg.uni Pedro Falcato
2021-07-30 16:16 ` [Patch 2/3] Ext4Pkg: Add Ext4Dxe driver Pedro Falcato
2021-07-30 20:28 ` [edk2-devel] " Marvin Häuser
2021-08-02 15:56 ` Pedro Falcato
2021-07-30 16:16 ` [Patch 3/3] Ext4Pkg: Add .DSC file Pedro Falcato
2021-08-05 15:36 ` [Patch 0/3] Ext4Pkg: Add Ext4Pkg Michael D Kinney
2021-08-05 16:02 ` Michael D Kinney
2021-08-05 18:33 ` Michael D Kinney
2021-08-05 22:50 ` Pedro Falcato [this message]
2021-08-06 16:15 ` [edk2-devel] " Michael D Kinney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAKbZUD00SLJyoxzqYq=RCLGFme8J2PtkNZKqqi_PejMQL87VVw@mail.gmail.com' \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox