On Thu, 17 Apr 2025 11:24:32 +0100
Steven Price <steven.pr...@arm.com> wrote:

> On 17/04/2025 11:05, Boris Brezillon wrote:
> > drm_panthor_gpu_info::shader_present is currently automatically offset
> > by 4 byte to meet Arm's 32-bit/64-bit field alignment rules, but those
> > constraints don't stand on 32-bit x86 and cause a mismatch when running
> > an x86 binary in a user emulated environment like FEX. It's also
> > generally agreed that uAPIs should explicitly pad their struct fields,
> > which we originally intended to do, but a mistake slipped through during
> > the submission process, leading drm_panthor_gpu_info::shader_present to
> > be misaligned.
> > 
> > This uAPI change doesn't break any of the existing users of panthor
> > which are either arm32 or arm64 where the 64-bit alignment of
> > u64 fields is already enforced a the compiler level.
> > 
> > Fixes: 0f25e493a246 ("drm/panthor: Add uAPI")
> > Signed-off-by: Boris Brezillon <boris.brezil...@collabora.com>
> > ---
> >  include/uapi/drm/panthor_drm.h | 12 ++++++++++++
> >  1 file changed, 12 insertions(+)
> > 
> > diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h
> > index 97e2c4510e69..1379a2d4548c 100644
> > --- a/include/uapi/drm/panthor_drm.h
> > +++ b/include/uapi/drm/panthor_drm.h
> > @@ -293,6 +293,18 @@ struct drm_panthor_gpu_info {
> >     /** @as_present: Bitmask encoding the number of address-space exposed 
> > by the MMU. */
> >     __u32 as_present;
> >  
> > +   /**
> > +    * @garbage: Unused field that's not even zero-checked.
> > +    *
> > +    * This originates from a missing padding that leaked in the initial 
> > driver submission
> > +    * and was only found when testing the driver in a 32-bit x86 
> > environment, where
> > +    * u64 field alignment rules are relaxed compared to aarch32.
> > +    *
> > +    * This field can't be repurposed, because it's never been checked by 
> > the driver and
> > +    * userspace is not guaranteed to zero it out.  
> 
> Why would user space be providing this structure? This is meant to be
> provided from the kernel to user space, and (fingers-crossed) we've been
> zeroing the padding even though not explicitly? (rather than leaking
> some kernel data).

Uh, you're right this doesn't matter for kernel -> user data transfers.
I guess we can just make it a regular padding field, and allow it to be
repurposed if needed (as long as the expected default value is zero, of
course).

> 
> Other than the comment - yes this is a uAPI mistake we should fix.
> 
> I'm not sure how much we care about historic x86 uAPI but it also should
> be possible to identify an old x86 client using the x86 padding because
> the structure will be too short. But my preference would be to say "it's
> always been broken on x86" and therefore there's no regression.

That's also my opinion: we don't have native x86 users of panthor, and
emulated ones are just broken right now, because the kernel side (which
is arm32/64) already has a different layout.

> 
> Thanks,
> Steve
> 
> > +    */
> > +   __u32 garbage;
> > +
> >     /** @shader_present: Bitmask encoding the shader cores exposed by the 
> > GPU. */
> >     __u64 shader_present;
> >    
> 

Reply via email to