From patchwork Fri May 10 16:28:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hou Qiming X-Patchwork-Id: 1098219 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="XjVS2ET6"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 450wvH1tkvz9sB8 for ; Sat, 11 May 2019 02:40:59 +1000 (AEST) Received: from localhost ([127.0.0.1]:46558 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hP8Zt-0001dE-7w for incoming@patchwork.ozlabs.org; Fri, 10 May 2019 12:40:57 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43270) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hP8Ni-0008RD-O2 for qemu-devel@nongnu.org; Fri, 10 May 2019 12:28:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hP8Nh-0003BP-G4 for qemu-devel@nongnu.org; Fri, 10 May 2019 12:28:22 -0400 Received: from mail-qk1-x741.google.com ([2607:f8b0:4864:20::741]:40795) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hP8Nh-0003B6-BP for qemu-devel@nongnu.org; Fri, 10 May 2019 12:28:21 -0400 Received: by mail-qk1-x741.google.com with SMTP id w20so4014223qka.7 for ; Fri, 10 May 2019 09:28:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=pajFOVN2jwVk6oanPLNaIV/SoTrhlAKI9cBxsW51JCM=; b=XjVS2ET6auZxKldc/TYTgyW/lbxv7KyjesbQhi4OxIRJz0O+B+HRKeYJW8/lnSkfSj yfqkvQsDQZmXf7Z9VJrrewi6dL13F4bbknjQZbW96N32ZfawbScFxQ/hSZvsjvVtrbs0 xEJkAXuGeskl1cjhu0DVKyyy+QPIe2ies7ulzX/W2oHYsrGgn5memWl8vkmtavu1cE1b 2FXkLikDLsJCQLElaFWwYxE4wJhR9DAQzVP6aYTRz20VnaQVqHV5BH+IANIVGlI2rW1l MXchmGM2WhrTmGx0DUWJ6NmwsIYYckhxosvV+2TF382r6wxz5KfLDUGhu1RSf4TclSBq zj0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=pajFOVN2jwVk6oanPLNaIV/SoTrhlAKI9cBxsW51JCM=; b=dzR1nuZJTNYDHKTtSXMdSWA4oRNvRBk6ywEMSpqxEvPa6EFLttbvqNai0GejMkFWIt nqRM0lLcLuTo0oavFFSuizbi6U7BoKL14e6ga7NdskvfOythk2kIVZHAYXPnyd69cAZZ Bz8f+LISJo5+WAsD1LDqIPXeuA3DxRCDIA8rjbHhiDAJy8/Fvy3TOWn4PmTUyWnF1k8Y aX7XRvMRUAXmQ/vsUKK/cphwI6pTnVWH9rqWceQtxL3PgApaujYL/NOCroHY4qdPoPJa YWkaq1QiXSE9PavBh64AuYPJJPlr9jSR4Kt5keRZVBClna1zrsiW2HIH313MPPf+aVvG niPQ== X-Gm-Message-State: APjAAAV0UsjP8dpQBJ9hiioDemwpomp0uRT3v3tS32dnD+DHEqeOgrpd N0Ste9sU97GKhuPQhHyT4FBqnPKHBXKY5Egx9qTqn9Hi X-Google-Smtp-Source: APXvYqzuishv7O28/B2wbm0CWJ1A/w4gMRShYT2jDWX19anghzDGU8TJZPdhkfdnkfb9hQ3ZZ5MS/sNPFQTwKcMvuLE= X-Received: by 2002:a37:9587:: with SMTP id x129mr9914122qkd.9.1557505699768; Fri, 10 May 2019 09:28:19 -0700 (PDT) MIME-Version: 1.0 References: <20190509064848.wjhchsfov7q6komj@sirius.home.kraxel.org> <3e619b5c-8fb3-2655-2d92-37598db098d8@gmail.com> <20190510085947.y62lttdtrg5cxx6b@sirius.home.kraxel.org> <3fb8b79d-9f68-2342-d3ae-3aefa873109b@gmail.com> <20190510103900.botgnbbo2ii4jxgo@sirius.home.kraxel.org> <01de4824-5c19-6b6c-5b75-fa54a883ab4a@gmail.com> In-Reply-To: <01de4824-5c19-6b6c-5b75-fa54a883ab4a@gmail.com> From: Hou Qiming Date: Sat, 11 May 2019 00:28:04 +0800 Message-ID: To: qemu-devel@nongnu.org X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::741 X-Content-Filtered-By: Mailman/MimeDel 2.1.21 Subject: [Qemu-devel] [PATCH v2 1/3] hw/display/ramfb: fix guest memory un-mapping X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Pulled back the `qemu_create_displaysurface_guestmem` function to create the display surface so that the guest memory gets properly unmapped. Signed-off-by: HOU Qiming --- hw/display/ramfb.c | 53 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/hw/display/ramfb.c b/hw/display/ramfb.c index 25c8ad7..98703f7 100644 --- a/hw/display/ramfb.c +++ b/hw/display/ramfb.c @@ -32,33 +32,60 @@ struct RAMFBState { struct RAMFBCfg cfg; }; +static void qemu_unmap_displaysurface_guestmem(pixman_image_t *image, + void *unused) +{ + void *data = pixman_image_get_data(image); + uint32_t size = pixman_image_get_stride(image) * + pixman_image_get_height(image); + cpu_physical_memory_unmap(data, size, 0, 0); +} + +static DisplaySurface *qemu_create_displaysurface_guestmem( + int width, int height, + pixman_format_code_t format, + int linesize, uint64_t addr) +{ + DisplaySurface *surface; + hwaddr size; + void *data; + + if (linesize == 0) { + linesize = width * PIXMAN_FORMAT_BPP(format) / 8; + } + + size = (hwaddr)linesize * height; + data = cpu_physical_memory_map(addr, &size, 0); + if (size != (hwaddr)linesize * height) { + cpu_physical_memory_unmap(data, size, 0, 0); + return NULL; + } + + surface = qemu_create_displaysurface_from + (width, height, format, linesize, data); + pixman_image_set_destroy_function + (surface->image, qemu_unmap_displaysurface_guestmem, NULL); + + return surface; +} + static void ramfb_fw_cfg_write(void *dev, off_t offset, size_t len) { RAMFBState *s = dev; - void *framebuffer; uint32_t fourcc, format; - hwaddr stride, addr, length; + hwaddr stride, addr; s->width = be32_to_cpu(s->cfg.width); s->height = be32_to_cpu(s->cfg.height); stride = be32_to_cpu(s->cfg.stride); fourcc = be32_to_cpu(s->cfg.fourcc); addr = be64_to_cpu(s->cfg.addr); - length = stride * s->height; format = qemu_drm_format_to_pixman(fourcc); fprintf(stderr, "%s: %dx%d @ 0x%" PRIx64 "\n", __func__, s->width, s->height, addr); - framebuffer = address_space_map(&address_space_memory, - addr, &length, false, - MEMTXATTRS_UNSPECIFIED); - if (!framebuffer || length < stride * s->height) { - s->width = 0; - s->height = 0; - return; - } - s->ds = qemu_create_displaysurface_from(s->width, s->height, - format, stride, framebuffer); + s->ds = qemu_create_displaysurface_guestmem(s->width, s->height, + format, stride, addr); } void ramfb_display_update(QemuConsole *con, RAMFBState *s) From patchwork Fri May 10 16:29:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hou Qiming X-Patchwork-Id: 1098216 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="f4eiruZu"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 450wqb4gybz9sB8 for ; Sat, 11 May 2019 02:37:47 +1000 (AEST) Received: from localhost ([127.0.0.1]:46466 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hP8Wn-0007K7-Jr for incoming@patchwork.ozlabs.org; Fri, 10 May 2019 12:37:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43486) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hP8Or-00010d-K6 for qemu-devel@nongnu.org; Fri, 10 May 2019 12:29:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hP8Oq-0003iR-4H for qemu-devel@nongnu.org; Fri, 10 May 2019 12:29:33 -0400 Received: from mail-qt1-x843.google.com ([2607:f8b0:4864:20::843]:46331) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hP8Op-0003hQ-U0 for qemu-devel@nongnu.org; Fri, 10 May 2019 12:29:32 -0400 Received: by mail-qt1-x843.google.com with SMTP id i31so7218775qti.13 for ; Fri, 10 May 2019 09:29:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=w8JGVpuHGo+uhEjuFvHrCYkHRVhdiYlJuc2gGsqrCIA=; b=f4eiruZuoJLKSAbD7mZD0KnDay4EkbSaQA2/fIltAp0xDNmXVK6YNNNXcma41wIL8k W9B5rMw5IB7A+kqC86yheyJuoTOEwRThBgLRBJuRvpvs12MjFtVKO9WcKoRc5+9I9o/j zadZd5ubAMP0eCPtllBUYnzDKZBWnOcQ0Z2TfnmXmfNjZ+LxAKaHefMX0joEa+BjYVf6 6dza8xQ/B/ES8Pmu4a88QNjqcfo7DMnMnxZuMU2Yj2BVsUU7qx/8ZPKViTEwwXr1IB0G UQ2yXa7nnmASO5U+XSCDeIx6yS7KcTg74qtCHQNhllgyiolQEHwl2CrmSTuhHwvbsZY/ yp5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=w8JGVpuHGo+uhEjuFvHrCYkHRVhdiYlJuc2gGsqrCIA=; b=YymsJz3wD8w+BfsqWWdzjG3otcIekIxrVCvAzM/7Y1la570n/2fACkKlS5WaLYk3pS oYmzfYr/D0t0R0M2ndqjuEjcoPIisVpx3Vs2iu7bcx0pwVlfbTWJU/zFbR3o410hYwHZ a204PXIdc505icC5LhFz68rkFsl1vgE1pB9y8kqY1dr1Qih8AkURBpVtgF5EqzDeoPrr 38+Eh1Z/ULWh+WEjmg7++46KaKqPhKa9hbPusf4dhwrdA9xNp/ji99b62xCGkgSYxIVc G3cOxvY2NY47YbAt+SiLUbK/1kl5Dzk9KuSfMCipvd0iBfg2UA6+oU1OZkmtB6zxBiki WVsA== X-Gm-Message-State: APjAAAUDYfuYGFAsWydMU9VI5P0ofI/JVjPp4v44L8Hd0zKKr2fEcWgH axFXdVF9R5P/DCxC8dvi/EieFMOIZASHJayFFsLOcjzj X-Google-Smtp-Source: APXvYqz/46wYvi86q3FnjQobiOJ4keKOwdOIUyeyowyW2BtstNboCoSZK+pyT2oynSjk7WZ3pjHpEmXMvUsgw+MqKXs= X-Received: by 2002:aed:224d:: with SMTP id o13mr10291759qtc.56.1557505768608; Fri, 10 May 2019 09:29:28 -0700 (PDT) MIME-Version: 1.0 References: <20190509064848.wjhchsfov7q6komj@sirius.home.kraxel.org> <3e619b5c-8fb3-2655-2d92-37598db098d8@gmail.com> <20190510085947.y62lttdtrg5cxx6b@sirius.home.kraxel.org> <3fb8b79d-9f68-2342-d3ae-3aefa873109b@gmail.com> <20190510103900.botgnbbo2ii4jxgo@sirius.home.kraxel.org> <01de4824-5c19-6b6c-5b75-fa54a883ab4a@gmail.com> In-Reply-To: From: Hou Qiming Date: Sat, 11 May 2019 00:29:00 +0800 Message-ID: To: qemu-devel@nongnu.org X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::843 X-Content-Filtered-By: Mailman/MimeDel 2.1.21 Subject: [Qemu-devel] [PATCH v2 2/3] hw/display/ramfb: lock guest resolution after it's set X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Only allow one resolution change per guest boot, which prevents a crash when the guest writes garbage to the configuration space (e.g. when rebooting). Signed-off-by: HOU Qiming --- hw/display/ramfb.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) format, stride, addr); } @@ -103,6 +111,13 @@ void ramfb_display_update(QemuConsole *con, RAMFBState *s) dpy_gfx_update_full(con); } +static void ramfb_reset(void *opaque) +{ + RAMFBState *s = (RAMFBState *)opaque; + s->locked = false; + memset(&s->cfg, 0, sizeof(s->cfg)); +} + RAMFBState *ramfb_setup(Error **errp) { FWCfgState *fw_cfg = fw_cfg_find(); @@ -115,9 +130,12 @@ RAMFBState *ramfb_setup(Error **errp) s = g_new0(RAMFBState, 1); + s->locked = false; + rom_add_vga("vgabios-ramfb.bin"); fw_cfg_add_file_callback(fw_cfg, "etc/ramfb", NULL, ramfb_fw_cfg_write, s, &s->cfg, sizeof(s->cfg), false); + qemu_register_reset(ramfb_reset, s); return s; } diff --git a/hw/display/ramfb.c b/hw/display/ramfb.c index 98703f7..d255ddc 100644 --- a/hw/display/ramfb.c +++ b/hw/display/ramfb.c @@ -30,6 +30,7 @@ struct RAMFBState { DisplaySurface *ds; uint32_t width, height; struct RAMFBCfg cfg; + bool locked; }; static void qemu_unmap_displaysurface_guestmem(pixman_image_t *image, @@ -72,18 +73,25 @@ static DisplaySurface *qemu_create_displaysurface_guestmem( static void ramfb_fw_cfg_write(void *dev, off_t offset, size_t len) { RAMFBState *s = dev; - uint32_t fourcc, format; + uint32_t fourcc, format, width, height; hwaddr stride, addr; - s->width = be32_to_cpu(s->cfg.width); - s->height = be32_to_cpu(s->cfg.height); + width = be32_to_cpu(s->cfg.width); + height = be32_to_cpu(s->cfg.height); stride = be32_to_cpu(s->cfg.stride); fourcc = be32_to_cpu(s->cfg.fourcc); addr = be64_to_cpu(s->cfg.addr); format = qemu_drm_format_to_pixman(fourcc); fprintf(stderr, "%s: %dx%d @ 0x%" PRIx64 "\n", __func__, - s->width, s->height, addr); + width, height, addr); + if (s->locked) { + fprintf(stderr, "%s: resolution locked, change rejected\n", __func__); + return; + } + s->locked = true; + s->width = width; + s->height = height; s->ds = qemu_create_displaysurface_guestmem(s->width, s->height, From patchwork Fri May 10 16:29:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hou Qiming X-Patchwork-Id: 1098220 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ktIn2HqQ"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 450wxM30rQz9sB8 for ; Sat, 11 May 2019 02:42:47 +1000 (AEST) Received: from localhost ([127.0.0.1]:46595 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hP8bd-00036y-EY for incoming@patchwork.ozlabs.org; Fri, 10 May 2019 12:42:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43618) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hP8PN-0001WU-3x for qemu-devel@nongnu.org; Fri, 10 May 2019 12:30:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hP8PG-0003uH-KQ for qemu-devel@nongnu.org; Fri, 10 May 2019 12:30:00 -0400 Received: from mail-qt1-x844.google.com ([2607:f8b0:4864:20::844]:36522) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hP8PG-0003sq-EI for qemu-devel@nongnu.org; Fri, 10 May 2019 12:29:58 -0400 Received: by mail-qt1-x844.google.com with SMTP id a17so6027208qth.3 for ; Fri, 10 May 2019 09:29:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=U6QV41w4C/OX4ODHx6H00NnrOOwJDGnMfm7tyshfa30=; b=ktIn2HqQG/J2ls+fRuWRGGxdIeZmOFLcoeSRIv/7jpEYUKmiuFUHbrvJ9zZy+oHuTn OyNnL5yNe5tFwjU9cu3AxMqNzvp6oKHfb9eb99GNjNt40ksg59AsxXIQAbT5Pcnzk3WG ulHEJZF6hIIqfNEldSkkX3eDh8nrh7z0AIn6bWyFpjia7xKEbQQafmyt++sh/27G/+Ne KUO3Qy6uSC8G5c5z7U/+7h3zxoF/qDSm1pMTBEFzYDoRw/PsuFlszaSMPqvLeNjtx5ry fd7gJNX4I3EN36cp2ex2ecB7CV3WyCxrAv8J40boYwbxEPkZ6/7SrFzuYa/OPdBES1C7 VoCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=U6QV41w4C/OX4ODHx6H00NnrOOwJDGnMfm7tyshfa30=; b=DSyPJ7tEpeEgzlhuHde8OQWgNjvpefwiuCll7bttv1L7vN/Njpp0Tks4oPvMAAi6kl aEwkt1ysZj1B/7BBG8XO2mYh/TbjVoN2eXJM0FeTui487Z6eSbp7MKc32WGT7OO3ZRvK n8dDDFQYVIo0jgrAe10EQmccL/GkkNi7kdwIRKTo5HvFKCsXn/jlPwq3X1gfWfyBDUJ8 4pgvksszJqTTAmxJmYQyknHw5fDSIA7F/ces/IxL5bz8r/ACWyIFuA5wNKpaNu247/jM FwUFbLZcPJG/R1V3fwEb3q43ZrjpCLsXzMhOWDEcSF8E5MMNfX+y6I1NF4zlla8lJ/20 BrDA== X-Gm-Message-State: APjAAAWaY9nQ1W9baOicha9d8+QgY16K2mnWM9L0oycKH1X0qf10zCLV 0r4SVr1HVPmEy6HutIraZO5hWQv6Vqwe/0BXx9nxyLan X-Google-Smtp-Source: APXvYqxsk0c8S9VP4buWCcH3Itj/Flq8nM3YL2IeB7dgzYwyCIl/gwUvdH5I1bxoMlK2YDMN0QvtLx2UMq6jKUzCkDk= X-Received: by 2002:a0c:ba99:: with SMTP id x25mr10132385qvf.212.1557505795045; Fri, 10 May 2019 09:29:55 -0700 (PDT) MIME-Version: 1.0 References: <20190509064848.wjhchsfov7q6komj@sirius.home.kraxel.org> <3e619b5c-8fb3-2655-2d92-37598db098d8@gmail.com> <20190510085947.y62lttdtrg5cxx6b@sirius.home.kraxel.org> <3fb8b79d-9f68-2342-d3ae-3aefa873109b@gmail.com> <20190510103900.botgnbbo2ii4jxgo@sirius.home.kraxel.org> <01de4824-5c19-6b6c-5b75-fa54a883ab4a@gmail.com> In-Reply-To: From: Hou Qiming Date: Sat, 11 May 2019 00:29:34 +0800 Message-ID: To: qemu-devel@nongnu.org X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::844 X-Content-Filtered-By: Mailman/MimeDel 2.1.21 Subject: [Qemu-devel] [PATCH v2 3/3] hw/display/ramfb: initialize fw-config space with xres / yres X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" If xres / yres were specified in QEMU command line, write them as an initial resolution to the fw-config space on guest reset, which a later BIOS / OVMF patch can take advantage of. Signed-off-by: HOU Qiming --- hw/display/ramfb-standalone.c | 12 +++++++++++- hw/display/ramfb.c | 16 +++++++++++++++- hw/vfio/display.c | 4 ++-- include/hw/display/ramfb.h | 2 +- stubs/ramfb.c | 2 +- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/hw/display/ramfb-standalone.c b/hw/display/ramfb-standalone.c index da3229a..6441449 100644 --- a/hw/display/ramfb-standalone.c +++ b/hw/display/ramfb-standalone.c @@ -1,6 +1,7 @@ #include "qemu/osdep.h" #include "qapi/error.h" #include "hw/loader.h" +#include "hw/isa/isa.h" #include "hw/display/ramfb.h" #include "ui/console.h" #include "sysemu/sysemu.h" @@ -11,6 +12,8 @@ typedef struct RAMFBStandaloneState { SysBusDevice parent_obj; QemuConsole *con; RAMFBState *state; + uint32_t xres; + uint32_t yres; } RAMFBStandaloneState; static void display_update_wrapper(void *dev) @@ -33,15 +36,22 @@ static void ramfb_realizefn(DeviceState *dev, Error **errp) RAMFBStandaloneState *ramfb = RAMFB(dev); ramfb->con = graphic_console_init(dev, 0, &wrapper_ops, dev); - ramfb->state = ramfb_setup(errp); + ramfb->state = ramfb_setup(dev, errp); } +static Property ramfb_properties[] = { + DEFINE_PROP_UINT32("xres", RAMFBStandaloneState, xres, 0), + DEFINE_PROP_UINT32("yres", RAMFBStandaloneState, yres, 0), + DEFINE_PROP_END_OF_LIST(), +}; + static void ramfb_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); dc->realize = ramfb_realizefn; + dc->props = ramfb_properties; dc->desc = "ram framebuffer standalone device"; dc->user_creatable = true; } diff --git a/hw/display/ramfb.c b/hw/display/ramfb.c index d255ddc..9179d17 100644 --- a/hw/display/ramfb.c +++ b/hw/display/ramfb.c @@ -12,6 +12,7 @@ */ #include "qemu/osdep.h" #include "qapi/error.h" +#include "qemu/option.h" #include "hw/loader.h" #include "hw/display/ramfb.h" #include "ui/console.h" @@ -29,6 +30,7 @@ struct QEMU_PACKED RAMFBCfg { struct RAMFBState { DisplaySurface *ds; uint32_t width, height; + uint32_t starting_width, starting_height; struct RAMFBCfg cfg; bool locked; }; @@ -116,9 +118,11 @@ static void ramfb_reset(void *opaque) RAMFBState *s = (RAMFBState *)opaque; s->locked = false; memset(&s->cfg, 0, sizeof(s->cfg)); + s->cfg.width = s->starting_width; + s->cfg.height = s->starting_height; } -RAMFBState *ramfb_setup(Error **errp) +RAMFBState *ramfb_setup(DeviceState* dev, Error **errp) { FWCfgState *fw_cfg = fw_cfg_find(); RAMFBState *s; @@ -130,6 +134,16 @@ RAMFBState *ramfb_setup(Error **errp) s = g_new0(RAMFBState, 1); + const char *s_fb_width = qemu_opt_get(dev->opts, "xres"); + const char *s_fb_height = qemu_opt_get(dev->opts, "yres"); + if (s_fb_width) { + s->cfg.width = atoi(s_fb_width); + s->starting_width = s->cfg.width; + } + if (s_fb_height) { + s->cfg.height = atoi(s_fb_height); + s->starting_height = s->cfg.height; + } s->locked = false; rom_add_vga("vgabios-ramfb.bin"); diff --git a/hw/vfio/display.c b/hw/vfio/display.c index a3d9c8f..2c2d3e5 100644 --- a/hw/vfio/display.c +++ b/hw/vfio/display.c @@ -352,7 +352,7 @@ static int vfio_display_dmabuf_init(VFIOPCIDevice *vdev, Error **errp) &vfio_display_dmabuf_ops, vdev); if (vdev->enable_ramfb) { - vdev->dpy->ramfb = ramfb_setup(errp); + vdev->dpy->ramfb = ramfb_setup(DEVICE(vdev), errp); } vfio_display_edid_init(vdev); return 0; @@ -478,7 +478,7 @@ static int vfio_display_region_init(VFIOPCIDevice *vdev, Error **errp) &vfio_display_region_ops, vdev); if (vdev->enable_ramfb) { - vdev->dpy->ramfb = ramfb_setup(errp); + vdev->dpy->ramfb = ramfb_setup(DEVICE(vdev), errp); } return 0; } diff --git a/include/hw/display/ramfb.h b/include/hw/display/ramfb.h index b33a2c4..f6c2de9 100644 --- a/include/hw/display/ramfb.h +++ b/include/hw/display/ramfb.h @@ -4,7 +4,7 @@ /* ramfb.c */ typedef struct RAMFBState RAMFBState; void ramfb_display_update(QemuConsole *con, RAMFBState *s); -RAMFBState *ramfb_setup(Error **errp); +RAMFBState *ramfb_setup(DeviceState *dev, Error **errp); /* ramfb-standalone.c */ #define TYPE_RAMFB_DEVICE "ramfb" diff --git a/stubs/ramfb.c b/stubs/ramfb.c index 48143f3..0799093 100644 --- a/stubs/ramfb.c +++ b/stubs/ramfb.c @@ -6,7 +6,7 @@ void ramfb_display_update(QemuConsole *con, RAMFBState *s) { } -RAMFBState *ramfb_setup(Error **errp) +RAMFBState *ramfb_setup(DeviceState* dev, Error **errp) { error_setg(errp, "ramfb support not available"); return NULL;