I uploaded the entire branch (patches) to my GitHub copy:
https://github.com/phcoder/GRUB/tree/rb1

Le lun. 14 août 2023, 13:07, Pedro Miguel Justo <pm...@texair.net> a écrit :

>
> Hi Vladimir.
>
> I got a conplict while applying 0003. Out of expedience, instead of me
> trying to resolve the conflict, can you just share your baseline commit#
> over which these will apply cleanly?
>
> ```
> pmsjt@itanium:~/grub$ patch -p1 <
> ../0001-Add-missing-static-qualifier.patch
> patching file grub-core/commands/efi/lsefi.c
> pmsjt@itanium:~/grub$ patch -p1 <
> ../0002-Mark-grub_gpt_partentry-as-aligned-to-8-bytes.patch
> patching file include/grub/gpt_partition.h
> Hunk #1 succeeded at 67 (offset -7 lines).
> pmsjt@itanium:~/grub$ patch -p1 <
> ../0003-Split-aligned-and-packed-guids.patch
> patching file grub-core/commands/efi/lsefi.c
> patching file grub-core/efiemu/runtime/efiemu.c
> patching file grub-core/kern/efi/efi.c
> Hunk #1 FAILED at 1039.
> 1 out of 1 hunk FAILED -- saving rejects to file
> grub-core/kern/efi/efi.c.rej
> patching file grub-core/kern/misc.c
> patching file grub-core/loader/i386/xnu.c
> patching file include/grub/efi/api.h
> patching file include/grub/efiemu/efiemu.h
> patching file include/grub/efiemu/runtime.h
> patching file include/grub/types.h
> ```
>
>
>
> On Aug 14, 2023, at 03:26, Pedro Miguel Justo <pm...@texair.net> wrote:
>
> Hi Vladimir.
>
> Thanks for the analysis and for providing the candidate patches. I'll be
> away from my computer for a couple of days but will give it a try as soon
> as I can find a sliver of time.
>
> Pedro
>
> On Aug 13, 2023, at 08:47, Vladimir 'phcoder' Serbinenko <
> phco...@gmail.com> wrote:
>
> 
> Full analysis: gpt_partentry can be marked as aligned8. But following are
> problem:
> * protocols_per_handle may return unaligned guids
> * configuration_tables array may be unaligned. On efi32 every entry is 20
> bytes, so guids can't be 8-byte aligned
> * The worst offender is device path as it's packed, unpredictable and
> contains uuids.
> * Efiemu gets guid as argument and probably should be able to handle
> unaligned case. So far it's x86 only and we have no mmx and co so it's not
> a problem right now unless we enable ubsan.
> All in all we do need packed guid type unless those are resolved. I attach
> patches for testing. If they work, I'll rearrange them a bit
>
> Le dim. 13 août 2023, 05:27, Vladimir 'phcoder' Serbinenko <
> phco...@gmail.com> a écrit :
>
>>
>>
>> Le dim. 13 août 2023, 00:57, Pedro Miguel Justo <pm...@texair.net> a
>> écrit :
>>
>>>
>>>
>>> > On Aug 12, 2023, at 11:04, John Paul Adrian Glaubitz <
>>> glaub...@physik.fu-berlin.de> wrote:
>>> >
>>> > Hi Daniel!
>>> >
>>> > On Fri, 2023-08-11 at 17:31 +0200, Daniel Kiper wrote:
>>> >> On Fri, Aug 11, 2023 at 04:10:14AM -0700, Oliver Steffen wrote:
>>> >>> Quoting John Paul Adrian Glaubitz (2023-08-11 10:32:17)
>>> >>>> Hi Oliver!
>>> >>>>
>>> >>>> On Fri, 2023-05-26 at 13:35 +0200, Oliver Steffen wrote:
>>> >>>>> There are 3 implementations of a GUID in Grub. Replace them with a
>>> >>>>> common one, placed in types.h.
>>> >>>>>
>>> >>>>> It uses the "packed" flavor of the GUID structs, the alignment
>>> attribute
>>> >>>>> is dropped, since it is not required.
>>> >>>>>
>>> >>>>> Signed-off-by: Oliver Steffen <ostef...@redhat.com>
>>> >>>>> Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
>>> >>
>>> >> [...]
>>> >>
>>> >>>> According to [1], this change broke GRUB on ia64:
>>> >>>>
>>> >>>> Welcome to GRUB!
>>> >>>>
>>> >>>> 7 0 0x00006B 0x000000000000001E unexpected trap
>>> >>>> 7 0 0x000066 0x000000000000001E trap taken, number in ext PE
>>> >>>> 7 0 0x00003C 0x0000000000005A00 trap taken, offset in ext PE
>>> >>>>
>>> >>>> I assume this is because of the strict alignment requirements on
>>> ia64.
>>> >>>>
>>> >>>> Could you have a look?
>>> >>>
>>> >>> I am very sorry for this mistake.
>>> >>> My goal was to unify the two GUID types we had in grub but I missed
>>> the
>>> >>> fact that in my "solution" the alignments are not correct in all
>>> cases.
>>> >>>
>>> >>> The quickest way out could be to revert the GUID unification and
>>> printf
>>> >>> format specifier commits:
>>> >>>
>>> >>> 6ad116e5f guid: Make use of GUID printf format specifier
>>> >>> f82dbf2bd kern/misc: Add a format specifier GUIDs
>>> >>> 06edd40db guid: Unify GUID types
>>> >>>
>>> >>> And use the explicit, long-winded format string for printing the GUID
>>> >>> in the bli module instead (added in the commits following those).
>>> >>>
>>> >>> I am open to suggestions / comments.
>>> >>
>>> >> Adrian, could you check what will happen when you add alignment to the
>>> >> grub_guid_t as it was suggested by Frank here [2]?
>>> >>
>>> >> Personally I would avoid adding another GUID type with just alignment
>>> >> requirement as the difference. Making one GUID type with always
>>> enforced
>>> >> alignment should not cost us a lot. Or we can enforce alignment on EFI
>>> >> platforms only.
>>> >
>>> > My Itanium hardware is not available for bootloader tests at the
>>> moment, so I would
>>> > like to ask Pedro Miguel Justo or Frank Scheiner to test the proposed
>>> fix.
>>>
>>>
>>> The reason that before this unification there were a packed and aligned
>>> types suggest that the packed type was necessary in some cases. Frank had
>>> shared the concern against his own suggestion that changing the unified
>>> type to be aligned (as opposite to packed) would likely regress the cases
>>> where the packed might be needed/expected.
>>>
>>> Just for kicks, I gave it a try:
>>>
>>> ```
>>> diff --git a/include/grub/types.h b/include/grub/types.h
>>> index 0d96006fe..ff415c970 100644
>>> --- a/include/grub/types.h
>>> +++ b/include/grub/types.h
>>> @@ -376,7 +376,7 @@ struct grub_guid
>>>    grub_uint16_t data2;
>>>    grub_uint16_t data3;
>>>    grub_uint8_t data4[8];
>>> -} GRUB_PACKED;
>>> +} __attribute__ ((aligned(8)));
>>>  typedef struct grub_guid grub_guid_t;
>>>
>>>  #endif /* ! GRUB_TYPES_HEADER */
>>> ```
>>>
>>> As hypothesized, there are places where these structs (now unified) are
>>> expected to be packed, meaning to have an alignment of 1 (even smaller than
>>> the natural alignment of its larger member).
>>>
>>> One of the cases where the dependency is present is in the
>>> grub_gpt_partentry structure. This structure is packed and includes a GUID
>>> field. One struct of an enforced alignment ’n’ cannot host a member with
>>> enforced alignment ‘m’ where m > n. Thus, an 8 byte aligned grub_guid
>>> cannot be hosted inside a 1 byte aligned grub_gpt_partentry:
>>>
>>
>> grub_gpt_partentry doesn't need
>>
>> GRUB_PACKED. To be on a safe side we can
>>
>> add compile time assert on its size
>>
>>
>>
>>> ```
>>> In file included from grub-core/disk/ldm.c:26:
>>> ./include/grub/gpt_partition.h:70:1: error: alignment 1 of ‘struct
>>> grub_gpt_partentry’ is less than 8 [-Werror=packed-not-aligned]
>>>    70 | } GRUB_PACKED;
>>>       | ^
>>> ./include/grub/gpt_partition.h:70:1: error: alignment 1 of ‘struct
>>> grub_gpt_partentry’ is less than 8 [-Werror=packed-not-aligned]
>>> ```
>>>
>>> Now, we could go this rabbit hole on and try to hack grub_gpt_partentry,
>>> or special-case the GUID inside grub_gpt_partentry to be packed… but at
>>> which point will I just end up with the thing we were trying to avoid: more
>>> than one definition of GUID?
>>>
>>> >
>>> > Thanks,
>>> > Adrian
>>> >
>>> > --
>>> > .''`.  John Paul Adrian Glaubitz
>>> > : :' :  Debian Developer
>>> > `. `'   Physicist
>>> >  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913
>>>
>>> <0002-Mark-grub_gpt_partentry-as-aligned-to-8-bytes.patch>
> <0001-Add-missing-static-qualifier.patch>
> <0004-Add-compile-time-asserts-for-guid-and-gpt_partentry-.patch>
> <0003-Split-aligned-and-packed-guids.patch>
> <0005-Fix-typo.patch>
>
>
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to