qemu-stable
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2] hw/pci-host/q35: Ignore write of reserved PCIEXBAR LENGTH


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH v2] hw/pci-host/q35: Ignore write of reserved PCIEXBAR LENGTH field
Date: Mon, 14 Jun 2021 13:14:51 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.1

ping?

On 5/26/21 4:24 PM, Philippe Mathieu-Daudé wrote:
> libFuzzer triggered the following assertion:
> 
>   cat << EOF | qemu-system-i386 -M pc-q35-5.0 \
>     -nographic -monitor none -serial none \
>     -qtest stdio -d guest_errors -trace pci\*
>   outl 0xcf8 0xf2000060
>   outl 0xcfc 0x8400056e
>   EOF
>   pci_cfg_write mch 00:0 @0x60 <- 0x8400056e
>   Aborted (core dumped)
> 
> This is because guest wrote MCH_HOST_BRIDGE_PCIEXBAR_LENGTH_RVD
> (reserved value) to the PCIE XBAR register.
> 
> There is no indication on the datasheet about what occurs when
> this value is written. Simply ignore it on QEMU (and report an
> guest error):
> 
>   pci_cfg_write mch 00:0 @0x60 <- 0x8400056e
>   Q35: Reserved PCIEXBAR LENGTH
>   pci_cfg_read mch 00:0 @0x0 -> 0x8086
>   pci_cfg_read mch 00:0 @0x0 -> 0x29c08086
>   ...
> 
> Cc: qemu-stable@nongnu.org
> Reported-by: Alexander Bulekov <alxndr@bu.edu>
> BugLink: https://bugs.launchpad.net/qemu/+bug/1878641
> Fixes: df2d8b3ed4 ("q35: Introduce q35 pc based chipset emulator")
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> v2: Do not remove default case (rth)
> ---
>  hw/pci-host/q35.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
> index 2eb729dff58..0f37cf056a9 100644
> --- a/hw/pci-host/q35.c
> +++ b/hw/pci-host/q35.c
> @@ -29,6 +29,7 @@
>   */
>  
>  #include "qemu/osdep.h"
> +#include "qemu/log.h"
>  #include "hw/i386/pc.h"
>  #include "hw/pci-host/q35.h"
>  #include "hw/qdev-properties.h"
> @@ -318,6 +319,8 @@ static void mch_update_pciexbar(MCHPCIState *mch)
>          addr_mask |= MCH_HOST_BRIDGE_PCIEXBAR_64ADMSK;
>          break;
>      case MCH_HOST_BRIDGE_PCIEXBAR_LENGTH_RVD:
> +        qemu_log_mask(LOG_GUEST_ERROR, "Q35: Reserved PCIEXBAR LENGTH\n");
> +        return;
>      default:
>          abort();
>      }
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]