On 6/12/24 11:59, Peter Maydell wrote:
On Thu, 5 Dec 2024 at 18:30, Paolo Bonzini <pbonz...@redhat.com> wrote:

On 12/5/24 19:15, Richard Henderson wrote:
On 12/5/24 00:07, Zhao Liu wrote:
The MemTxAttrs structure is composed of bitfield members, and bindgen is
unable to generate an equivalent macro definition for
MEMTXATTRS_UNSPECIFIED.

I'm happy to move away from bit fields to uint32_t or suchlike to enable
MEMTXATTRS_UNSPECIFIED be a compile-time constant.

Yeah, if we go from

typedef struct MemTxAttrs {
      unsigned int unspecified:1;
      unsigned int secure:1;
      unsigned int space:2;
      unsigned int user:1;
      unsigned int memory:1;
      unsigned int requester_id:16;
      unsigned int pid:8;
} MemTxAttrs;

to

typedef struct MemTxAttrs {
      uint8_t unspecified;
      uint8_t secure;
      uint8_t space;
      uint8_t user;
      uint8_t memory;
      uint8_t pid;
      uint16_t requester_id;
} MemTxAttrs;

is still decently packed and simplifies things a lot.

The old struct is 4 bytes, and the new one is 8 bytes. We do
a lot of directly passing 'struct MemTxAttrs' arguments around
as arguments to functions (i.e. not passing pointers to them),
so increasing it in size is not completely free.

Should we add a check to not pass 8 bytes?

  QEMU_BUILD_BUG_ON(sizeof(MemTxAttrs) != sizeof(uint64_t));


Reply via email to