Public bug reported: After upgrading to Ubuntu 20.04 LTS, GCC 9.3 displays a lot of notes:
hw/block/pflash_cfi01.c: In function ‘pflash_mem_read_with_attrs’: hw/block/pflash_cfi01.c:663:20: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 663 | static MemTxResult pflash_mem_read_with_attrs(void *opaque, hwaddr addr, uint64_t *value, | ^~~~~~~~~~~~~~~~~~~~~~~~~~ hw/block/pflash_cfi01.c: In function ‘pflash_mem_write_with_attrs’: hw/block/pflash_cfi01.c:677:20: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 677 | static MemTxResult pflash_mem_write_with_attrs(void *opaque, hwaddr addr, uint64_t value, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ hw/nvram/fw_cfg.c: In function ‘fw_cfg_dma_mem_valid’: hw/nvram/fw_cfg.c:475:13: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 475 | static bool fw_cfg_dma_mem_valid(void *opaque, hwaddr addr, | ^~~~~~~~~~~~~~~~~~~~ hw/nvram/fw_cfg.c: In function ‘fw_cfg_data_mem_valid’: hw/nvram/fw_cfg.c:483:13: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 483 | static bool fw_cfg_data_mem_valid(void *opaque, hwaddr addr, | ^~~~~~~~~~~~~~~~~~~~~ hw/nvram/fw_cfg.c: In function ‘fw_cfg_ctl_mem_valid’: hw/nvram/fw_cfg.c:501:13: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 501 | static bool fw_cfg_ctl_mem_valid(void *opaque, hwaddr addr, | ^~~~~~~~~~~~~~~~~~~~ hw/nvram/fw_cfg.c: In function ‘fw_cfg_comb_valid’: hw/nvram/fw_cfg.c:521:13: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 521 | static bool fw_cfg_comb_valid(void *opaque, hwaddr addr, | ^~~~~~~~~~~~~~~~~ hw/intc/arm_gic.c: In function ‘gic_do_hyp_read’: hw/intc/arm_gic.c:1996:20: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 1996 | static MemTxResult gic_do_hyp_read(void *opaque, hwaddr addr, uint64_t *data, | ^~~~~~~~~~~~~~~ hw/intc/arm_gic.c: In function ‘gic_thiscpu_hyp_read’: hw/intc/arm_gic.c:1979:20: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 1979 | static MemTxResult gic_thiscpu_hyp_read(void *opaque, hwaddr addr, uint64_t *data, | ^~~~~~~~~~~~~~~~~~~~ hw/intc/arm_gic.c: In function ‘gic_get_current_pending_irq’: hw/intc/arm_gic.c:419:17: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 419 | static uint16_t gic_get_current_pending_irq(GICState *s, int cpu, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ This seems related to: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88469 https://gcc.gnu.org/git/?p=gcc.git&a=commit;h=c590597c45 This is pretty unlikely in real code, but similar to Arm, the AArch64 ABI has a bug with the handling of 128-bit bit-fields, where if the bit-field dominates the overall alignment the back-end code may end up passing the argument correctly. This is a regression that started in gcc-6 when the ABI support code was updated to support overaligned types. The fix is very similar in concept to the Arm fix. 128-bit bit-fields are fortunately extremely rare, so I'd be very surprised if anyone has been bitten by this. ** Affects: qemu Importance: Undecided Status: New -- You received this bug notification because you are a member of qemu- devel-ml, which is subscribed to QEMU. https://bugs.launchpad.net/bugs/1881552 Title: potential AArch64 ABI bug wrt handling of 128-bit bit-fields Status in QEMU: New Bug description: After upgrading to Ubuntu 20.04 LTS, GCC 9.3 displays a lot of notes: hw/block/pflash_cfi01.c: In function ‘pflash_mem_read_with_attrs’: hw/block/pflash_cfi01.c:663:20: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 663 | static MemTxResult pflash_mem_read_with_attrs(void *opaque, hwaddr addr, uint64_t *value, | ^~~~~~~~~~~~~~~~~~~~~~~~~~ hw/block/pflash_cfi01.c: In function ‘pflash_mem_write_with_attrs’: hw/block/pflash_cfi01.c:677:20: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 677 | static MemTxResult pflash_mem_write_with_attrs(void *opaque, hwaddr addr, uint64_t value, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ hw/nvram/fw_cfg.c: In function ‘fw_cfg_dma_mem_valid’: hw/nvram/fw_cfg.c:475:13: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 475 | static bool fw_cfg_dma_mem_valid(void *opaque, hwaddr addr, | ^~~~~~~~~~~~~~~~~~~~ hw/nvram/fw_cfg.c: In function ‘fw_cfg_data_mem_valid’: hw/nvram/fw_cfg.c:483:13: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 483 | static bool fw_cfg_data_mem_valid(void *opaque, hwaddr addr, | ^~~~~~~~~~~~~~~~~~~~~ hw/nvram/fw_cfg.c: In function ‘fw_cfg_ctl_mem_valid’: hw/nvram/fw_cfg.c:501:13: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 501 | static bool fw_cfg_ctl_mem_valid(void *opaque, hwaddr addr, | ^~~~~~~~~~~~~~~~~~~~ hw/nvram/fw_cfg.c: In function ‘fw_cfg_comb_valid’: hw/nvram/fw_cfg.c:521:13: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 521 | static bool fw_cfg_comb_valid(void *opaque, hwaddr addr, | ^~~~~~~~~~~~~~~~~ hw/intc/arm_gic.c: In function ‘gic_do_hyp_read’: hw/intc/arm_gic.c:1996:20: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 1996 | static MemTxResult gic_do_hyp_read(void *opaque, hwaddr addr, uint64_t *data, | ^~~~~~~~~~~~~~~ hw/intc/arm_gic.c: In function ‘gic_thiscpu_hyp_read’: hw/intc/arm_gic.c:1979:20: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 1979 | static MemTxResult gic_thiscpu_hyp_read(void *opaque, hwaddr addr, uint64_t *data, | ^~~~~~~~~~~~~~~~~~~~ hw/intc/arm_gic.c: In function ‘gic_get_current_pending_irq’: hw/intc/arm_gic.c:419:17: note: parameter passing for argument of type ‘MemTxAttrs’ {aka ‘struct MemTxAttrs’} changed in GCC 9.1 419 | static uint16_t gic_get_current_pending_irq(GICState *s, int cpu, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ This seems related to: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88469 https://gcc.gnu.org/git/?p=gcc.git&a=commit;h=c590597c45 This is pretty unlikely in real code, but similar to Arm, the AArch64 ABI has a bug with the handling of 128-bit bit-fields, where if the bit-field dominates the overall alignment the back-end code may end up passing the argument correctly. This is a regression that started in gcc-6 when the ABI support code was updated to support overaligned types. The fix is very similar in concept to the Arm fix. 128-bit bit-fields are fortunately extremely rare, so I'd be very surprised if anyone has been bitten by this. To manage notifications about this bug go to: https://bugs.launchpad.net/qemu/+bug/1881552/+subscriptions