[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 11/43] bcm2835_property: use cached values when query
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PULL 11/43] bcm2835_property: use cached values when querying framebuffer |
Date: |
Thu, 12 May 2016 14:32:33 +0100 |
From: Sylvain Garrigues <address@hidden>
As the framebuffer settings are copied into the result message before it is
reconfigured, inconsistent behavior can happen when, for instance, you set with
a single message the width, height, and depth, and ask at the same time to
allocate the buffer and get the pitch and the size.
In this case, the reported pitch and size would be incorrect as they were
computed with the initial values of width, height and depth, not the ones the
client requested.
Signed-off-by: Sylvain Garrigues <address@hidden>
Reviewed-by: Andrew Baumann <address@hidden>
Message-id: address@hidden
[PMM: folded a couple of long lines]
Signed-off-by: Peter Maydell <address@hidden>
---
hw/misc/bcm2835_property.c | 33 ++++++++++++++++++++++++---------
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c
index 530411f..3447346 100644
--- a/hw/misc/bcm2835_property.c
+++ b/hw/misc/bcm2835_property.c
@@ -21,6 +21,8 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState
*s, uint32_t value)
int n;
uint32_t offset, length, color;
uint32_t xres, yres, xoffset, yoffset, bpp, pixo, alpha;
+ uint32_t tmp_xres, tmp_yres, tmp_xoffset, tmp_yoffset;
+ uint32_t tmp_bpp, tmp_pixo, tmp_alpha;
uint32_t *newxres = NULL, *newyres = NULL, *newxoffset = NULL,
*newyoffset = NULL, *newbpp = NULL, *newpixo = NULL, *newalpha = NULL;
@@ -139,7 +141,11 @@ static void
bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
case 0x00040001: /* Allocate buffer */
stl_le_phys(&s->dma_as, value + 12, s->fbdev->base);
- stl_le_phys(&s->dma_as, value + 16, s->fbdev->size);
+ tmp_xres = newxres != NULL ? *newxres : s->fbdev->xres;
+ tmp_yres = newyres != NULL ? *newyres : s->fbdev->yres;
+ tmp_bpp = newbpp != NULL ? *newbpp : s->fbdev->bpp;
+ stl_le_phys(&s->dma_as, value + 16,
+ tmp_xres * tmp_yres * tmp_bpp / 8);
resplen = 8;
break;
case 0x00048001: /* Release buffer */
@@ -150,8 +156,10 @@ static void
bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
break;
case 0x00040003: /* Get display width/height */
case 0x00040004:
- stl_le_phys(&s->dma_as, value + 12, s->fbdev->xres);
- stl_le_phys(&s->dma_as, value + 16, s->fbdev->yres);
+ tmp_xres = newxres != NULL ? *newxres : s->fbdev->xres;
+ tmp_yres = newyres != NULL ? *newyres : s->fbdev->yres;
+ stl_le_phys(&s->dma_as, value + 12, tmp_xres);
+ stl_le_phys(&s->dma_as, value + 16, tmp_yres);
resplen = 8;
break;
case 0x00044003: /* Test display width/height */
@@ -167,7 +175,8 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState
*s, uint32_t value)
resplen = 8;
break;
case 0x00040005: /* Get depth */
- stl_le_phys(&s->dma_as, value + 12, s->fbdev->bpp);
+ tmp_bpp = newbpp != NULL ? *newbpp : s->fbdev->bpp;
+ stl_le_phys(&s->dma_as, value + 12, tmp_bpp);
resplen = 4;
break;
case 0x00044005: /* Test depth */
@@ -179,7 +188,8 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState
*s, uint32_t value)
resplen = 4;
break;
case 0x00040006: /* Get pixel order */
- stl_le_phys(&s->dma_as, value + 12, s->fbdev->pixo);
+ tmp_pixo = newpixo != NULL ? *newpixo : s->fbdev->pixo;
+ stl_le_phys(&s->dma_as, value + 12, tmp_pixo);
resplen = 4;
break;
case 0x00044006: /* Test pixel order */
@@ -191,7 +201,8 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState
*s, uint32_t value)
resplen = 4;
break;
case 0x00040007: /* Get alpha */
- stl_le_phys(&s->dma_as, value + 12, s->fbdev->alpha);
+ tmp_alpha = newalpha != NULL ? *newalpha : s->fbdev->alpha;
+ stl_le_phys(&s->dma_as, value + 12, tmp_alpha);
resplen = 4;
break;
case 0x00044007: /* Test pixel alpha */
@@ -203,12 +214,16 @@ static void
bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
resplen = 4;
break;
case 0x00040008: /* Get pitch */
- stl_le_phys(&s->dma_as, value + 12, s->fbdev->pitch);
+ tmp_xres = newxres != NULL ? *newxres : s->fbdev->xres;
+ tmp_bpp = newbpp != NULL ? *newbpp : s->fbdev->bpp;
+ stl_le_phys(&s->dma_as, value + 12, tmp_xres * tmp_bpp / 8);
resplen = 4;
break;
case 0x00040009: /* Get virtual offset */
- stl_le_phys(&s->dma_as, value + 12, s->fbdev->xoffset);
- stl_le_phys(&s->dma_as, value + 16, s->fbdev->yoffset);
+ tmp_xoffset = newxoffset != NULL ? *newxoffset : s->fbdev->xoffset;
+ tmp_yoffset = newyoffset != NULL ? *newyoffset : s->fbdev->yoffset;
+ stl_le_phys(&s->dma_as, value + 12, tmp_xoffset);
+ stl_le_phys(&s->dma_as, value + 16, tmp_yoffset);
resplen = 8;
break;
case 0x00044009: /* Test virtual offset */
--
1.9.1
- [Qemu-devel] [PULL 00/43] target-arm queue, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 19/43] target-arm/translate-a64.c: Unify some of the ldst_reg decoding, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 02/43] omap_lcdc: Remove support for DEPTH != 32, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 12/43] hw/arm/nseries: Allocating Large sized arrays to heap, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 17/43] target-arm: Split data abort syndrome generator, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 07/43] hw/intc: QOM'ify pl190.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 05/43] hw/intc: QOM'ify exynos4210_gic.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 18/43] target-arm/translate-a64.c: Use extract32 in disas_ldst_reg_imm9, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 01/43] blizzard: Remove support for DEPTH != 32, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 13/43] target-arm: Stage 2 permission fault was fixed in AArch32 state, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 11/43] bcm2835_property: use cached values when querying framebuffer,
Peter Maydell <=
- [Qemu-devel] [PULL 06/43] hw/intc: QOM'ify imx_avic.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 15/43] tcg: Add tcg_set_insn_param, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 23/43] ACPI: Fix the definition of proximity in AcpiSratMemoryAffinity, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 31/43] i.MX: Add sabrelite i.MX6 emulation., Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 20/43] hw/display: QOM'ify exynos4210_fimd.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 08/43] hw/intc: QOM'ify slavio_intctl.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 14/43] target-arm: Fix descriptor address masking in ARM address translation, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 24/43] ACPI: move acpi_build_srat_memory to common place, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 04/43] hw/intc: QOM'ify exynos4210_combiner.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 29/43] i.MX: Add the Freescale SPI Controller, Peter Maydell, 2016/05/12