Le mar. 15 août 2023, 14:00, Laszlo Ersek <ler...@redhat.com> a écrit :

> On 8/15/23 10:17, Ard Biesheuvel wrote:
> > On Tue, 15 Aug 2023 at 05:42, Vladimir 'phcoder' Serbinenko
> > <phco...@gmail.com> wrote:
> >>>
> >>> .
> >>>
> >>> Ard thinks that a 64 bit alignment for EFI GUIDs is a mistake - see [1]
> >>> and [2]. Hence Linux uses `__aligned(__alignof__(u32))` for
> "efi_guid_t"
> >>> since 2019.
> >>
> >>
> >> My patch presents a reliability paradigm: accept all inputs, produce
> outputs that are always aligned to 8-byte. It can make sense even though I
> agree that requiring 8-byte alignment for UUID is weird. Yet it's difficult
> to know if some obscure firmware does rely on it in some one in a thousand
> edge case
> >
> > +1
> >
> > The Linux side change ensures that the OS does not present misaligned
> > GUIDs to the firmware.
> >
> > The problem with 8-byte alignment is that it deviates from EDK2, and
> > could result in struct layout changes due to padding.

See my audit in previous message
> > Given that EDK2

> > uses 32-bit alignment only, some of the struct types it defines might
> > suddenly need the __packed attribute on 32-bit builds if the alignment
> > of the GUID type is increased to 64 bits.
> >
> > E.g.,
> >
> > struct {
> >   void *
> >   guid
> > }
> >
> > will have no padding in 32-bit EDK2 based firmware builds, even if the
> > spec claims that GUIDs are 64-bit aligned.
> >

Yes, this is weird but in case of reference implementation contradicting
spec, then reference implementation takes priority in practice.

>
> > So the lowest risk change for Linux was to increase to 32-bit
> > alignment, as it fixes any potential issues with misaligned
> > load-multiple instructions on ARM, and other architectures don't care
> > that much about alignment anyway.
> >
>
> This is terrible.
>
> First, the Itanium firmware in question clearly enforces the 8-byte
> alignment. (BTW, have we checked Itanium with a 4-byte but not 8-byte
> alignment?)

No, we didn't  AFAIK

> specifies a binding for Itanium. And, we're having this discussion in
> the first place because of Itanium. So we need to make up our minds
> about adhering to the 8-byte alignment or not.
>
I'm biased towards allocating at 8-byte alignment but accepting any
alignment

>
> Second, the fact that edk2 does not align EFI_GUID to 8 bytes, contrary
> to the spec, is absolutely terrible. I don't understand then how it
> worked on Itanium before Itanium support was killed.
>
No members in guid have uint64_t type so most likely only 32-bit alignment
was used in most cases. 64-bit alignment allows accessing guid as 2
uint64_t's but I doubt it was ever widely used. A rare use might still
happen though.

>
> What I can imagine is the following situation:
> - the UEFI spec does not match reality (the reference implementation),
> and the actually required alignment is 4 bytes only
> - Itanium is happy with the 4 bytes alignment too (IIUC grub's malloc
> aligns at 1 byte by default, so the 4-byte alignment could still be
> violated in practice)
>
grub-malloc is 16-byte aligned.
The problem is that stack and static allocations are aligned only to type
alignment.
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to