Re: [bp:tip-x86-alternatives 1/1] error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type

From: Alexander Altman
Date: Tue Dec 27 2022 - 15:52:22 EST


> On Dec 27, 2022, at 6:16 AM, Borislav Petkov <bp@xxxxxxxxx> wrote:
>
> Resending because rust ML doesn't like big messages:
>
> From: rust-for-linux-owner@xxxxxxxxxxxxxxx
> To: rust-for-linux-approval@xxxxxxxxxxxxxxx, bp@xxxxxxxxx
> Subject: BOUNCE rust-for-linux@xxxxxxxxxxxxxxx: Message too long (>100000 chars)
>
> Rust folks, you can check out the whole thing here:
>
> https://lore.kernel.org/all/202212272003.rgQDX8DQ-lkp@xxxxxxxxx/
>
> (and maybe raise the limit on that ML of yours :))
>
> Thx.
>
> On Tue, Dec 27, 2022 at 02:52:25PM +0100, Borislav Petkov wrote:
>> On Tue, Dec 27, 2022 at 08:36:11PM +0800, kernel test robot wrote:
>>> Hi Borislav,
>>>
>>> FYI, the error/warning was bisected to this commit, please ignore it if it's irrelevant.
>>>
>>> tree: https://git.kernel.org/pub/scm/linux/kernel/git/bp/bp.git tip-x86-alternatives
>>> head: 82db736201e76889825efe8899ad55976111691a
>>> commit: 82db736201e76889825efe8899ad55976111691a [1/1] x86/alternatives: Add alt_instr.flags
>>> config: x86_64-rhel-8.3-rust
>>> compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
>>> reproduce (this is a W=1 build):
>>> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
>>> chmod +x ~/bin/make.cross
>>> # https://git.kernel.org/pub/scm/linux/kernel/git/bp/bp.git/commit/?id=82db736201e76889825efe8899ad55976111691a
>>> git remote add bp https://git.kernel.org/pub/scm/linux/kernel/git/bp/bp.git
>>> git fetch --no-tags bp tip-x86-alternatives
>>> git checkout 82db736201e76889825efe8899ad55976111691a
>>> # save the config file
>>> mkdir build_dir && cp config build_dir/.config
>>> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 olddefconfig
>>> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 prepare
>>
>> These reproduction instructions look insufficient to me. The env needs a
>> rust compiler installed. Which I don't have:
>>
>> ./scripts/rust_is_available.sh -v
>> ***
>> *** Rust compiler '' could not be found.
>> ***
>>
>> Or does some of that make.cross magic install one? I don't see a "rustc"
>> mentioned there at all but I see
>>
>> CONFIG_RUSTC_VERSION_TEXT="rustc 1.62.0 (a8314ef7d 2022-06-27)"
>>
>> in the .config so apparently that rustc thing has come from somewhere...
>>
>>> If you fix the issue, kindly add following tag where applicable
>>> | Reported-by: kernel test robot <lkp@xxxxxxxxx>
>>>
>>> All errors (new ones prefixed by >>):
>>>
>>>>> error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type


This is indeed directly because of your change, although fixing it beyond my
skill. Explanation:

You made the following change:
> - u16 cpuid; /* cpuid bit set for replacement */
> +
> + union {
> + struct {
> + u32 cpuid: 16; /* CPUID bit set for replacement */
> + u32 flags: 16; /* patching control flags */
> + };
> + u32 ft_flgs;
> + };

That caused Rust’s bindgen (bindings generator) to generate a type for the
altered field that indirectly included a representation of the
bitfields...which have a greater-than-natural alignment because of their
encoding (they’re represented as an array of 4 8-bit unsigned integers, but
aligned as if they’re a single 16-bit unsigned integer). This interacts
badly with the top-level command to make the alt_instr struct packed, which
bindgen faithfully translates from C __packed to Rust #[repr(packed)].

One way to resolve this temporarily would be to add the following line above
the offending struct:
/// <div rustbindgen hide></div>
This will cause bindgen to ignore the struct entirely and not translate it. If it’s
actually needed for Rust code, now or later, then we can’t do that and need
to actually replace it with something translatable, or else leave it hidden and
manually create its translation on the Rust side. For the latter, just using a
u32 for the entire bitfield-containing union would be sufficient.

>>
>> -ENOPARSE this error.
>>
>> Lemme add rust and toolchain MLs to Cc and leave the rest for them with
>> the hope that they can translate this linenoise for me.
>
> Well, not leaving it because rust ML can't take such big emails.
>
> --
> Regards/Gruss,
> Boris.
>
> https://people.kernel.org/tglx/notes-about-netiquette
>


Thanks,
Laine Taffin Altman