From patchwork Tue Mar 17 10:03:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442427 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 05019913 for ; Tue, 17 Mar 2020 10:14:54 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 71EEC206EC for ; Tue, 17 Mar 2020 10:14:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="p9ZPO48H" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 71EEC206EC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55674 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9FM-00031z-IH for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:14:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45229) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95h-0000xM-7x for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95W-0001KK-Nl for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:53 -0400 Received: from ozlabs.org ([203.11.71.1]:59955) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95V-0000Np-3e; Tue, 17 Mar 2020 06:04:42 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKv2pxrz9sPR; Tue, 17 Mar 2020 21:04:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439475; bh=8A+KaP+Y4XZ/WHaF2XZly7J1NhFQyfdVqyaRuyRsHFA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=p9ZPO48Hu3me4NgI2LzrhxB7s2gNfPnKp8GaJ6GXFo3LuMU7yKCh5qRTHFGsYpjFL NofboP6X7RzoyCZB9wgyBb3qYFHuIf5YygqyIvZ18bPDK7PHA6PVoiTfb0iFyrO9Ea owhXF0OEnGq7OUUzl6lrl0fjcnyKLV7hUF4F6zJk= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 01/45] pseries: Update SLOF firmware image Date: Tue, 17 Mar 2020 21:03:39 +1100 Message-Id: <20200317100423.622643-2-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Alexey Kardashevskiy This adds vTPM support, full-FDT-rebuild-on-CAS fixes and basic ext4 support. The full changelog is: Alexey Kardashevskiy (10): disk-label: Prepare for extenting disk-label: Support Linux GPT partition type ext2: Prepare for extending ext2: Rename group-desc-size ext2: Read size of group descriptors ext2: Read all 64bit of inode number ext2/4: Add basic extent tree support elf64: Add LE64 ABIv1/2 support for loading images to given address fdt: Fix creating new nodes at H_CAS version: update to 20200221 Greg Kurz (2): fdt: Fix update of "interrupt-controller" node at CAS fdt: Delete nodes of devices removed between boot and CAS Stefan Berger (8): slof: Implement SLOF_get_keystroke() and SLOF_reset() slof: Make linker script variables accessible qemu: Make print_version variable accessible tpm: Add TPM CRQ driver implementation tpm: Add sha256 implementation tcgbios: Add TPM 2.0 support and firmware API tcgbios: Implement menu to clear TPM 2 and activate its PCR banks tcgbios: Measure the GPT table Signed-off-by: Alexey Kardashevskiy Signed-off-by: David Gibson --- pc-bios/README | 2 +- pc-bios/slof.bin | Bin 931032 -> 968616 bytes roms/SLOF | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pc-bios/README b/pc-bios/README index d6d33d237f..a71fb318b3 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -14,7 +14,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/aik/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20191217. + built from git tag qemu-slof-20200221. - sgabios (the Serial Graphics Adapter option ROM) provides a means for legacy x86 software to communicate with an attached serial console as diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index 78d8b26cbb88a1913c3b262fd5be29ff89afd554..1c5948561639cfe244ad5d60506050ddb0c9b5b2 100644 GIT binary patch delta 263704 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

*z#t4z+-Gnk=A4y+fXu` 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 J?c49Y^)CQ54<-Nr diff --git a/roms/SLOF b/roms/SLOF index 9546892a80..7c98b3b613 160000 --- a/roms/SLOF +++ b/roms/SLOF @@ -1 +1 @@ -Subproject commit 9546892a80d5a4c73deea6719de46372f007f4a6 +Subproject commit 7c98b3b613338a385722a953517349664aa4f532 From patchwork Tue Mar 17 10:03:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442391 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6E9D01392 for ; Tue, 17 Mar 2020 10:07:49 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 45303205ED for ; Tue, 17 Mar 2020 10:07:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="d9DLhVjg" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 45303205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55550 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE98W-0006cr-EG for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:07:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44875) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95X-0000kB-DK for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95V-0001DS-Me for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:42 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:38125 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95U-0000PW-R6; Tue, 17 Mar 2020 06:04:41 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKv3svgz9sRY; Tue, 17 Mar 2020 21:04:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439475; bh=PBE+gjeFRpPSfcZJVO9UNrzoIcWu1Dh/piS9F0gC7rg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=d9DLhVjged4dRVvvfm3UA5Nzy6VpWGUVjkCj1YMaKRp5rNUuMh2lZfqFyU4QKxkBI 5ORD3vecbyvmsnzBZY5y1/UWN+k26Y69ZVS+Uy1OO+UAZ8vcengpVysb+EbHIsdi6n UWX8AWR0gUSlTeUqCXEMN7Otg9JyPyxDmGUS0KyY= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 02/45] spapr: Handle pending hot plug/unplug requests at CAS Date: Tue, 17 Mar 2020 21:03:40 +1100 Message-Id: <20200317100423.622643-3-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Greg Kurz If a hot plug or unplug request is pending at CAS, we currently trigger a CAS reboot, which severely increases the guest boot time. This is because SLOF doesn't handle hot plug events and we had no way to fix the FDT that gets presented to the guest. We can do better thanks to recent changes in QEMU and SLOF: - we now return a full FDT to SLOF during CAS - SLOF was fixed to correctly detect any device that was either added or removed since boot time and to update its internal DT accordingly. The right solution is to process all pending hot plug/unplug requests during CAS: convert hot plugged devices to cold plugged devices and remove the hot unplugged ones, which is exactly what spapr_drc_reset() does. Also clear all hot plug events that are currently queued since they're no longer relevant. Note that SLOF cannot currently populate hot plugged PCI bridges or PHBs at CAS. Until this limitation is lifted, SLOF will reset the machine when this scenario occurs : this will allow the FDT to be fully processed when SLOF is started again (ie. the same effect as the CAS reboot that would occur anyway without this patch). Signed-off-by: Greg Kurz Message-Id: <158257222352.4102917.8984214333937947307.stgit@bahia.lan> Signed-off-by: David Gibson --- hw/ppc/spapr_events.c | 13 +++++++++++++ hw/ppc/spapr_hcall.c | 11 +++++------ include/hw/ppc/spapr.h | 1 + 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 8b32b7eea5..2afd1844e4 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -983,6 +983,19 @@ void spapr_clear_pending_events(SpaprMachineState *spapr) } } +void spapr_clear_pending_hotplug_events(SpaprMachineState *spapr) +{ + SpaprEventLogEntry *entry = NULL, *next_entry; + + QTAILQ_FOREACH_SAFE(entry, &spapr->pending_events, next, next_entry) { + if (spapr_event_log_entry_type(entry) == RTAS_LOG_TYPE_HOTPLUG) { + QTAILQ_REMOVE(&spapr->pending_events, entry, next); + g_free(entry->extended_log); + g_free(entry); + } + } +} + void spapr_events_init(SpaprMachineState *spapr) { int epow_irq = SPAPR_IRQ_EPOW; diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 934eb12d27..c2b3286625 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -1640,7 +1640,7 @@ static uint32_t cas_check_pvr(SpaprMachineState *spapr, PowerPCCPU *cpu, return best_compat; } -static bool spapr_transient_dev_before_cas(void) +static void spapr_handle_transient_dev_before_cas(SpaprMachineState *spapr) { Object *drc_container; ObjectProperty *prop; @@ -1658,10 +1658,11 @@ static bool spapr_transient_dev_before_cas(void) prop->name, NULL)); if (spapr_drc_transient(drc)) { - return true; + spapr_drc_reset(drc); } } - return false; + + spapr_clear_pending_hotplug_events(spapr); } static target_ulong h_client_architecture_support(PowerPCCPU *cpu, @@ -1834,9 +1835,7 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu, spapr_irq_update_active_intc(spapr); - if (spapr_transient_dev_before_cas()) { - spapr->cas_reboot = true; - } + spapr_handle_transient_dev_before_cas(spapr); if (!spapr->cas_reboot) { void *fdt; diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 09110961a5..a4216935a1 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -824,6 +824,7 @@ int spapr_hpt_shift_for_ramsize(uint64_t ramsize); void spapr_reallocate_hpt(SpaprMachineState *spapr, int shift, Error **errp); void spapr_clear_pending_events(SpaprMachineState *spapr); +void spapr_clear_pending_hotplug_events(SpaprMachineState *spapr); int spapr_max_server_number(SpaprMachineState *spapr); void spapr_store_hpte(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte0, uint64_t pte1); From patchwork Tue Mar 17 10:03:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442385 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A2838913 for ; Tue, 17 Mar 2020 10:05:59 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 794B1205ED for ; Tue, 17 Mar 2020 10:05:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="k5dWZuU5" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 794B1205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55522 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96k-0002oK-KJ for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:05:58 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44881) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95X-0000kD-6e for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95V-0001BZ-Gy for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:43 -0400 Received: from ozlabs.org ([203.11.71.1]:60245) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95U-0000Qk-VC; Tue, 17 Mar 2020 06:04:41 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKv4q2Kz9sRf; Tue, 17 Mar 2020 21:04:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439475; bh=uz03V/ru9X630/rRDbbXvWwKAd0CRMRYWvPqvXbXi8o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k5dWZuU5jjvwnvN2Tbe2yr+UY6YRmWlkzyMAHmg5kCteGxfq+OOoZcrzOEfxfmMPW 8r6+9ncCqrIHz4219ioGUh+5uUy6sOZwuTfxgyJV5juN/fGfEDsCHrSIEL/BGR4+ZO i2d2y0xYV0fVMVJRx3JQoWocYl/62g75LHLaJi4Q= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 03/45] ppc: Officially deprecate the CPU "compat" property Date: Tue, 17 Mar 2020 21:03:41 +1100 Message-Id: <20200317100423.622643-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Greg Kurz Server class POWER CPUs have a "compat" property, which was obsoleted by commit 7843c0d60d and replaced by a "max-cpu-compat" property on the pseries machine type. A hack was introduced so that passing "compat" to -cpu would still produce the desired effect, for the sake of backward compatibility : it strips the "compat" option from the CPU properties and applies internally it to the pseries machine. The accessors of the "compat" property were updated to do nothing but warn the user about the deprecated status when doing something like: $ qemu-system-ppc64 -global POWER9-family-powerpc64-cpu.compat=power9 qemu-system-ppc64: warning: CPU 'compat' property is deprecated and has no effect; use max-cpu-compat machine property instead This was merged during the QEMU 2.10 timeframe, a few weeks before we formalized our deprecation process. As a consequence, the "compat" property fell through the cracks and was never listed in the officialy deprecated features. We are now eight QEMU versions later, it is largely time to mention it in qemu-deprecated.texi. Also, since -global XXX-powerpc64-cpu.compat= has been emitting warnings since QEMU 2.10 and the usual way of setting CPU properties is with -cpu, completely remove the "compat" property. Keep the hack so that -cpu XXX,compat= stays functional some more time, as required by our deprecation process. The now empty powerpc_servercpu_properties[] list which was introduced for "compat" and never had any other use is removed on the way. We can re-add it in the future if the need for a server class POWER CPU specific property arises again. Signed-off-by: Greg Kurz Message-Id: <158274357799.140275.12263135811731647490.stgit@bahia.lan> [dwg: Convert from .texi to .rst to match upstream change] Signed-off-by: David Gibson --- docs/system/deprecated.rst | 7 ++++++ target/ppc/translate_init.inc.c | 44 ++------------------------------- 2 files changed, 9 insertions(+), 42 deletions(-) diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst index 0838338d8f..412b1b166d 100644 --- a/docs/system/deprecated.rst +++ b/docs/system/deprecated.rst @@ -289,6 +289,13 @@ The RISC-V no MMU cpus have been depcreated. The two CPUs: ``rv32imacu-nommu`` a ``rv64imacu-nommu`` should no longer be used. Instead the MMU status can be specified via the CPU ``mmu`` option when using the ``rv32`` or ``rv64`` CPUs. +``compat`` property of server class POWER CPUs (since 5.0) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +The ``compat`` property used to set backwards compatibility modes for +the processor has been deprecated. The ``max-cpu-compat`` property of +the ``pseries`` machine type should be used instead. + System emulator devices ----------------------- diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c index 53995f62ea..2f7125c51f 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -8492,44 +8492,6 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data) pcc->l1_icache_size = 0x10000; } -/* - * The CPU used to have a "compat" property which set the - * compatibility mode PVR. However, this was conceptually broken - it - * only makes sense on the pseries machine type (otherwise the guest - * owns the PCR and can control the compatibility mode itself). It's - * been replaced with the 'max-cpu-compat' property on the pseries - * machine type. For backwards compatibility, pseries specially - * parses the -cpu parameter and converts old compat= parameters into - * the appropriate machine parameters. This stub implementation of - * the parameter catches any uses on explicitly created CPUs. - */ -static void getset_compat_deprecated(Object *obj, Visitor *v, const char *name, - void *opaque, Error **errp) -{ - QNull *null = NULL; - - if (!qtest_enabled()) { - warn_report("CPU 'compat' property is deprecated and has no effect; " - "use max-cpu-compat machine property instead"); - } - visit_type_null(v, name, &null, NULL); - qobject_unref(null); -} - -static const PropertyInfo ppc_compat_deprecated_propinfo = { - .name = "str", - .description = "compatibility mode (deprecated)", - .get = getset_compat_deprecated, - .set = getset_compat_deprecated, -}; -static Property powerpc_servercpu_properties[] = { - { - .name = "compat", - .info = &ppc_compat_deprecated_propinfo, - }, - DEFINE_PROP_END_OF_LIST(), -}; - static void init_proc_POWER7(CPUPPCState *env) { /* Common Registers */ @@ -8611,7 +8573,6 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data) dc->fw_name = "PowerPC,POWER7"; dc->desc = "POWER7"; - device_class_set_props(dc, powerpc_servercpu_properties); pcc->pvr_match = ppc_pvr_match_power7; pcc->pcr_mask = PCR_VEC_DIS | PCR_VSX_DIS | PCR_COMPAT_2_05; pcc->pcr_supported = PCR_COMPAT_2_06 | PCR_COMPAT_2_05; @@ -8776,7 +8737,6 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data) dc->fw_name = "PowerPC,POWER8"; dc->desc = "POWER8"; - device_class_set_props(dc, powerpc_servercpu_properties); pcc->pvr_match = ppc_pvr_match_power8; pcc->pcr_mask = PCR_TM_DIS | PCR_COMPAT_2_06 | PCR_COMPAT_2_05; pcc->pcr_supported = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05; @@ -8988,7 +8948,6 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data) dc->fw_name = "PowerPC,POWER9"; dc->desc = "POWER9"; - device_class_set_props(dc, powerpc_servercpu_properties); pcc->pvr_match = ppc_pvr_match_power9; pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07; pcc->pcr_supported = PCR_COMPAT_3_00 | PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | @@ -9198,7 +9157,6 @@ POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data) dc->fw_name = "PowerPC,POWER10"; dc->desc = "POWER10"; - device_class_set_props(dc, powerpc_servercpu_properties); pcc->pvr_match = ppc_pvr_match_power10; pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07 | PCR_COMPAT_3_00; @@ -10486,6 +10444,8 @@ static void ppc_cpu_parse_featurestr(const char *type, char *features, *s = '\0'; for (i = 0; inpieces[i]; i++) { if (g_str_has_prefix(inpieces[i], "compat=")) { + warn_report_once("CPU 'compat' property is deprecated; " + "use max-cpu-compat machine property instead"); compat_str = inpieces[i]; continue; } From patchwork Tue Mar 17 10:03:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442383 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 00114913 for ; Tue, 17 Mar 2020 10:05:56 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 91129205ED for ; Tue, 17 Mar 2020 10:05:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="DrDPkuLe" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 91129205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55520 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96h-0002h1-E8 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:05:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44873) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95X-0000kA-DI for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95V-0001E2-P3 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:42 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:35049 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95U-0000RB-Vi; Tue, 17 Mar 2020 06:04:41 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKv5cQJz9sSG; Tue, 17 Mar 2020 21:04:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439475; bh=pEA9lcDWk0y3tVrpwso9nTEbD4w1S4UtinfkCQ45i5U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DrDPkuLewANYCEG0/CxivTchXwTVFlaWBnmtGerF5rDKONDEW1MKHYpyDQgVSch75 ED6woSnELS81jYmT6049f008ysHHMUF7ewu54QDO1dY3JPme9mSzFhWVoSHrDhOr+1 99xg/0re9158uvRPcvSXK9ZmnCQK6gfocv0STqXE= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 04/45] spapr: Fix Coverity warning while validating nvdimm options Date: Tue, 17 Mar 2020 21:03:42 +1100 Message-Id: <20200317100423.622643-5-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, Shivaprasad G Bhat , aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Shivaprasad G Bhat Fixes Coverity issue, CID 1419883: Error handling issues (CHECKED_RETURN) Calling "qemu_uuid_parse" without checking return value nvdimm_set_uuid() already verifies if the user provided uuid is valid or not. So, need to check for the validity during pre-plug validation again. As this a false positive in this case, assert if not valid to be safe. Also, error_abort if QOM accessor encounters error while fetching the uuid property. Reported-by: Coverity (CID 1419883) Signed-off-by: Shivaprasad G Bhat Message-Id: <158281096564.89540.4507375445765515529.stgit@lep8c.aus.stglabs.ibm.com> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr_nvdimm.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/hw/ppc/spapr_nvdimm.c b/hw/ppc/spapr_nvdimm.c index 74eeb8bb74..25be8082d7 100644 --- a/hw/ppc/spapr_nvdimm.c +++ b/hw/ppc/spapr_nvdimm.c @@ -35,6 +35,7 @@ void spapr_nvdimm_validate_opts(NVDIMMDevice *nvdimm, uint64_t size, { char *uuidstr = NULL; QemuUUID uuid; + int ret; if (size % SPAPR_MINIMUM_SCM_BLOCK_SIZE) { error_setg(errp, "NVDIMM memory size excluding the label area" @@ -43,8 +44,10 @@ void spapr_nvdimm_validate_opts(NVDIMMDevice *nvdimm, uint64_t size, return; } - uuidstr = object_property_get_str(OBJECT(nvdimm), NVDIMM_UUID_PROP, NULL); - qemu_uuid_parse(uuidstr, &uuid); + uuidstr = object_property_get_str(OBJECT(nvdimm), NVDIMM_UUID_PROP, + &error_abort); + ret = qemu_uuid_parse(uuidstr, &uuid); + g_assert(!ret); g_free(uuidstr); if (qemu_uuid_is_null(&uuid)) { From patchwork Tue Mar 17 10:03:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442399 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 97FCA1392 for ; Tue, 17 Mar 2020 10:09:35 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6DE17205ED for ; Tue, 17 Mar 2020 10:09:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="IUJU4yFM" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6DE17205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55578 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9AE-0001sc-Id for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:09:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45031) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95b-0000mP-Fr for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95a-0001pz-8l for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:47 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:58461 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95Z-0001Fl-SK; Tue, 17 Mar 2020 06:04:46 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKv67Xyz9sSL; Tue, 17 Mar 2020 21:04:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439475; bh=7wZ3mloQ1D8Wy0r2A2GHMcqEh/j6Iul/yYJo14bNXbY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IUJU4yFMtCr21Q9CRZ6qJEeHLAyGD8spXcxsUQK2hb63M0cjHaa+xhfjUgRncGq/W +cMYf0z/gSRqNYNYkrz//2o2ARJ236/AnOFuIREzp5Tkue4U4280X9fAq14lphNa9Y 0INYrJDWR0E9N4kws3Qj7E/85jRjemo0mdXAwb/0= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 05/45] hw/ppc/pnv: Fix typo in comment Date: Tue, 17 Mar 2020 21:03:43 +1100 Message-Id: <20200317100423.622643-6-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daudé Signed-off-by: Philippe Mathieu-Daudé Message-Id: <20200228123303.14540-1-philmd@redhat.com> Reviewed-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv_lpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c index f150deca34..b5ffa48dac 100644 --- a/hw/ppc/pnv_lpc.c +++ b/hw/ppc/pnv_lpc.c @@ -829,7 +829,7 @@ ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **errp) bool hostboot_mode = !!pnv->fw_load_addr; /* let isa_bus_new() create its own bridge on SysBus otherwise - * devices speficied on the command line won't find the bus and + * devices specified on the command line won't find the bus and * will fail to create. */ isa_bus = isa_bus_new(NULL, &lpc->isa_mem, &lpc->isa_io, &local_err); From patchwork Tue Mar 17 10:03:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442389 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 25000913 for ; Tue, 17 Mar 2020 10:06:35 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id EC3D6205ED for ; Tue, 17 Mar 2020 10:06:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="BrE2U5+Q" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EC3D6205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55526 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE97K-0003hm-3R for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:06:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45062) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95c-0000oA-9u for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95a-0001qj-Bh for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:48 -0400 Received: from ozlabs.org ([203.11.71.1]:38101) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95Z-0001G2-Q7; Tue, 17 Mar 2020 06:04:46 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKv6Vs5z9sSM; Tue, 17 Mar 2020 21:04:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439475; bh=UOHF20krMv8ludcowjauA+f5cObH+ONZIZJKweMcMpU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BrE2U5+QiThVGTKJDh588HDXjSpLix7anN3Y50zi/TRMMkFzKpQPXkKSONwzt1jeF 8Q2wWOcVRgTsADzRl7/3xzjyuoQ2Aje6mi3XfuvRXEO63+xanRf0CoB/1di7Guc3dw +323DBbaPS/5Z8l/875/hLuxzwF4+nWP06d4JGz4= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 06/45] ppc: Remove stub support for 32-bit hypervisor mode Date: Tue, 17 Mar 2020 21:03:44 +1100 Message-Id: <20200317100423.622643-7-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, Fabiano Rosas , aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" a4f30719a8cd, way back in 2007 noted that "PowerPC hypervisor mode is not fundamentally available only for PowerPC 64" and added a 32-bit version of the MSR[HV] bit. But nothing was ever really done with that; there is no meaningful support for 32-bit hypervisor mode 13 years later. Let's stop pretending and just remove the stubs. Signed-off-by: David Gibson Reviewed-by: Fabiano Rosas Reviewed-by: Greg Kurz Reviewed-by: Philippe Mathieu-Daudé --- target/ppc/cpu.h | 21 +++++++-------------- target/ppc/translate_init.inc.c | 6 +++--- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index b283042515..8077fdb068 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -24,8 +24,6 @@ #include "exec/cpu-defs.h" #include "cpu-qom.h" -/* #define PPC_EMULATE_32BITS_HYPV */ - #define TCG_GUEST_DEFAULT_MO 0 #define TARGET_PAGE_BITS_64K 16 @@ -300,13 +298,12 @@ typedef struct ppc_v3_pate_t { #define MSR_SF 63 /* Sixty-four-bit mode hflags */ #define MSR_TAG 62 /* Tag-active mode (POWERx ?) */ #define MSR_ISF 61 /* Sixty-four-bit interrupt mode on 630 */ -#define MSR_SHV 60 /* hypervisor state hflags */ +#define MSR_HV 60 /* hypervisor state hflags */ #define MSR_TS0 34 /* Transactional state, 2 bits (Book3s) */ #define MSR_TS1 33 #define MSR_TM 32 /* Transactional Memory Available (Book3s) */ #define MSR_CM 31 /* Computation mode for BookE hflags */ #define MSR_ICM 30 /* Interrupt computation mode for BookE */ -#define MSR_THV 29 /* hypervisor state for 32 bits PowerPC hflags */ #define MSR_GS 28 /* guest state for BookE */ #define MSR_UCLE 26 /* User-mode cache lock enable for BookE */ #define MSR_VR 25 /* altivec available x hflags */ @@ -401,10 +398,13 @@ typedef struct ppc_v3_pate_t { #define msr_sf ((env->msr >> MSR_SF) & 1) #define msr_isf ((env->msr >> MSR_ISF) & 1) -#define msr_shv ((env->msr >> MSR_SHV) & 1) +#if defined(TARGET_PPC64) +#define msr_hv ((env->msr >> MSR_HV) & 1) +#else +#define msr_hv (0) +#endif #define msr_cm ((env->msr >> MSR_CM) & 1) #define msr_icm ((env->msr >> MSR_ICM) & 1) -#define msr_thv ((env->msr >> MSR_THV) & 1) #define msr_gs ((env->msr >> MSR_GS) & 1) #define msr_ucle ((env->msr >> MSR_UCLE) & 1) #define msr_vr ((env->msr >> MSR_VR) & 1) @@ -449,16 +449,9 @@ typedef struct ppc_v3_pate_t { /* Hypervisor bit is more specific */ #if defined(TARGET_PPC64) -#define MSR_HVB (1ULL << MSR_SHV) -#define msr_hv msr_shv -#else -#if defined(PPC_EMULATE_32BITS_HYPV) -#define MSR_HVB (1ULL << MSR_THV) -#define msr_hv msr_thv +#define MSR_HVB (1ULL << MSR_HV) #else #define MSR_HVB (0ULL) -#define msr_hv (0) -#endif #endif /* DSISR */ diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c index 2f7125c51f..df3401cf06 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -8764,7 +8764,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data) PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | PPC2_TM | PPC2_PM_ISA206; pcc->msr_mask = (1ull << MSR_SF) | - (1ull << MSR_SHV) | + (1ull << MSR_HV) | (1ull << MSR_TM) | (1ull << MSR_VR) | (1ull << MSR_VSX) | @@ -8976,7 +8976,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data) PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL; pcc->msr_mask = (1ull << MSR_SF) | - (1ull << MSR_SHV) | + (1ull << MSR_HV) | (1ull << MSR_TM) | (1ull << MSR_VR) | (1ull << MSR_VSX) | @@ -9186,7 +9186,7 @@ POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data) PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL; pcc->msr_mask = (1ull << MSR_SF) | - (1ull << MSR_SHV) | + (1ull << MSR_HV) | (1ull << MSR_TM) | (1ull << MSR_VR) | (1ull << MSR_VSX) | From patchwork Tue Mar 17 10:03:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442387 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5EDF0913 for ; Tue, 17 Mar 2020 10:06:08 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 363ED205ED for ; Tue, 17 Mar 2020 10:06:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="jAqguzUo" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 363ED205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55524 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96t-0002xa-AV for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:06:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45067) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95c-0000oJ-Bf for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95a-0001s3-EY for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:48 -0400 Received: from ozlabs.org ([203.11.71.1]:45151) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95a-0001Go-1L; Tue, 17 Mar 2020 06:04:46 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw0bH8z9sSY; Tue, 17 Mar 2020 21:04:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=+B1mCWC4t6yy2Tx65wsvNsRLsoZ3PfvGpSRZfwW2BjM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jAqguzUoPqeepq1qwHglZLEBGJ3/YADqABhhxD6vs11ds2jTCHkiIwW4TM32v4wfG CXEa/2rRxQRakgA7ks6s9C0fMpZaTcTzqAVNM6SxI2DH0j9GrgxmW8Hx++XA3Y57PU nZPFNjz5AfuV3PenC5ET31X7wE52ykX6wRhXesXM= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 07/45] ppc: Remove stub of PPC970 HID4 implementation Date: Tue, 17 Mar 2020 21:03:45 +1100 Message-Id: <20200317100423.622643-8-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" The PowerPC 970 CPU was a cut-down POWER4, which had hypervisor capability. However, it can be (and often was) strapped into "Apple mode", where the hypervisor capabilities were disabled (essentially putting it always in hypervisor mode). That's actually the only mode of the 970 we support in qemu, and we're unlikely to change that any time soon. However, we do have a partial implementation of the 970's HID4 register which affects things only relevant for hypervisor mode. That stub is also really ugly, since it attempts to duplicate the effects of HID4 by re-encoding it into the LPCR register used in newer CPUs, but in a really confusing way. Just get rid of it. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz --- target/ppc/mmu-hash64.c | 29 +---------------------------- target/ppc/translate_init.inc.c | 20 ++++++++------------ 2 files changed, 9 insertions(+), 40 deletions(-) diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index da8966ccf5..3e0be4d55f 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -1091,33 +1091,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) /* Filter out bits */ switch (env->mmu_model) { - case POWERPC_MMU_64B: /* 970 */ - if (val & 0x40) { - lpcr |= LPCR_LPES0; - } - if (val & 0x8000000000000000ull) { - lpcr |= LPCR_LPES1; - } - if (val & 0x20) { - lpcr |= (0x4ull << LPCR_RMLS_SHIFT); - } - if (val & 0x4000000000000000ull) { - lpcr |= (0x2ull << LPCR_RMLS_SHIFT); - } - if (val & 0x2000000000000000ull) { - lpcr |= (0x1ull << LPCR_RMLS_SHIFT); - } - env->spr[SPR_RMOR] = ((lpcr >> 41) & 0xffffull) << 26; - - /* - * XXX We could also write LPID from HID4 here - * but since we don't tag any translation on it - * it doesn't actually matter - * - * XXX For proper emulation of 970 we also need - * to dig HRMOR out of HID5 - */ - break; case POWERPC_MMU_2_03: /* P5p */ lpcr = val & (LPCR_RMLS | LPCR_ILE | LPCR_LPES0 | LPCR_LPES1 | @@ -1154,7 +1127,7 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) } break; default: - ; + g_assert_not_reached(); } env->spr[SPR_LPCR] = lpcr; ppc_hash64_update_rmls(cpu); diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c index df3401cf06..aecad96db3 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -7895,25 +7895,21 @@ static void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn) { gen_helper_store_lpcr(cpu_env, cpu_gpr[gprn]); } - -static void spr_write_970_hid4(DisasContext *ctx, int sprn, int gprn) -{ -#if defined(TARGET_PPC64) - spr_write_generic(ctx, sprn, gprn); - gen_helper_store_lpcr(cpu_env, cpu_gpr[gprn]); -#endif -} - #endif /* !defined(CONFIG_USER_ONLY) */ static void gen_spr_970_lpar(CPUPPCState *env) { #if !defined(CONFIG_USER_ONLY) - /* Logical partitionning */ - /* PPC970: HID4 is effectively the LPCR */ + /* + * PPC970: HID4 covers things later controlled by the LPCR and + * RMOR in later CPUs, but with a different encoding. We only + * support the 970 in "Apple mode" which has all hypervisor + * facilities disabled by strapping, so we can basically just + * ignore it + */ spr_register(env, SPR_970_HID4, "HID4", SPR_NOACCESS, SPR_NOACCESS, - &spr_read_generic, &spr_write_970_hid4, + &spr_read_generic, &spr_write_generic, 0x00000000); #endif } From patchwork Tue Mar 17 10:03:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442415 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 90533913 for ; Tue, 17 Mar 2020 10:13:17 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 67C5F20719 for ; Tue, 17 Mar 2020 10:13:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="cMwT57Pb" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 67C5F20719 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55652 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Do-0000hL-Iy for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:13:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45063) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95c-0000oF-Ao for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95a-0001rg-DT for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:48 -0400 Received: from ozlabs.org ([203.11.71.1]:32925) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95a-0001Gh-0o; Tue, 17 Mar 2020 06:04:46 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKv73BVz9sSW; Tue, 17 Mar 2020 21:04:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=105uZzjK8EWkPkmRVAazKF6ikIMHnp8INylkLfXtmRo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cMwT57PbyoeLnTj3qnO/vavfWVTsvaXYv3V8KumOS0Wf1JQ9br2yp3EATOlAzRi6t EVAgliIHZ9pqY/o8RcQasy1ihm6U2H9GfQDmHFunU2Xn1XsxT6LpkTbRmHuzMl3FTL +fUi9DXdjlo1g54l/+j4wYCEp5zJ392uP74NNvKA= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 08/45] target/ppc: Correct handling of real mode accesses with vhyp on hash MMU Date: Tue, 17 Mar 2020 21:03:46 +1100 Message-Id: <20200317100423.622643-9-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" On ppc we have the concept of virtual hypervisor ("vhyp") mode, where we only model the non-hypervisor-privileged parts of the cpu. Essentially we model the hypervisor's behaviour from the point of view of a guest OS, but we don't model the hypervisor's execution. In particular, in this mode, qemu's notion of target physical address is a guest physical address from the vcpu's point of view. So accesses in guest real mode don't require translation. If we were modelling the hypervisor mode, we'd need to translate the guest physical address into a host physical address. Currently, we handle this sloppily: we rely on setting up the virtual LPCR and RMOR registers so that GPAs are simply HPAs plus an offset, which we set to zero. This is already conceptually dubious, since the LPCR and RMOR registers don't exist in the non-hypervisor portion of the CPU. It gets worse with POWER9, where RMOR and LPCR[VPM0] no longer exist at all. Clean this up by explicitly handling the vhyp case. While we're there, remove some unnecessary nesting of if statements that made the logic to select the correct real mode behaviour a bit less clear than it could be. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz --- target/ppc/mmu-hash64.c | 60 ++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index 3e0be4d55f..392f90e0ae 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -789,27 +789,30 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, */ raddr = eaddr & 0x0FFFFFFFFFFFFFFFULL; - /* In HV mode, add HRMOR if top EA bit is clear */ - if (msr_hv || !env->has_hv_mode) { + if (cpu->vhyp) { + /* + * In virtual hypervisor mode, there's nothing to do: + * EA == GPA == qemu guest address + */ + } else if (msr_hv || !env->has_hv_mode) { + /* In HV mode, add HRMOR if top EA bit is clear */ if (!(eaddr >> 63)) { raddr |= env->spr[SPR_HRMOR]; } - } else { - /* Otherwise, check VPM for RMA vs VRMA */ - if (env->spr[SPR_LPCR] & LPCR_VPM0) { - slb = &env->vrma_slb; - if (slb->sps) { - goto skip_slb_search; - } - /* Not much else to do here */ + } else if (env->spr[SPR_LPCR] & LPCR_VPM0) { + /* Emulated VRMA mode */ + slb = &env->vrma_slb; + if (!slb->sps) { + /* Invalid VRMA setup, machine check */ cs->exception_index = POWERPC_EXCP_MCHECK; env->error_code = 0; return 1; - } else if (raddr < env->rmls) { - /* RMA. Check bounds in RMLS */ - raddr |= env->spr[SPR_RMOR]; - } else { - /* The access failed, generate the approriate interrupt */ + } + + goto skip_slb_search; + } else { + /* Emulated old-style RMO mode, bounds check against RMLS */ + if (raddr >= env->rmls) { if (rwx == 2) { ppc_hash64_set_isi(cs, SRR1_PROTFAULT); } else { @@ -821,6 +824,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, } return 1; } + + raddr |= env->spr[SPR_RMOR]; } tlb_set_page(cs, eaddr & TARGET_PAGE_MASK, raddr & TARGET_PAGE_MASK, PAGE_READ | PAGE_WRITE | PAGE_EXEC, mmu_idx, @@ -953,22 +958,27 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) /* In real mode the top 4 effective address bits are ignored */ raddr = addr & 0x0FFFFFFFFFFFFFFFULL; - /* In HV mode, add HRMOR if top EA bit is clear */ - if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) { + if (cpu->vhyp) { + /* + * In virtual hypervisor mode, there's nothing to do: + * EA == GPA == qemu guest address + */ + return raddr; + } else if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) { + /* In HV mode, add HRMOR if top EA bit is clear */ return raddr | env->spr[SPR_HRMOR]; - } - - /* Otherwise, check VPM for RMA vs VRMA */ - if (env->spr[SPR_LPCR] & LPCR_VPM0) { + } else if (env->spr[SPR_LPCR] & LPCR_VPM0) { + /* Emulated VRMA mode */ slb = &env->vrma_slb; if (!slb->sps) { return -1; } - } else if (raddr < env->rmls) { - /* RMA. Check bounds in RMLS */ - return raddr | env->spr[SPR_RMOR]; } else { - return -1; + /* Emulated old-style RMO mode, bounds check against RMLS */ + if (raddr >= env->rmls) { + return -1; + } + return raddr | env->spr[SPR_RMOR]; } } else { slb = slb_lookup(cpu, addr); From patchwork Tue Mar 17 10:03:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442401 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 73253913 for ; Tue, 17 Mar 2020 10:09:38 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 498A5205ED for ; Tue, 17 Mar 2020 10:09:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="H7lSVszR" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 498A5205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55580 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9AH-00020N-CK for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:09:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45051) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95b-0000ng-VR for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95a-0001qM-94 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:47 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:42981 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95Z-0001Fw-R4; Tue, 17 Mar 2020 06:04:46 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw11Dcz9sSX; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=Z8m37V4lbrn1lOzpPF1CewIHsnj+ytGRNy9iMWzlxes=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=H7lSVszRv91OSQVLsbTLTSewksfan8JWbNzM7m5bbit2KB9DBDxa8St2qXyegDDcc yqBA+tMVfaVz36tyUczq9sMuPHxJVGtf9LF6XsXnNdI/9F977RXWC7jalZEcDxDwqU Kn5aCYOELZgEX/K1Bpz3dMgAdN0zyAy1L/hb8uH4= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 09/45] target/ppc: Introduce ppc_hash64_use_vrma() helper Date: Tue, 17 Mar 2020 21:03:47 +1100 Message-Id: <20200317100423.622643-10-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, Fabiano Rosas , aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" When running guests under a hypervisor, the hypervisor obviously needs to be protected from guest accesses even if those are in what the guest considers real mode (translation off). The POWER hardware provides two ways of doing that: The old way has guest real mode accesses simply offset and bounds checked into host addresses. It works, but requires that a significant chunk of the guest's memory - the RMA - be physically contiguous in the host, which is pretty inconvenient. The new way, known as VRMA, has guest real mode accesses translated in roughly the normal way but with some special parameters. In POWER7 and POWER8 the LPCR[VPM0] bit selected between the two modes, but in POWER9 only VRMA mode is supported and LPCR[VPM0] no longer exists. We handle that difference in behaviour in ppc_hash64_set_isi().. but not in other places that we blindly check LPCR[VPM0]. Correct those instances with a new helper to tell if we should be in VRMA mode. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Fabiano Rosas Reviewed-by: Greg Kurz Reviewed-by: Philippe Mathieu-Daudé --- target/ppc/mmu-hash64.c | 43 ++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index 392f90e0ae..e372c42add 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -668,6 +668,21 @@ unsigned ppc_hash64_hpte_page_shift_noslb(PowerPCCPU *cpu, return 0; } +static bool ppc_hash64_use_vrma(CPUPPCState *env) +{ + switch (env->mmu_model) { + case POWERPC_MMU_3_00: + /* + * ISAv3.0 (POWER9) always uses VRMA, the VPM0 field and RMOR + * register no longer exist + */ + return true; + + default: + return !!(env->spr[SPR_LPCR] & LPCR_VPM0); + } +} + static void ppc_hash64_set_isi(CPUState *cs, uint64_t error_code) { CPUPPCState *env = &POWERPC_CPU(cs)->env; @@ -676,15 +691,7 @@ static void ppc_hash64_set_isi(CPUState *cs, uint64_t error_code) if (msr_ir) { vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM1); } else { - switch (env->mmu_model) { - case POWERPC_MMU_3_00: - /* Field deprecated in ISAv3.00 - interrupts always go to hyperv */ - vpm = true; - break; - default: - vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM0); - break; - } + vpm = ppc_hash64_use_vrma(env); } if (vpm && !msr_hv) { cs->exception_index = POWERPC_EXCP_HISI; @@ -702,15 +709,7 @@ static void ppc_hash64_set_dsi(CPUState *cs, uint64_t dar, uint64_t dsisr) if (msr_dr) { vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM1); } else { - switch (env->mmu_model) { - case POWERPC_MMU_3_00: - /* Field deprecated in ISAv3.00 - interrupts always go to hyperv */ - vpm = true; - break; - default: - vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM0); - break; - } + vpm = ppc_hash64_use_vrma(env); } if (vpm && !msr_hv) { cs->exception_index = POWERPC_EXCP_HDSI; @@ -799,7 +798,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, if (!(eaddr >> 63)) { raddr |= env->spr[SPR_HRMOR]; } - } else if (env->spr[SPR_LPCR] & LPCR_VPM0) { + } else if (ppc_hash64_use_vrma(env)) { /* Emulated VRMA mode */ slb = &env->vrma_slb; if (!slb->sps) { @@ -967,7 +966,7 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) } else if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) { /* In HV mode, add HRMOR if top EA bit is clear */ return raddr | env->spr[SPR_HRMOR]; - } else if (env->spr[SPR_LPCR] & LPCR_VPM0) { + } else if (ppc_hash64_use_vrma(env)) { /* Emulated VRMA mode */ slb = &env->vrma_slb; if (!slb->sps) { @@ -1056,8 +1055,7 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu) slb->sps = NULL; /* Is VRMA enabled ? */ - lpcr = env->spr[SPR_LPCR]; - if (!(lpcr & LPCR_VPM0)) { + if (!ppc_hash64_use_vrma(env)) { return; } @@ -1065,6 +1063,7 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu) * Make one up. Mostly ignore the ESID which will not be needed * for translation */ + lpcr = env->spr[SPR_LPCR]; vsid = SLB_VSID_VRMA; vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT; vsid |= (vrmasd << 4) & (SLB_VSID_L | SLB_VSID_LP); From patchwork Tue Mar 17 10:03:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442407 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C2ED71392 for ; Tue, 17 Mar 2020 10:11:24 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5854620714 for ; Tue, 17 Mar 2020 10:11:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="WYwZqVnR" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5854620714 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55618 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Bz-0005OO-7U for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:11:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45007) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95a-0000lq-UM for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95Z-0001jB-Hg for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:46 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:54747 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95Z-0001GI-6D; Tue, 17 Mar 2020 06:04:45 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw1c4dz9sSZ; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=RZjMlsbNKA6+ViTuycxwZ7IU6OPn0vl7+MnQX6dTb5A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WYwZqVnRIl9qJBBVo+yIXb1F1PtrGwJDiksVSNUMfBB16Q2xIXN4pQsEG2CV6NUmS HJrwVBhy1YYKa3+y1BFuHE3A1L2zwel2pO1KIWeDb7aMZXMeJslSEOybMDpZu1gYPu n+gqjUUVKjNBRe3FZzoc7/hjOzfJAch/Rj5/UvD4= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 10/45] spapr, ppc: Remove VPM0/RMLS hacks for POWER9 Date: Tue, 17 Mar 2020 21:03:48 +1100 Message-Id: <20200317100423.622643-11-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" For the "pseries" machine, we use "virtual hypervisor" mode where we only model the CPU in non-hypervisor privileged mode. This means that we need guest physical addresses within the modelled cpu to be treated as absolute physical addresses. We used to do that by clearing LPCR[VPM0] and setting LPCR[RMLS] to a high limit so that the old offset based translation for guest mode applied, which does what we need. However, POWER9 has removed support for that translation mode, which meant we had some ugly hacks to keep it working. We now explicitly handle this sort of translation for virtual hypervisor mode, so the hacks aren't necessary. We don't need to set VPM0 and RMLS from the machine type code - they're now ignored in vhyp mode. On the cpu side we don't need to allow LPCR[RMLS] to be set on POWER9 in vhyp mode - that was only there to allow the hack on the machine side. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz --- hw/ppc/spapr_cpu_core.c | 10 +--------- target/ppc/mmu-hash64.c | 8 -------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index d09125d9af..36ed3a2b66 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -50,22 +50,14 @@ static void spapr_reset_vcpu(PowerPCCPU *cpu) * the settings below ensure proper operations with TCG in absence of * a real hypervisor. * - * Clearing VPM0 will also cause us to use RMOR in mmu-hash64.c for - * real mode accesses, which thankfully defaults to 0 and isn't - * accessible in guest mode. - * * Disable Power-saving mode Exit Cause exceptions for the CPU, so * we don't get spurious wakups before an RTAS start-cpu call. * For the same reason, set PSSCR_EC. */ - lpcr &= ~(LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm); + lpcr &= ~(LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm); lpcr |= LPCR_LPES0 | LPCR_LPES1; env->spr[SPR_PSSCR] |= PSSCR_EC; - /* Set RMLS to the max (ie, 16G) */ - lpcr &= ~LPCR_RMLS; - lpcr |= 1ull << LPCR_RMLS_SHIFT; - ppc_store_lpcr(cpu, lpcr); /* Set a full AMOR so guest can use the AMR as it sees fit */ diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index e372c42add..caf47ad6fc 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -1126,14 +1126,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC | LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE); - /* - * If we have a virtual hypervisor, we need to bring back RMLS. It - * doesn't exist on an actual P9 but that's all we know how to - * configure with softmmu at the moment - */ - if (cpu->vhyp) { - lpcr |= (val & LPCR_RMLS); - } break; default: g_assert_not_reached(); From patchwork Tue Mar 17 10:03:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442405 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2CCF31392 for ; Tue, 17 Mar 2020 10:09:52 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 03CCE205ED for ; Tue, 17 Mar 2020 10:09:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="h6Q95a4J" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 03CCE205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55584 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9AV-0002Yr-63 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:09:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45177) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95f-0000uO-Nf for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95a-0001qc-A8 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:51 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:40631 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95Z-0001IP-TT; Tue, 17 Mar 2020 06:04:46 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw23jcz9sSb; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=/vRF7LH21Z9YI4tvoah84Uft6k1d+ANzUl5tBCjdNnw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h6Q95a4Je9LUuJp9iOay4ysuBWPeVAU2CWyXakLuQIH/rRF9HZ16rxDjavbl1xq6V IU0L3MAiSeQlPYebb5fFQ0SqvS1OLtqUBfM78xIgTdi5Uvgu97w7G0gdIhD+Yov0gV MQ17CQfvIWHqrLRTr3OoIv2apD0YmDhJpURmktlU= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 11/45] target/ppc: Remove RMOR register from POWER9 & POWER10 Date: Tue, 17 Mar 2020 21:03:49 +1100 Message-Id: <20200317100423.622643-12-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Currently we create the Real Mode Offset Register (RMOR) on all Book3S cpus from POWER7 onwards. However the translation mode which the RMOR controls is no longer supported in POWER9, and so the register has been removed from the architecture. Remove it from our model on POWER9 and POWER10. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz --- target/ppc/translate_init.inc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c index aecad96db3..f7acd3d61d 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -8015,12 +8015,16 @@ static void gen_spr_book3s_ids(CPUPPCState *env) SPR_NOACCESS, SPR_NOACCESS, &spr_read_generic, &spr_write_generic, 0x00000000); - spr_register_hv(env, SPR_RMOR, "RMOR", + spr_register_hv(env, SPR_HRMOR, "HRMOR", SPR_NOACCESS, SPR_NOACCESS, SPR_NOACCESS, SPR_NOACCESS, &spr_read_generic, &spr_write_generic, 0x00000000); - spr_register_hv(env, SPR_HRMOR, "HRMOR", +} + +static void gen_spr_rmor(CPUPPCState *env) +{ + spr_register_hv(env, SPR_RMOR, "RMOR", SPR_NOACCESS, SPR_NOACCESS, SPR_NOACCESS, SPR_NOACCESS, &spr_read_generic, &spr_write_generic, @@ -8497,6 +8501,7 @@ static void init_proc_POWER7(CPUPPCState *env) /* POWER7 Specific Registers */ gen_spr_book3s_ids(env); + gen_spr_rmor(env); gen_spr_amr(env); gen_spr_book3s_purr(env); gen_spr_power5p_common(env); @@ -8637,6 +8642,7 @@ static void init_proc_POWER8(CPUPPCState *env) /* POWER8 Specific Registers */ gen_spr_book3s_ids(env); + gen_spr_rmor(env); gen_spr_amr(env); gen_spr_iamr(env); gen_spr_book3s_purr(env); From patchwork Tue Mar 17 10:03:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442397 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A200C913 for ; Tue, 17 Mar 2020 10:08:13 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 782C1205ED for ; Tue, 17 Mar 2020 10:08:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="XQ8bNHAq" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 782C1205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55556 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE98u-0007Zy-KW for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:08:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45115) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95d-0000rY-Sm for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95a-0001v5-Qu for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:49 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:50225 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95a-0001OD-DO; Tue, 17 Mar 2020 06:04:46 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw2lxSz9sSd; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=rCXbM8AVbzo+RnVQzq7g2QRWbSS4JjYPXn2A/b2616A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XQ8bNHAq/sYKOR5qSIRq0+rxguEO/nd6Jg+Crgrq14Q2sXNG4p8I/UGGKytTYnrUP Q2HCwyhS9M0nCAsKO3aV75dHy6mD3c710rLksorR68UI5UAOEFHUtECJCAyl4aY9JB AUG/dfhdFvTiZn1Ti1Pjfnt6DqJ4e1UApg9wGzoc= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 12/45] target/ppc: Use class fields to simplify LPCR masking Date: Tue, 17 Mar 2020 21:03:50 +1100 Message-Id: <20200317100423.622643-13-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" When we store the Logical Partitioning Control Register (LPCR) we have a big switch statement to work out which are valid bits for the cpu model we're emulating. As well as being ugly, this isn't really conceptually correct, since it is based on the mmu_model variable, whereas the LPCR isn't (only) about the MMU, so mmu_model is basically just acting as a proxy for the cpu model. Handle this in a simpler way, by adding a suitable lpcr_mask to the QOM class. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz Reviewed-by: Philippe Mathieu-Daudé --- target/ppc/cpu-qom.h | 1 + target/ppc/mmu-hash64.c | 36 ++------------------------------- target/ppc/translate_init.inc.c | 36 ++++++++++++++++++++++++++++----- 3 files changed, 34 insertions(+), 39 deletions(-) diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h index e499575dc8..15d6b54a7d 100644 --- a/target/ppc/cpu-qom.h +++ b/target/ppc/cpu-qom.h @@ -177,6 +177,7 @@ typedef struct PowerPCCPUClass { uint64_t insns_flags; uint64_t insns_flags2; uint64_t msr_mask; + uint64_t lpcr_mask; /* Available bits in the LPCR */ uint64_t lpcr_pm; /* Power-saving mode Exit Cause Enable bits */ powerpc_mmu_t mmu_model; powerpc_excp_t excp_model; diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index caf47ad6fc..0ef330a614 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -1095,42 +1095,10 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu) void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) { + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); CPUPPCState *env = &cpu->env; - uint64_t lpcr = 0; - /* Filter out bits */ - switch (env->mmu_model) { - case POWERPC_MMU_2_03: /* P5p */ - lpcr = val & (LPCR_RMLS | LPCR_ILE | - LPCR_LPES0 | LPCR_LPES1 | - LPCR_RMI | LPCR_HDICE); - break; - case POWERPC_MMU_2_06: /* P7 */ - lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD | - LPCR_VRMASD | LPCR_RMLS | LPCR_ILE | - LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 | - LPCR_MER | LPCR_TC | - LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE); - break; - case POWERPC_MMU_2_07: /* P8 */ - lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV | - LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE | - LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 | - LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 | - LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE); - break; - case POWERPC_MMU_3_00: /* P9 */ - lpcr = val & (LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD | - (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL | - LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD | - (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE | - LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC | - LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE); - break; - default: - g_assert_not_reached(); - } - env->spr[SPR_LPCR] = lpcr; + env->spr[SPR_LPCR] = val & pcc->lpcr_mask; ppc_hash64_update_rmls(cpu); ppc_hash64_update_vrma(cpu); } diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c index f7acd3d61d..0ae145e18d 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -8476,6 +8476,8 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data) (1ull << MSR_DR) | (1ull << MSR_PMM) | (1ull << MSR_RI); + pcc->lpcr_mask = LPCR_RMLS | LPCR_ILE | LPCR_LPES0 | LPCR_LPES1 | + LPCR_RMI | LPCR_HDICE; pcc->mmu_model = POWERPC_MMU_2_03; #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault; @@ -8614,6 +8616,12 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data) (1ull << MSR_PMM) | (1ull << MSR_RI) | (1ull << MSR_LE); + pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD | + LPCR_VRMASD | LPCR_RMLS | LPCR_ILE | + LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 | + LPCR_MER | LPCR_TC | + LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE; + pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2; pcc->mmu_model = POWERPC_MMU_2_06; #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault; @@ -8630,7 +8638,6 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data) pcc->l1_dcache_size = 0x8000; pcc->l1_icache_size = 0x8000; pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr; - pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2; } static void init_proc_POWER8(CPUPPCState *env) @@ -8785,6 +8792,13 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data) (1ull << MSR_TS0) | (1ull << MSR_TS1) | (1ull << MSR_LE); + pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV | + LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE | + LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 | + LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 | + LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE; + pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 | + LPCR_P8_PECE3 | LPCR_P8_PECE4; pcc->mmu_model = POWERPC_MMU_2_07; #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault; @@ -8802,8 +8816,6 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data) pcc->l1_dcache_size = 0x8000; pcc->l1_icache_size = 0x8000; pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr; - pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 | - LPCR_P8_PECE3 | LPCR_P8_PECE4; } #ifdef CONFIG_SOFTMMU @@ -8995,6 +9007,14 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data) (1ull << MSR_PMM) | (1ull << MSR_RI) | (1ull << MSR_LE); + pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD | + (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL | + LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD | + (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE | + LPCR_DEE | LPCR_OEE)) + | LPCR_MER | LPCR_GTSE | LPCR_TC | + LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE; + pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE; pcc->mmu_model = POWERPC_MMU_3_00; #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault = ppc64_v3_handle_mmu_fault; @@ -9014,7 +9034,6 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data) pcc->l1_dcache_size = 0x8000; pcc->l1_icache_size = 0x8000; pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr; - pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE; } #ifdef CONFIG_SOFTMMU @@ -9205,6 +9224,14 @@ POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data) (1ull << MSR_PMM) | (1ull << MSR_RI) | (1ull << MSR_LE); + pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD | + (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL | + LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD | + (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE | + LPCR_DEE | LPCR_OEE)) + | LPCR_MER | LPCR_GTSE | LPCR_TC | + LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE; + pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE; pcc->mmu_model = POWERPC_MMU_3_00; #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault = ppc64_v3_handle_mmu_fault; @@ -9223,7 +9250,6 @@ POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data) pcc->l1_dcache_size = 0x8000; pcc->l1_icache_size = 0x8000; pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr; - pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE; } #if !defined(CONFIG_USER_ONLY) From patchwork Tue Mar 17 10:03:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442409 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D7663913 for ; Tue, 17 Mar 2020 10:11:39 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AE41D20714 for ; Tue, 17 Mar 2020 10:11:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="I44Ecup9" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AE41D20714 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55622 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9CE-0005xI-QN for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:11:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45215) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95g-0000wZ-Qm for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95e-0002Q6-Q0 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:52 -0400 Received: from ozlabs.org ([203.11.71.1]:52181) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95e-0001nm-Di; Tue, 17 Mar 2020 06:04:50 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw3BL0z9sSj; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=yA5zXTiRWRVp48qt3pq/p1pz/XgyQFx8TgbqmRi8ySQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=I44Ecup9eyI1WQ0goKS+6IqVXzcR2OOfmZLK+o/s9zl7/nSbGAiTsRJGuXakPh74t sLqWnC1aHioi3rkP2G9BMh9ajHNnXomPnp9dcp6yp2u6eszhxoYz4TvtErwKV1GH5M o0vwI5Ekhp2PFXKRvob2J7X87r1CO/6LMoLv7rpQ= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 13/45] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS] Date: Tue, 17 Mar 2020 21:03:51 +1100 Message-Id: <20200317100423.622643-14-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Currently we use a big switch statement in ppc_hash64_update_rmls() to work out what the right RMA limit is based on the LPCR[RMLS] field. There's no formula for this - it's just an arbitrary mapping defined by the existing CPU implementations - but we can make it a bit more readable by using a lookup table rather than a switch. In addition we can use the MiB/GiB symbols to make it a bit clearer. While there we add a bit of clarity and rationale to the comment about what happens if the LPCR[RMLS] doesn't contain a valid value. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz Reviewed-by: Philippe Mathieu-Daudé --- target/ppc/mmu-hash64.c | 63 ++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index 0ef330a614..934989e6d9 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -18,6 +18,7 @@ * License along with this library; if not, see . */ #include "qemu/osdep.h" +#include "qemu/units.h" #include "cpu.h" #include "exec/exec-all.h" #include "exec/helper-proto.h" @@ -757,6 +758,31 @@ static void ppc_hash64_set_c(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte1) stb_phys(CPU(cpu)->as, base + offset, (pte1 & 0xff) | 0x80); } +static target_ulong rmls_limit(PowerPCCPU *cpu) +{ + CPUPPCState *env = &cpu->env; + /* + * This is the full 4 bits encoding of POWER8. Previous + * CPUs only support a subset of these but the filtering + * is done when writing LPCR. + * + * Unsupported values mean the OS has shot itself in the + * foot. Return a 0-sized RMA in this case, which we expect + * to trigger an immediate DSI or ISI + */ + static const target_ulong rma_sizes[16] = { + [1] = 16 * GiB, + [2] = 1 * GiB, + [3] = 64 * MiB, + [4] = 256 * MiB, + [7] = 128 * MiB, + [8] = 32 * MiB, + }; + target_ulong rmls = (env->spr[SPR_LPCR] & LPCR_RMLS) >> LPCR_RMLS_SHIFT; + + return rma_sizes[rmls]; +} + int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx) { @@ -1006,41 +1032,6 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex, cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH; } -static void ppc_hash64_update_rmls(PowerPCCPU *cpu) -{ - CPUPPCState *env = &cpu->env; - uint64_t lpcr = env->spr[SPR_LPCR]; - - /* - * This is the full 4 bits encoding of POWER8. Previous - * CPUs only support a subset of these but the filtering - * is done when writing LPCR - */ - switch ((lpcr & LPCR_RMLS) >> LPCR_RMLS_SHIFT) { - case 0x8: /* 32MB */ - env->rmls = 0x2000000ull; - break; - case 0x3: /* 64MB */ - env->rmls = 0x4000000ull; - break; - case 0x7: /* 128MB */ - env->rmls = 0x8000000ull; - break; - case 0x4: /* 256MB */ - env->rmls = 0x10000000ull; - break; - case 0x2: /* 1GB */ - env->rmls = 0x40000000ull; - break; - case 0x1: /* 16GB */ - env->rmls = 0x400000000ull; - break; - default: - /* What to do here ??? */ - env->rmls = 0; - } -} - static void ppc_hash64_update_vrma(PowerPCCPU *cpu) { CPUPPCState *env = &cpu->env; @@ -1099,7 +1090,7 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) CPUPPCState *env = &cpu->env; env->spr[SPR_LPCR] = val & pcc->lpcr_mask; - ppc_hash64_update_rmls(cpu); + env->rmls = rmls_limit(cpu); ppc_hash64_update_vrma(cpu); } From patchwork Tue Mar 17 10:03:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442411 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5F84D1392 for ; Tue, 17 Mar 2020 10:11:46 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 36E2420714 for ; Tue, 17 Mar 2020 10:11:46 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="cVdESdZi" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 36E2420714 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55624 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9CL-0006E0-AZ for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:11:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45362) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95l-00016e-AL for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95h-0002nU-Va for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:57 -0400 Received: from ozlabs.org ([203.11.71.1]:50711) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95h-0001uL-Fi; Tue, 17 Mar 2020 06:04:53 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw3gKlz9sSl; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=SsCee0AU6qi7MD8E+l9wYYZMteadeXr2Ro4UYhkZybg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cVdESdZiVhMaOex1W6+cWmVUxiuqvRJDIProzIK7sV7kH8WvvdmknSStKKfnB3TYH p3iynBeJ6riX50Zt0+XM2MbIILL92jICv0qtNRpR5An8uU0z7fYGHeIKoziKpSkvXJ lQYFcMzs4jYFN5C73HNmqHt2EPRQM/CZYeirozzM= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 14/45] target/ppc: Correct RMLS table Date: Tue, 17 Mar 2020 21:03:52 +1100 Message-Id: <20200317100423.622643-15-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" The table of RMA limits based on the LPCR[RMLS] field is slightly wrong. We're missing the RMLS == 0 => 256 GiB RMA option, which is available on POWER8, so add that. The comment that goes with the table is much more wrong. We *don't* filter invalid RMLS values when writing the LPCR, and there's not really a sensible way to do so. Furthermore, while in theory the set of RMLS values is implementation dependent, it seems in practice the same set has been available since around POWER4+ up until POWER8, the last model which supports RMLS at all. So, correct that as well. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz --- target/ppc/mmu-hash64.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index 934989e6d9..fcccaabb88 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -762,15 +762,16 @@ static target_ulong rmls_limit(PowerPCCPU *cpu) { CPUPPCState *env = &cpu->env; /* - * This is the full 4 bits encoding of POWER8. Previous - * CPUs only support a subset of these but the filtering - * is done when writing LPCR. + * In theory the meanings of RMLS values are implementation + * dependent. In practice, this seems to have been the set from + * POWER4+..POWER8, and RMLS is no longer supported in POWER9. * * Unsupported values mean the OS has shot itself in the * foot. Return a 0-sized RMA in this case, which we expect * to trigger an immediate DSI or ISI */ static const target_ulong rma_sizes[16] = { + [0] = 256 * GiB, [1] = 16 * GiB, [2] = 1 * GiB, [3] = 64 * MiB, From patchwork Tue Mar 17 10:03:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442453 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 646CA14B4 for ; Tue, 17 Mar 2020 10:19:56 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3B55B205ED for ; Tue, 17 Mar 2020 10:19:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="ojU1y/fV" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3B55B205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55784 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9KF-0003ur-2a for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:19:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45360) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95l-00016V-8M for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95h-0002mt-Tt for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:57 -0400 Received: from ozlabs.org ([203.11.71.1]:36463) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95h-0001uZ-EG; Tue, 17 Mar 2020 06:04:53 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw4VWVz9sSw; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=88kztm91h2bkC3afsiHERGe38CDEWroGsrNUk9qctec=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ojU1y/fVAWoS4lnWaBx1VTEhLTVmaM09uEABtCO7JqcCp5mGdD8M+CqZCtf6tbrAy cAKdZtwpWJysdNDonAcXVr3rVSPTfvCF73BGPQ9ljgRh5qTSctQMPEsF6m6XwQxVtK JYPTi/TirxwbxTnzrHa2/caKeH67CpT8Z+GDVLGM= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 15/45] target/ppc: Only calculate RMLS derived RMA limit on demand Date: Tue, 17 Mar 2020 21:03:53 +1100 Message-Id: <20200317100423.622643-16-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" When the LPCR is written, we update the env->rmls field with the RMA limit it implies. Simplify things by just calculating the value directly from the LPCR value when we need it. It's possible this is a little slower, but it's unlikely to be significant, since this is only for real mode accesses in a translation configuration that's not used very often, and the whole thing is behind the qemu TLB anyway. Therefore, keeping the number of state variables down and not having to worry about making sure it's always in sync seems the better option. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Philippe Mathieu-Daudé --- target/ppc/cpu.h | 1 - target/ppc/mmu-hash64.c | 9 ++++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 8077fdb068..f9871b1233 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1046,7 +1046,6 @@ struct CPUPPCState { uint64_t insns_flags2; #if defined(TARGET_PPC64) ppc_slb_t vrma_slb; - target_ulong rmls; #endif int error_code; diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index fcccaabb88..4fd7b7ee74 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -837,8 +837,10 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, goto skip_slb_search; } else { + target_ulong limit = rmls_limit(cpu); + /* Emulated old-style RMO mode, bounds check against RMLS */ - if (raddr >= env->rmls) { + if (raddr >= limit) { if (rwx == 2) { ppc_hash64_set_isi(cs, SRR1_PROTFAULT); } else { @@ -1000,8 +1002,10 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) return -1; } } else { + target_ulong limit = rmls_limit(cpu); + /* Emulated old-style RMO mode, bounds check against RMLS */ - if (raddr >= env->rmls) { + if (raddr >= limit) { return -1; } return raddr | env->spr[SPR_RMOR]; @@ -1091,7 +1095,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) CPUPPCState *env = &cpu->env; env->spr[SPR_LPCR] = val & pcc->lpcr_mask; - env->rmls = rmls_limit(cpu); ppc_hash64_update_vrma(cpu); } From patchwork Tue Mar 17 10:03:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442429 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9516914B4 for ; Tue, 17 Mar 2020 10:15:52 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6A82E206EC for ; Tue, 17 Mar 2020 10:15:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="SGpfQXwg" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6A82E206EC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55710 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9GJ-00059e-KV for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:15:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45352) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95k-00015i-RS for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95h-0002lh-N8 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:56 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:44645 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95h-0001uD-9b; Tue, 17 Mar 2020 06:04:53 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw42JQz9sSm; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=MjjxC04elr5NVApj6H/3AhJX6J6nM8jDgUwU8I+pbxE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SGpfQXwgrcPcmagN9376g0T8+d/PP6Gr6dd0R9ed6wLKYpr0DgAz5lhu62yaZj8Aq jrv+TuCqgMlyV4ENBeq8FRRq2Icw3a7jeQsCbTwLIebQm0Us5ikZPp+7QCCYQFwAFC OG4tX3NrwBX8aKZ005LP8V9KqEeVNKhjoYTboTXo= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 16/45] target/ppc: Don't store VRMA SLBE persistently Date: Tue, 17 Mar 2020 21:03:54 +1100 Message-Id: <20200317100423.622643-17-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Currently, we construct the SLBE used for VRMA translations when the LPCR is written (which controls some bits in the SLBE), then use it later for translations. This is a bit complex and confusing - simplify it by simply constructing the SLBE directly from the LPCR when we need it. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Philippe Mathieu-Daudé --- target/ppc/cpu.h | 3 -- target/ppc/mmu-hash64.c | 92 ++++++++++++++++------------------------- 2 files changed, 35 insertions(+), 60 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index f9871b1233..5a55fb02bd 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1044,9 +1044,6 @@ struct CPUPPCState { uint32_t flags; uint64_t insns_flags; uint64_t insns_flags2; -#if defined(TARGET_PPC64) - ppc_slb_t vrma_slb; -#endif int error_code; uint32_t pending_interrupts; diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index 4fd7b7ee74..34f6009b1e 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -784,11 +784,41 @@ static target_ulong rmls_limit(PowerPCCPU *cpu) return rma_sizes[rmls]; } +static int build_vrma_slbe(PowerPCCPU *cpu, ppc_slb_t *slb) +{ + CPUPPCState *env = &cpu->env; + target_ulong lpcr = env->spr[SPR_LPCR]; + uint32_t vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT; + target_ulong vsid = SLB_VSID_VRMA | ((vrmasd << 4) & SLB_VSID_LLP_MASK); + int i; + + for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) { + const PPCHash64SegmentPageSizes *sps = &cpu->hash64_opts->sps[i]; + + if (!sps->page_shift) { + break; + } + + if ((vsid & SLB_VSID_LLP_MASK) == sps->slb_enc) { + slb->esid = SLB_ESID_V; + slb->vsid = vsid; + slb->sps = sps; + return 0; + } + } + + error_report("Bad page size encoding in LPCR[VRMASD]; LPCR=0x" + TARGET_FMT_lx"\n", lpcr); + + return -1; +} + int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx) { CPUState *cs = CPU(cpu); CPUPPCState *env = &cpu->env; + ppc_slb_t vrma_slbe; ppc_slb_t *slb; unsigned apshift; hwaddr ptex; @@ -827,8 +857,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, } } else if (ppc_hash64_use_vrma(env)) { /* Emulated VRMA mode */ - slb = &env->vrma_slb; - if (!slb->sps) { + slb = &vrma_slbe; + if (build_vrma_slbe(cpu, slb) != 0) { /* Invalid VRMA setup, machine check */ cs->exception_index = POWERPC_EXCP_MCHECK; env->error_code = 0; @@ -976,6 +1006,7 @@ skip_slb_search: hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) { CPUPPCState *env = &cpu->env; + ppc_slb_t vrma_slbe; ppc_slb_t *slb; hwaddr ptex, raddr; ppc_hash_pte64_t pte; @@ -997,8 +1028,8 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) return raddr | env->spr[SPR_HRMOR]; } else if (ppc_hash64_use_vrma(env)) { /* Emulated VRMA mode */ - slb = &env->vrma_slb; - if (!slb->sps) { + slb = &vrma_slbe; + if (build_vrma_slbe(cpu, slb) != 0) { return -1; } } else { @@ -1037,65 +1068,12 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex, cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH; } -static void ppc_hash64_update_vrma(PowerPCCPU *cpu) -{ - CPUPPCState *env = &cpu->env; - const PPCHash64SegmentPageSizes *sps = NULL; - target_ulong esid, vsid, lpcr; - ppc_slb_t *slb = &env->vrma_slb; - uint32_t vrmasd; - int i; - - /* First clear it */ - slb->esid = slb->vsid = 0; - slb->sps = NULL; - - /* Is VRMA enabled ? */ - if (!ppc_hash64_use_vrma(env)) { - return; - } - - /* - * Make one up. Mostly ignore the ESID which will not be needed - * for translation - */ - lpcr = env->spr[SPR_LPCR]; - vsid = SLB_VSID_VRMA; - vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT; - vsid |= (vrmasd << 4) & (SLB_VSID_L | SLB_VSID_LP); - esid = SLB_ESID_V; - - for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) { - const PPCHash64SegmentPageSizes *sps1 = &cpu->hash64_opts->sps[i]; - - if (!sps1->page_shift) { - break; - } - - if ((vsid & SLB_VSID_LLP_MASK) == sps1->slb_enc) { - sps = sps1; - break; - } - } - - if (!sps) { - error_report("Bad page size encoding esid 0x"TARGET_FMT_lx - " vsid 0x"TARGET_FMT_lx, esid, vsid); - return; - } - - slb->vsid = vsid; - slb->esid = esid; - slb->sps = sps; -} - void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) { PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); CPUPPCState *env = &cpu->env; env->spr[SPR_LPCR] = val & pcc->lpcr_mask; - ppc_hash64_update_vrma(cpu); } void helper_store_lpcr(CPUPPCState *env, target_ulong val) From patchwork Tue Mar 17 10:03:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442403 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 85FB8913 for ; Tue, 17 Mar 2020 10:09:48 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5D480205ED for ; Tue, 17 Mar 2020 10:09:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="HZNnyV1h" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5D480205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55582 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9AR-0002Pj-Hl for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:09:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45325) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95j-00013j-V2 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95h-0002lH-L5 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:55 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:41927 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95h-0001uK-6s; Tue, 17 Mar 2020 06:04:53 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw4v3Gz9sSt; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=ahf6kPUdTFlVRzytiUCLwUm2hqrLDJD3Di+JZ1vbp30=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HZNnyV1hmaH/QbFp9bsKZ311WiT5hxSo64ZaLebi1GN6l/LfRWjPT1Y85N7bvDdJO /ndfFNtKYTma9/azWRt802tssBmRs7TG8qP65clcGeFZkC8qxrt3YNp/wldCN0zhrm M+1hHy0tNRLoXF02R1+Fp6S+nVY9q1CabquRba4I= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 17/45] spapr: Don't use weird units for MIN_RMA_SLOF Date: Tue, 17 Mar 2020 21:03:55 +1100 Message-Id: <20200317100423.622643-18-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" MIN_RMA_SLOF records the minimum about of RMA that the SLOF firmware requires. It lets us give a meaningful error if the RMA ends up too small, rather than just letting SLOF crash. It's currently stored as a number of megabytes, which is strange for global constants. Move that megabyte scaling into the definition of the constant like most other things use. Change from M to MiB in the associated message while we're at it. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz Reviewed-by: Philippe Mathieu-Daudé --- hw/ppc/spapr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index cc10798be4..510494ad87 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -103,7 +103,7 @@ #define FW_OVERHEAD 0x2800000 #define KERNEL_LOAD_ADDR FW_MAX_SIZE -#define MIN_RMA_SLOF 128UL +#define MIN_RMA_SLOF (128 * MiB) #define PHANDLE_INTC 0x00001111 @@ -2956,10 +2956,10 @@ static void spapr_machine_init(MachineState *machine) } } - if (spapr->rma_size < (MIN_RMA_SLOF * MiB)) { + if (spapr->rma_size < MIN_RMA_SLOF) { error_report( - "pSeries SLOF firmware requires >= %ldM guest RMA (Real Mode Area memory)", - MIN_RMA_SLOF); + "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area memory)", + MIN_RMA_SLOF / MiB); exit(1); } From patchwork Tue Mar 17 10:03:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442413 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 71A26913 for ; Tue, 17 Mar 2020 10:12:33 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 490E020714 for ; Tue, 17 Mar 2020 10:12:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="nS+LLB7/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 490E020714 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55632 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9D6-0007Sl-DT for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:12:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45406) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95m-00019R-QV for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95j-0002xF-2H for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:58 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:60955 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95h-0001v9-Hx; Tue, 17 Mar 2020 06:04:54 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKw5hLBz9sT2; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439476; bh=a78LN1DHf/xUKLvhVIm9tRfpO0P/QhRCfN+jcV/NO9A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nS+LLB7/iPHDKwPIsKxM5TanK4pX9DjeRoB9V7Ele/zfUj86+XY1m3srt/LtEUi2B SpyfKWDDvrlzAPgPWxJI1Y2JgEWzrHk6nxm7A/BsVLfawirnUOrrE1gEOh3Pwue57x Htco8lXXZaT4F/V4febCFkLgmXjMGGt9WkyfHEdY= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 18/45] spapr,ppc: Simplify signature of kvmppc_rma_size() Date: Tue, 17 Mar 2020 21:03:56 +1100 Message-Id: <20200317100423.622643-19-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, Cedric Le Goater , qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" This function calculates the maximum size of the RMA as implied by the host's page size of structure of the VRMA (there are a number of other constraints on the RMA size which will supersede this one in many circumstances). The current interface takes the current RMA size estimate, and clamps it to the VRMA derived size. The only current caller passes in an arguably wrong value (it will match the current RMA estimate in some but not all cases). We want to fix that, but for now just keep concerns separated by having the KVM helper function just return the VRMA derived limit, and let the caller combine it with other constraints. We call the new function kvmppc_vrma_limit() to more clearly indicate its limited responsibility. The helper should only ever be called in the KVM enabled case, so replace its !CONFIG_KVM stub with an assert() rather than a dummy value. Signed-off-by: David Gibson Reviewed-by: Cedric Le Goater Reviewed-by: Greg Kurz Reviewed-by: Alexey Kardashevskiy Reviewed-by: Philippe Mathieu-Daudé --- hw/ppc/spapr.c | 5 +++-- target/ppc/kvm.c | 5 ++--- target/ppc/kvm_ppc.h | 7 +++---- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 510494ad87..18bf4bc3de 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1586,8 +1586,9 @@ void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr) spapr_reallocate_hpt(spapr, hpt_shift, &error_fatal); if (spapr->vrma_adjust) { - spapr->rma_size = kvmppc_rma_size(spapr_node0_size(MACHINE(spapr)), - spapr->htab_shift); + hwaddr vrma_limit = kvmppc_vrma_limit(spapr->htab_shift); + + spapr->rma_size = MIN(spapr_node0_size(MACHINE(spapr)), vrma_limit); } } diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 7f44b1aa1a..597f72be1b 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -2113,7 +2113,7 @@ void kvmppc_error_append_smt_possible_hint(Error *const *errp) #ifdef TARGET_PPC64 -uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift) +uint64_t kvmppc_vrma_limit(unsigned int hash_shift) { struct kvm_ppc_smmu_info info; long rampagesize, best_page_shift; @@ -2140,8 +2140,7 @@ uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift) } } - return MIN(current_size, - 1ULL << (best_page_shift + hash_shift - 7)); + return 1ULL << (best_page_shift + hash_shift - 7); } #endif diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index 9e4f2357cc..332fa0aa1c 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -47,7 +47,7 @@ void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift, int *pfd, bool need_vfio); int kvmppc_remove_spapr_tce(void *table, int pfd, uint32_t window_size); int kvmppc_reset_htab(int shift_hint); -uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift); +uint64_t kvmppc_vrma_limit(unsigned int hash_shift); bool kvmppc_has_cap_spapr_vfio(void); #endif /* !CONFIG_USER_ONLY */ bool kvmppc_has_cap_epr(void); @@ -255,10 +255,9 @@ static inline int kvmppc_reset_htab(int shift_hint) return 0; } -static inline uint64_t kvmppc_rma_size(uint64_t current_size, - unsigned int hash_shift) +static inline uint64_t kvmppc_vrma_limit(unsigned int hash_shift) { - return ram_size; + g_assert_not_reached(); } static inline bool kvmppc_hpt_needs_host_contiguous_pages(void) From patchwork Tue Mar 17 10:03:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442435 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6386A913 for ; Tue, 17 Mar 2020 10:18:09 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 396B92071C for ; Tue, 17 Mar 2020 10:18:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="PISQw3RU" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 396B92071C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55740 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9IW-0000P6-Ac for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:18:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45366) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95l-000170-G1 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95h-0002mL-Qz for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:57 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:41261 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95h-0001vO-Aw; Tue, 17 Mar 2020 06:04:53 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKx0hl1z9sT3; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439477; bh=czLuj0l/HYBaWKsNYfYuhLXXjydZHWUzwaXT+FX4eR4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PISQw3RUdijZVmThNvhG5TzTfgJjRkG3x5PzLWOR4EaFGhLoE4Tm7QcFkjRN7MYWH zz+ttIQQOh/1QjVne7kPqDIsYC3g4kY3MAVdF1P053/WnFI7m63QptY08IV3R5PoXQ /FyIqoJXhC4wDCQ8XxiMB+za6Uqpl06QthlwIVRU= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 19/45] spapr: Don't attempt to clamp RMA to VRMA constraint Date: Tue, 17 Mar 2020 21:03:57 +1100 Message-Id: <20200317100423.622643-20-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" The Real Mode Area (RMA) is the part of memory which a guest can access when in real (MMU off) mode. Of course, for a guest under KVM, the MMU isn't really turned off, it's just in a special translation mode - Virtual Real Mode Area (VRMA) - which looks like real mode in guest mode. The mechanics of how this works when using the hash MMU (HPT) put a constraint on the size of the RMA, which depends on the size of the HPT. So, the latter part of spapr_setup_hpt_and_vrma() clamps the RMA we advertise to the guest based on this VRMA limit. There are several things wrong with this: 1) spapr_setup_hpt_and_vrma() doesn't actually clamp, it takes the minimum of Node 0 memory size and the VRMA limit. That will *often* work the same as clamping, but there can be other constraints on RMA size which supersede Node 0 memory size. We have real bugs caused by this (currently worked around in the guest kernel) 2) Some callers of spapr_setup_hpt_and_vrma() are in a situation where we're past the point that we can actually advertise an RMA limit to the guest 3) But most fundamentally, the VRMA limit depends on host configuration (page size) which shouldn't be visible to the guest, but this partially exposes it. This can cause problems with migration in certain edge cases, although we will mostly get away with it. In practice, this clamping is almost never applied anyway. With 64kiB pages and the normal rules for sizing of the HPT, the theoretical VRMA limit will be 4x(guest memory size) and so never hit. It will hit with 4kiB pages, where it will be (guest memory size)/4. However all mainstream distro kernels for POWER have used a 64kiB page size for at least 10 years. So, simply replace this logic with a check that the RMA we've calculated based only on guest visible configuration will fit within the host implied VRMA limit. This can break if running HPT guests on a host kernel with 4kiB page size. As noted that's very rare. There also exist several possible workarounds: * Change the host kernel to use 64kiB pages * Use radix MMU (RPT) guests instead of HPT * Use 64kiB hugepages on the host to back guest memory * Increase the guest memory size so that the RMA hits one of the fixed limits before the RMA limit. This is relatively easy on POWER8 which has a 16GiB limit, harder on POWER9 which has a 1TiB limit. * Use a guest NUMA configuration which artificially constrains the RMA within the VRMA limit (the RMA must always fit within Node 0). Previously, on KVM, we also temporarily reduced the rma_size to 256M so that the we'd load the kernel and initrd safely, regardless of the VRMA limit. This was a) confusing, b) could significantly limit the size of images we could load and c) introduced a behavioural difference between KVM and TCG. So we remove that as well. Signed-off-by: David Gibson Reviewed-by: Alexey Kardashevskiy Reviewed-by: Greg Kurz --- hw/ppc/spapr.c | 28 ++++++++++------------------ hw/ppc/spapr_hcall.c | 4 ++-- include/hw/ppc/spapr.h | 3 +-- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 18bf4bc3de..ef7667455c 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1569,7 +1569,7 @@ void spapr_reallocate_hpt(SpaprMachineState *spapr, int shift, spapr_set_all_lpcrs(0, LPCR_HR | LPCR_UPRT); } -void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr) +void spapr_setup_hpt(SpaprMachineState *spapr) { int hpt_shift; @@ -1585,10 +1585,16 @@ void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr) } spapr_reallocate_hpt(spapr, hpt_shift, &error_fatal); - if (spapr->vrma_adjust) { + if (kvm_enabled()) { hwaddr vrma_limit = kvmppc_vrma_limit(spapr->htab_shift); - spapr->rma_size = MIN(spapr_node0_size(MACHINE(spapr)), vrma_limit); + /* Check our RMA fits in the possible VRMA */ + if (vrma_limit < spapr->rma_size) { + error_report("Unable to create %" HWADDR_PRIu + "MiB RMA (VRMA only allows %" HWADDR_PRIu "MiB", + spapr->rma_size / MiB, vrma_limit / MiB); + exit(EXIT_FAILURE); + } } } @@ -1628,7 +1634,7 @@ static void spapr_machine_reset(MachineState *machine) spapr->patb_entry = PATE1_GR; spapr_set_all_lpcrs(LPCR_HR | LPCR_UPRT, LPCR_HR | LPCR_UPRT); } else { - spapr_setup_hpt_and_vrma(spapr); + spapr_setup_hpt(spapr); } qemu_devices_reset(); @@ -2695,20 +2701,6 @@ static void spapr_machine_init(MachineState *machine) spapr->rma_size = node0_size; - /* With KVM, we don't actually know whether KVM supports an - * unbounded RMA (PR KVM) or is limited by the hash table size - * (HV KVM using VRMA), so we always assume the latter - * - * In that case, we also limit the initial allocations for RTAS - * etc... to 256M since we have no way to know what the VRMA size - * is going to be as it depends on the size of the hash table - * which isn't determined yet. - */ - if (kvm_enabled()) { - spapr->vrma_adjust = 1; - spapr->rma_size = MIN(spapr->rma_size, 0x10000000); - } - /* Actually we don't support unbounded RMA anymore since we added * proper emulation of HV mode. The max we can get is 16G which * also happens to be what we configure for PAPR mode so make sure diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index c2b3286625..40c86e91eb 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -1458,7 +1458,7 @@ static void spapr_check_setup_free_hpt(SpaprMachineState *spapr, spapr_free_hpt(spapr); } else if (!(patbe_new & PATE1_GR)) { /* RADIX->HASH || NOTHING->HASH : Allocate HPT */ - spapr_setup_hpt_and_vrma(spapr); + spapr_setup_hpt(spapr); } return; } @@ -1845,7 +1845,7 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu, * (because the guest isn't going to use radix) then set it up here. */ if ((spapr->patb_entry & PATE1_GR) && !guest_radix) { /* legacy hash or new hash: */ - spapr_setup_hpt_and_vrma(spapr); + spapr_setup_hpt(spapr); } if (fdt_bufsize < sizeof(hdr)) { diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index a4216935a1..90dbc55931 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -156,7 +156,6 @@ struct SpaprMachineState { SpaprPendingHpt *pending_hpt; /* in-progress resize */ hwaddr rma_size; - int vrma_adjust; uint32_t fdt_size; uint32_t fdt_initial_size; void *fdt_blob; @@ -795,7 +794,7 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space); void spapr_events_init(SpaprMachineState *sm); void spapr_dt_events(SpaprMachineState *sm, void *fdt); void close_htab_fd(SpaprMachineState *spapr); -void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr); +void spapr_setup_hpt(SpaprMachineState *spapr); void spapr_free_hpt(SpaprMachineState *spapr); SpaprTceTable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn); void spapr_tce_table_enable(SpaprTceTable *tcet, From patchwork Tue Mar 17 10:03:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442473 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E5F4A14B4 for ; Tue, 17 Mar 2020 10:21:45 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BD7C72071C for ; Tue, 17 Mar 2020 10:21:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="LGhWPhZc" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BD7C72071C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55826 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9M0-0007O7-VS for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:21:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45401) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95m-00019M-Kf for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95i-0002vH-Ps for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:58 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:49839 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95i-0001yq-Av; Tue, 17 Mar 2020 06:04:54 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKx1w56z9sT6; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439477; bh=1myGuMmzhzW4ZX8OW4w8czTvL3ytFK7PKxTuudKBuBo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LGhWPhZcZp/FLKkLZzzT/x6yXVL8ehfKqudEUgwB4lFXQQH4pN2su3nSlvdpn7YNN +jixCWQNdX9g6v8c3fSnYb7cHUQPA32YwbB7seJZXjnWo1jF6eH5bdQ40weyk1wNvb Ost1pZbX8jhJ+RwIyikQlFJ2MXYRP5kPSGyL3mBU= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 20/45] spapr: Don't clamp RMA to 16GiB on new machine types Date: Tue, 17 Mar 2020 21:03:58 +1100 Message-Id: <20200317100423.622643-21-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" In spapr_machine_init() we clamp the size of the RMA to 16GiB and the comment saying why doesn't make a whole lot of sense. In fact, this was done because the real mode handling code elsewhere limited the RMA in TCG mode to the maximum value configurable in LPCR[RMLS], 16GiB. But, * Actually LPCR[RMLS] has been able to encode a 256GiB size for a very long time, we just didn't implement it properly in the softmmu * LPCR[RMLS] shouldn't really be relevant anyway, it only was because we used to abuse the RMOR based translation mode in order to handle the fact that we're not modelling the hypervisor parts of the cpu We've now removed those limitations in the modelling so the 16GiB clamp no longer serves a function. However, we can't just remove the limit universally: that would break migration to earlier qemu versions, where the 16GiB RMLS limit still applies, no matter how bad the reasons for it are. So, we replace the 16GiB clamp, with a clamp to a limit defined in the machine type class. We set it to 16 GiB for machine types 4.2 and earlier, but set it to 0 meaning unlimited for the new 5.0 machine type. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Philippe Mathieu-Daudé --- hw/ppc/spapr.c | 13 ++++++++----- include/hw/ppc/spapr.h | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index ef7667455c..95bda4a615 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2701,12 +2701,14 @@ static void spapr_machine_init(MachineState *machine) spapr->rma_size = node0_size; - /* Actually we don't support unbounded RMA anymore since we added - * proper emulation of HV mode. The max we can get is 16G which - * also happens to be what we configure for PAPR mode so make sure - * we don't do anything bigger than that + /* + * Clamp the RMA size based on machine type. This is for + * migration compatibility with older qemu versions, which limited + * the RMA size for complicated and mostly bad reasons. */ - spapr->rma_size = MIN(spapr->rma_size, 0x400000000ull); + if (smc->rma_limit) { + spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit); + } if (spapr->rma_size > node0_size) { error_report("Numa node 0 has to span the RMA (%#08"HWADDR_PRIx")", @@ -4598,6 +4600,7 @@ static void spapr_machine_4_2_class_options(MachineClass *mc) compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len); smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF; smc->default_caps.caps[SPAPR_CAP_FWNMI_MCE] = SPAPR_CAP_OFF; + smc->rma_limit = 16 * GiB; mc->nvdimm_supported = false; } diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 90dbc55931..2015e37ac5 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -126,6 +126,7 @@ struct SpaprMachineClass { bool pre_4_1_migration; /* don't migrate hpt-max-page-size */ bool linux_pci_probe; bool smp_threads_vsmt; /* set VSMT to smp_threads by default */ + hwaddr rma_limit; /* clamp the RMA to this size */ void (*phb_placement)(SpaprMachineState *spapr, uint32_t index, uint64_t *buid, hwaddr *pio, From patchwork Tue Mar 17 10:03:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442431 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6AD5114B4 for ; Tue, 17 Mar 2020 10:16:50 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3F94A20736 for ; Tue, 17 Mar 2020 10:16:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="MxarlFhT" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3F94A20736 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55720 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9HF-0006XF-85 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:16:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45935) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE967-0001iB-EG for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE965-0005YK-Qc for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:19 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:57809 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE965-0002os-Bl; Tue, 17 Mar 2020 06:05:17 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKx6jdnz9sTC; Tue, 17 Mar 2020 21:04:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439477; bh=o7N/dshst+CIkSfq9Go1qUnQPzkKuFsVjI0nGOok1OU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MxarlFhTsBJfLcn+OBdW+1z9HbK7kbwamUkQIbmqchS2vq2HRzBvk+oJyjNKqqhXh GQTIKY196jYmQdFqAdqd5Rr/2u5axjGOlcFJIT78cAA26n+95ZWuFjlr+u8c2QFlyk CHKq2qD927Odkv+6/6QxbNkAv+/19dBKClEW43+M= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 21/45] spapr: Clean up RMA size calculation Date: Tue, 17 Mar 2020 21:03:59 +1100 Message-Id: <20200317100423.622643-22-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Move the calculation of the Real Mode Area (RMA) size into a helper function. While we're there clean it up and correct it in a few ways: * Add comments making it clearer where the various constraints come from * Remove a pointless check that the RMA fits within Node 0 (we've just clamped it so that it does) Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Philippe Mathieu-Daudé --- hw/ppc/spapr.c | 61 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 95bda4a615..1950fc303e 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2648,6 +2648,42 @@ static PCIHostState *spapr_create_default_phb(void) return PCI_HOST_BRIDGE(dev); } +static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp) +{ + MachineState *machine = MACHINE(spapr); + SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr); + hwaddr rma_size = machine->ram_size; + hwaddr node0_size = spapr_node0_size(machine); + + /* RMA has to fit in the first NUMA node */ + rma_size = MIN(rma_size, node0_size); + + /* + * VRMA access is via a special 1TiB SLB mapping, so the RMA can + * never exceed that + */ + rma_size = MIN(rma_size, 1 * TiB); + + /* + * Clamp the RMA size based on machine type. This is for + * migration compatibility with older qemu versions, which limited + * the RMA size for complicated and mostly bad reasons. + */ + if (smc->rma_limit) { + rma_size = MIN(rma_size, smc->rma_limit); + } + + if (rma_size < MIN_RMA_SLOF) { + error_setg(errp, + "pSeries SLOF firmware requires >= %" HWADDR_PRIx + "ldMiB guest RMA (Real Mode Area memory)", + MIN_RMA_SLOF / MiB); + return 0; + } + + return rma_size; +} + /* pSeries LPAR / sPAPR hardware init */ static void spapr_machine_init(MachineState *machine) { @@ -2659,7 +2695,6 @@ static void spapr_machine_init(MachineState *machine) PCIHostState *phb; int i; MemoryRegion *sysmem = get_system_memory(); - hwaddr node0_size = spapr_node0_size(machine); long load_limit, fw_size; char *filename; Error *resize_hpt_err = NULL; @@ -2699,22 +2734,7 @@ static void spapr_machine_init(MachineState *machine) exit(1); } - spapr->rma_size = node0_size; - - /* - * Clamp the RMA size based on machine type. This is for - * migration compatibility with older qemu versions, which limited - * the RMA size for complicated and mostly bad reasons. - */ - if (smc->rma_limit) { - spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit); - } - - if (spapr->rma_size > node0_size) { - error_report("Numa node 0 has to span the RMA (%#08"HWADDR_PRIx")", - spapr->rma_size); - exit(1); - } + spapr->rma_size = spapr_rma_size(spapr, &error_fatal); /* Setup a load limit for the ramdisk leaving room for SLOF and FDT */ load_limit = MIN(spapr->rma_size, RTAS_MAX_ADDR) - FW_OVERHEAD; @@ -2951,13 +2971,6 @@ static void spapr_machine_init(MachineState *machine) } } - if (spapr->rma_size < MIN_RMA_SLOF) { - error_report( - "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area memory)", - MIN_RMA_SLOF / MiB); - exit(1); - } - if (kernel_filename) { uint64_t lowaddr = 0; From patchwork Tue Mar 17 10:04:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442451 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4FAD8913 for ; Tue, 17 Mar 2020 10:19:44 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 26C0220658 for ; Tue, 17 Mar 2020 10:19:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="YOvlYcBR" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 26C0220658 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55778 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9K3-0003Tw-8E for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:19:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45923) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE966-0001hX-Rc for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE965-0005XC-Lk for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:18 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:36045 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE965-0002ok-6a; Tue, 17 Mar 2020 06:05:17 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKx5Wz3z9sSq; Tue, 17 Mar 2020 21:04:37 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439477; bh=fAXtD2ODA0a0KuawsYUHly3XdUAn7S9stTBG9ajl/f0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YOvlYcBR80ry/r+wVskSQNXw2csxa7hC40Nu6Jf4IOipJgsSxO3d2DnZ4EJwf1wvb Of8zKiI+fPz+XwgOKetCmATs1FcBrPaEhf9TL6qU7NKSBVBPJw4yIa7iT9B7y8ltvs Nu7jVdIQKINdx0wKmSpvEleYimvoAJp99cvk6mvA= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 22/45] hw/scsi/viosrp: Add missing 'hw/scsi/srp.h' include Date: Tue, 17 Mar 2020 21:04:00 +1100 Message-Id: <20200317100423.622643-23-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Paolo Bonzini , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daudé This header use the srp_* structures declared in "hw/scsi/srp.h". Signed-off-by: Philippe Mathieu-Daudé Message-Id: <20200305121253.19078-2-philmd@redhat.com> Reviewed-by: Paolo Bonzini Signed-off-by: David Gibson --- hw/scsi/viosrp.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/scsi/viosrp.h b/hw/scsi/viosrp.h index d8e365db1e..25676c2383 100644 --- a/hw/scsi/viosrp.h +++ b/hw/scsi/viosrp.h @@ -34,6 +34,8 @@ #ifndef PPC_VIOSRP_H #define PPC_VIOSRP_H +#include "hw/scsi/srp.h" + #define SRP_VERSION "16.a" #define SRP_MAX_IU_LEN 256 #define SRP_MAX_LOC_LEN 32 From patchwork Tue Mar 17 10:04:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442395 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A3CE7913 for ; Tue, 17 Mar 2020 10:08:10 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7B5FF205ED for ; Tue, 17 Mar 2020 10:08:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="L3LRKVNd" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7B5FF205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55554 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE98r-0007Tc-M4 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:08:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45396) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95m-000192-EG for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95i-0002vI-Pk for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:04:58 -0400 Received: from ozlabs.org ([203.11.71.1]:42747) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95i-0002Uf-Bi; Tue, 17 Mar 2020 06:04:54 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKx3zywz9sT7; Tue, 17 Mar 2020 21:04:37 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439477; bh=g37u8nOXV/YgUYVIEnNjN8EQgGn6qVrqvgUdqDSWUPc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=L3LRKVNdXnXXw5NKg1mX5unT1By6ehCLLjG1IwlMA6vGNWAm9uhgib99avkrQyU0e chte5FA0+yFXHzQiSeiAkJzR37pvMg0UsNuc2WiECArnCJeZdoOoA8A+l47TpWvJc3 V5TnFSWPpWVsjzmRSnHN0CFy+GjOOB3w7jS5l7OE= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 23/45] hw/scsi/spapr_vscsi: Use SRP_MAX_IU_LEN instead of sizeof flexible array Date: Tue, 17 Mar 2020 21:04:01 +1100 Message-Id: <20200317100423.622643-24-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Paolo Bonzini , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daudé Replace sizeof() flexible arrays union srp_iu/viosrp_iu by the SRP_MAX_IU_LEN definition, which is what this code actually meant to use. Signed-off-by: Philippe Mathieu-Daudé Message-Id: <20200305121253.19078-3-philmd@redhat.com> Reviewed-by: Paolo Bonzini Signed-off-by: David Gibson --- hw/scsi/spapr_vscsi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index 7d584e7732..7e397ed797 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -671,8 +671,8 @@ static void vscsi_process_login(VSCSIState *s, vscsi_req *req) */ rsp->req_lim_delta = cpu_to_be32(VSCSI_REQ_LIMIT-2); rsp->tag = tag; - rsp->max_it_iu_len = cpu_to_be32(sizeof(union srp_iu)); - rsp->max_ti_iu_len = cpu_to_be32(sizeof(union srp_iu)); + rsp->max_it_iu_len = cpu_to_be32(SRP_MAX_IU_LEN); + rsp->max_ti_iu_len = cpu_to_be32(SRP_MAX_IU_LEN); /* direct and indirect */ rsp->buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT); @@ -1088,7 +1088,7 @@ static void vscsi_got_payload(VSCSIState *s, vscsi_crq *crq) * in our 256 bytes IUs. If not we'll have to increase the size * of the structure. */ - if (crq->s.IU_length > sizeof(union viosrp_iu)) { + if (crq->s.IU_length > SRP_MAX_IU_LEN) { fprintf(stderr, "VSCSI: SRP IU too long (%d bytes) !\n", crq->s.IU_length); vscsi_put_req(req); From patchwork Tue Mar 17 10:04:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442433 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 21314913 for ; Tue, 17 Mar 2020 10:17:14 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E7220206EC for ; Tue, 17 Mar 2020 10:17:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="NQSNsgj1" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E7220206EC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55730 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Hd-0007Jg-3w for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:17:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45503) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95q-0001G5-AN for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95n-0003Xz-LT for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:02 -0400 Received: from ozlabs.org ([203.11.71.1]:43399) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95n-0002rh-8h; Tue, 17 Mar 2020 06:04:59 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKy3N2Xz9sTK; Tue, 17 Mar 2020 21:04:37 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439478; bh=uQp81HKqcQMQGuUZd2mCb4gRCwE3YNLsmBa2mm3EkEM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NQSNsgj1zL3hLBu2aLFJ65wrPf+rW0aDySYtLovErcqUZRC+rXDOqPgzfhgApBgK3 S32YRE+R2+illdIT2qpxwThF845Vb6yjVEyLuzmZ4ABAVzAraNRP5FRQvXiBPGdp5N jTFU1lPsLrAHQ0nNnUEO5I3dRdiB6836PUQe7VRA= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 24/45] hw/scsi/spapr_vscsi: Simplify a bit Date: Tue, 17 Mar 2020 21:04:02 +1100 Message-Id: <20200317100423.622643-25-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Paolo Bonzini , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daudé We already have a 'iu' pointer, use it (this simplifies the next commit). Signed-off-by: Philippe Mathieu-Daudé Message-Id: <20200305121253.19078-4-philmd@redhat.com> Reviewed-by: Paolo Bonzini Signed-off-by: David Gibson --- hw/scsi/spapr_vscsi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index 7e397ed797..3cb5a38181 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -261,9 +261,9 @@ static int vscsi_send_rsp(VSCSIState *s, vscsi_req *req, if (status) { iu->srp.rsp.sol_not = (sol_not & 0x04) >> 2; if (req->senselen) { - req->iu.srp.rsp.flags |= SRP_RSP_FLAG_SNSVALID; - req->iu.srp.rsp.sense_data_len = cpu_to_be32(req->senselen); - memcpy(req->iu.srp.rsp.data, req->sense, req->senselen); + iu->srp.rsp.flags |= SRP_RSP_FLAG_SNSVALID; + iu->srp.rsp.sense_data_len = cpu_to_be32(req->senselen); + memcpy(iu->srp.rsp.data, req->sense, req->senselen); total_len += req->senselen; } } else { From patchwork Tue Mar 17 10:04:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442491 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 86C1C14B4 for ; Tue, 17 Mar 2020 10:28:36 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5D704205ED for ; Tue, 17 Mar 2020 10:28:36 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="euScu9ax" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5D704205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:56046 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Sd-0002Qi-IQ for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:28:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45990) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE969-0001jn-Aj for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE967-0005lL-GF for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:21 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:48023 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE967-0002rW-4k; Tue, 17 Mar 2020 06:05:19 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKy4yzVz9sTD; Tue, 17 Mar 2020 21:04:37 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439478; bh=B1jV0fPQqocvsTwTXF9kvnqwBe/46c7fcSvYFuxuhlo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=euScu9axJryurPEQPYiT+tUUw9VrfgPdpAYpM/A6LVkKGFDZcxb29YGOlVeZ16uBH iZC7kTJ5UWJrBUa7xP5630ooScJg+S4aofXwIHZ/LZlETzHlcRdRjbDfC27TPQycj+ 4uVsomRwAFKilupiq3nua/WJUCrkww8TdViV/bhE= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 25/45] hw/scsi/spapr_vscsi: Introduce req_iu() helper Date: Tue, 17 Mar 2020 21:04:03 +1100 Message-Id: <20200317100423.622643-26-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Paolo Bonzini , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daudé Introduce the req_iu() helper which returns a pointer to the viosrp_iu union held in the vscsi_req structure. This simplifies the next patch. Signed-off-by: Philippe Mathieu-Daudé Message-Id: <20200305121253.19078-5-philmd@redhat.com> Reviewed-by: Paolo Bonzini Signed-off-by: David Gibson --- hw/scsi/spapr_vscsi.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index 3cb5a38181..70547f98ac 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -97,6 +97,11 @@ typedef struct { vscsi_req reqs[VSCSI_REQ_LIMIT]; } VSCSIState; +static union viosrp_iu *req_iu(vscsi_req *req) +{ + return &req->iu; +} + static struct vscsi_req *vscsi_get_req(VSCSIState *s) { vscsi_req *req; @@ -121,7 +126,7 @@ static struct vscsi_req *vscsi_find_req(VSCSIState *s, uint64_t srp_tag) for (i = 0; i < VSCSI_REQ_LIMIT; i++) { req = &s->reqs[i]; - if (req->iu.srp.cmd.tag == srp_tag) { + if (req_iu(req)->srp.cmd.tag == srp_tag) { return req; } } @@ -188,7 +193,7 @@ static int vscsi_send_iu(VSCSIState *s, vscsi_req *req, req->crq.s.reserved = 0x00; req->crq.s.timeout = cpu_to_be16(0x0000); req->crq.s.IU_length = cpu_to_be16(length); - req->crq.s.IU_data_ptr = req->iu.srp.rsp.tag; /* right byte order */ + req->crq.s.IU_data_ptr = req_iu(req)->srp.rsp.tag; /* right byte order */ if (rc == 0) { req->crq.s.status = VIOSRP_OK; @@ -224,7 +229,7 @@ static void vscsi_makeup_sense(VSCSIState *s, vscsi_req *req, static int vscsi_send_rsp(VSCSIState *s, vscsi_req *req, uint8_t status, int32_t res_in, int32_t res_out) { - union viosrp_iu *iu = &req->iu; + union viosrp_iu *iu = req_iu(req); uint64_t tag = iu->srp.rsp.tag; int total_len = sizeof(iu->srp.rsp); uint8_t sol_not = iu->srp.cmd.sol_not; @@ -285,7 +290,7 @@ static int vscsi_fetch_desc(VSCSIState *s, struct vscsi_req *req, unsigned n, unsigned buf_offset, struct srp_direct_buf *ret) { - struct srp_cmd *cmd = &req->iu.srp.cmd; + struct srp_cmd *cmd = &req_iu(req)->srp.cmd; switch (req->dma_fmt) { case SRP_NO_DATA_DESC: { @@ -473,7 +478,7 @@ static int data_out_desc_size(struct srp_cmd *cmd) static int vscsi_preprocess_desc(vscsi_req *req) { - struct srp_cmd *cmd = &req->iu.srp.cmd; + struct srp_cmd *cmd = &req_iu(req)->srp.cmd; req->cdb_offset = cmd->add_cdb_len & ~3; @@ -655,7 +660,7 @@ static void *vscsi_load_request(QEMUFile *f, SCSIRequest *sreq) static void vscsi_process_login(VSCSIState *s, vscsi_req *req) { - union viosrp_iu *iu = &req->iu; + union viosrp_iu *iu = req_iu(req); struct srp_login_rsp *rsp = &iu->srp.login_rsp; uint64_t tag = iu->srp.rsp.tag; @@ -681,7 +686,7 @@ static void vscsi_process_login(VSCSIState *s, vscsi_req *req) static void vscsi_inquiry_no_target(VSCSIState *s, vscsi_req *req) { - uint8_t *cdb = req->iu.srp.cmd.cdb; + uint8_t *cdb = req_iu(req)->srp.cmd.cdb; uint8_t resp_data[36]; int rc, len, alen; @@ -770,7 +775,7 @@ static void vscsi_report_luns(VSCSIState *s, vscsi_req *req) static int vscsi_queue_cmd(VSCSIState *s, vscsi_req *req) { - union srp_iu *srp = &req->iu.srp; + union srp_iu *srp = &req_iu(req)->srp; SCSIDevice *sdev; int n, lun; @@ -821,7 +826,7 @@ static int vscsi_queue_cmd(VSCSIState *s, vscsi_req *req) static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req) { - union viosrp_iu *iu = &req->iu; + union viosrp_iu *iu = req_iu(req); vscsi_req *tmpreq; int i, lun = 0, resp = SRP_TSK_MGMT_COMPLETE; SCSIDevice *d; @@ -831,7 +836,8 @@ static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req) fprintf(stderr, "vscsi_process_tsk_mgmt %02x\n", iu->srp.tsk_mgmt.tsk_mgmt_func); - d = vscsi_device_find(&s->bus, be64_to_cpu(req->iu.srp.tsk_mgmt.lun), &lun); + d = vscsi_device_find(&s->bus, + be64_to_cpu(req_iu(req)->srp.tsk_mgmt.lun), &lun); if (!d) { resp = SRP_TSK_MGMT_FIELDS_INVALID; } else { @@ -842,7 +848,7 @@ static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req) break; } - tmpreq = vscsi_find_req(s, req->iu.srp.tsk_mgmt.task_tag); + tmpreq = vscsi_find_req(s, req_iu(req)->srp.tsk_mgmt.task_tag); if (tmpreq && tmpreq->sreq) { assert(tmpreq->sreq->hba_private); scsi_req_cancel(tmpreq->sreq); @@ -867,7 +873,8 @@ static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req) for (i = 0; i < VSCSI_REQ_LIMIT; i++) { tmpreq = &s->reqs[i]; - if (tmpreq->iu.srp.cmd.lun != req->iu.srp.tsk_mgmt.lun) { + if (req_iu(tmpreq)->srp.cmd.lun + != req_iu(req)->srp.tsk_mgmt.lun) { continue; } if (!tmpreq->active || !tmpreq->sreq) { @@ -911,7 +918,7 @@ static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req) static int vscsi_handle_srp_req(VSCSIState *s, vscsi_req *req) { - union srp_iu *srp = &req->iu.srp; + union srp_iu *srp = &req_iu(req)->srp; int done = 1; uint8_t opcode = srp->rsp.opcode; @@ -948,7 +955,7 @@ static int vscsi_send_adapter_info(VSCSIState *s, vscsi_req *req) struct mad_adapter_info_data info; int rc; - sinfo = &req->iu.mad.adapter_info; + sinfo = &req_iu(req)->mad.adapter_info; #if 0 /* What for ? */ rc = spapr_vio_dma_read(&s->vdev, be64_to_cpu(sinfo->buffer), @@ -984,7 +991,7 @@ static int vscsi_send_capabilities(VSCSIState *s, vscsi_req *req) uint64_t buffer; int rc; - vcap = &req->iu.mad.capabilities; + vcap = &req_iu(req)->mad.capabilities; req_len = len = be16_to_cpu(vcap->common.length); buffer = be64_to_cpu(vcap->buffer); if (len > sizeof(cap)) { @@ -1029,7 +1036,7 @@ static int vscsi_send_capabilities(VSCSIState *s, vscsi_req *req) static int vscsi_handle_mad_req(VSCSIState *s, vscsi_req *req) { - union mad_iu *mad = &req->iu.mad; + union mad_iu *mad = &req_iu(req)->mad; bool request_handled = false; uint64_t retlen = 0; From patchwork Tue Mar 17 10:04:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442487 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C6419913 for ; Tue, 17 Mar 2020 10:25:56 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9CC54205ED for ; Tue, 17 Mar 2020 10:25:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="TtqEkIRI" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9CC54205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55914 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Q3-0006ms-OL for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:25:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45976) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE968-0001j9-Tr for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE967-0005lZ-Gw for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:20 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:43911 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE967-0002pG-5f; Tue, 17 Mar 2020 06:05:19 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKy1tGPz9sT9; Tue, 17 Mar 2020 21:04:38 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439478; bh=7Oc6dJy7mdLvgRsq59r4wXTl8bUk0MLKqWTXTRm3oTk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TtqEkIRIQtvxiAUC0ZN/ZKE28huXHZY6JAoB5ePi6a/zZBCKEBOdmCfE0NeOYjhxa Wl6x30ewA05+rFw/V5Y0gME2KlVUuUkZHjFs77V0Pfm8227gHXIeud8YMDv0ZzeiHZ Qq9TwrZ+RSEam3oZETXnBx0sLPS0tB75hbrClDlU= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 26/45] hw/scsi/spapr_vscsi: Do not mix SRP IU size with DMA buffer size Date: Tue, 17 Mar 2020 21:04:04 +1100 Message-Id: <20200317100423.622643-27-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Paolo Bonzini , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daudé The 'union srp_iu' is meant as a pointer to any SRP Information Unit type, it is not related to the size of a VIO DMA buffer. Use a plain buffer for the VIO DMA read/write calls. We can remove the reserved buffer from the 'union srp_iu'. This issue was noticed when replacing the zero-length arrays from hw/scsi/srp.h with flexible array member, 'clang -fsanitize=undefined' reported: hw/scsi/spapr_vscsi.c:69:29: error: field 'iu' with variable sized type 'union viosrp_iu' not at the end of a struct or class is a GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end] union viosrp_iu iu; ^ Signed-off-by: Philippe Mathieu-Daudé Message-Id: <20200305121253.19078-6-philmd@redhat.com> Reviewed-by: Paolo Bonzini Signed-off-by: David Gibson --- hw/scsi/spapr_vscsi.c | 10 +++++----- hw/scsi/viosrp.h | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index 70547f98ac..acf9bb50bc 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -66,7 +66,7 @@ typedef union vscsi_crq { typedef struct vscsi_req { vscsi_crq crq; - union viosrp_iu iu; + uint8_t viosrp_iu_buf[SRP_MAX_IU_LEN]; /* SCSI request tracking */ SCSIRequest *sreq; @@ -99,7 +99,7 @@ typedef struct { static union viosrp_iu *req_iu(vscsi_req *req) { - return &req->iu; + return (union viosrp_iu *)req->viosrp_iu_buf; } static struct vscsi_req *vscsi_get_req(VSCSIState *s) @@ -183,7 +183,7 @@ static int vscsi_send_iu(VSCSIState *s, vscsi_req *req, /* First copy the SRP */ rc = spapr_vio_dma_write(&s->vdev, req->crq.s.IU_data_ptr, - &req->iu, length); + &req->viosrp_iu_buf, length); if (rc) { fprintf(stderr, "vscsi_send_iu: DMA write failure !\n"); } @@ -602,7 +602,7 @@ static const VMStateDescription vmstate_spapr_vscsi_req = { .minimum_version_id = 1, .fields = (VMStateField[]) { VMSTATE_BUFFER(crq.raw, vscsi_req), - VMSTATE_BUFFER(iu.srp.reserved, vscsi_req), + VMSTATE_BUFFER(viosrp_iu_buf, vscsi_req), VMSTATE_UINT32(qtag, vscsi_req), VMSTATE_BOOL(active, vscsi_req), VMSTATE_UINT32(data_len, vscsi_req), @@ -1103,7 +1103,7 @@ static void vscsi_got_payload(VSCSIState *s, vscsi_crq *crq) } /* XXX Handle failure differently ? */ - if (spapr_vio_dma_read(&s->vdev, crq->s.IU_data_ptr, &req->iu, + if (spapr_vio_dma_read(&s->vdev, crq->s.IU_data_ptr, &req->viosrp_iu_buf, crq->s.IU_length)) { fprintf(stderr, "vscsi_got_payload: DMA read failure !\n"); vscsi_put_req(req); diff --git a/hw/scsi/viosrp.h b/hw/scsi/viosrp.h index 25676c2383..e5f9768e8f 100644 --- a/hw/scsi/viosrp.h +++ b/hw/scsi/viosrp.h @@ -49,7 +49,6 @@ union srp_iu { struct srp_tsk_mgmt tsk_mgmt; struct srp_cmd cmd; struct srp_rsp rsp; - uint8_t reserved[SRP_MAX_IU_LEN]; }; enum viosrp_crq_formats { From patchwork Tue Mar 17 10:04:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442417 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4BB701392 for ; Tue, 17 Mar 2020 10:14:02 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 22A44206EC for ; Tue, 17 Mar 2020 10:14:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="JV8mEeJU" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 22A44206EC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55658 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9EX-0001lD-AJ for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:14:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45541) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95r-0001Hw-Gb for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95o-0003c0-AX for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:03 -0400 Received: from ozlabs.org ([203.11.71.1]:32855) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95n-0002yq-Ro; Tue, 17 Mar 2020 06:05:00 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKy6Zkvz9sTG; Tue, 17 Mar 2020 21:04:38 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439478; bh=48ImQCW8f6mEY6ZIE+2mS92Voyx9RR4s4+J+AWbKKsE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JV8mEeJUaWZnmJTWDLFDYuiUyafhz2iW/RyH30kAC99/bHSmBQg+f3bWFgj2b9cPy 7P6MLbJ8ZVI1SY11uELvScltlh9YEPSJsRBZMy1u5fNcXyQTHemL6XgStw9V/ij8JS sO2UIq6PaJPsnHO2ULNRSHqfOhXYIOWWw7cuvaGE= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 27/45] hw/scsi/spapr_vscsi: Prevent buffer overflow Date: Tue, 17 Mar 2020 21:04:05 +1100 Message-Id: <20200317100423.622643-28-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Paolo Bonzini , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daudé Depending on the length of sense data, vscsi_send_rsp() can overrun the buffer size. Do not copy more than SRP_MAX_IU_DATA_LEN bytes, and assert that vscsi_send_iu() is always called with a size in range. Reported-by: Paolo Bonzini Suggested-by: Paolo Bonzini Signed-off-by: Philippe Mathieu-Daudé Message-Id: <20200305121253.19078-7-philmd@redhat.com> Reviewed-by: Paolo Bonzini Signed-off-by: David Gibson --- hw/scsi/spapr_vscsi.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index acf9bb50bc..c4c4f31170 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -55,6 +55,8 @@ #define VSCSI_MAX_SECTORS 4096 #define VSCSI_REQ_LIMIT 24 +/* Maximum size of a IU payload */ +#define SRP_MAX_IU_DATA_LEN (SRP_MAX_IU_LEN - sizeof(union srp_iu)) #define SRP_RSP_SENSE_DATA_LEN 18 #define SRP_REPORT_LUNS_WLUN 0xc10100000000000ULL @@ -181,6 +183,8 @@ static int vscsi_send_iu(VSCSIState *s, vscsi_req *req, { long rc, rc1; + assert(length <= SRP_MAX_IU_LEN); + /* First copy the SRP */ rc = spapr_vio_dma_write(&s->vdev, req->crq.s.IU_data_ptr, &req->viosrp_iu_buf, length); @@ -266,10 +270,12 @@ static int vscsi_send_rsp(VSCSIState *s, vscsi_req *req, if (status) { iu->srp.rsp.sol_not = (sol_not & 0x04) >> 2; if (req->senselen) { + int sense_data_len = MIN(req->senselen, SRP_MAX_IU_DATA_LEN); + iu->srp.rsp.flags |= SRP_RSP_FLAG_SNSVALID; - iu->srp.rsp.sense_data_len = cpu_to_be32(req->senselen); - memcpy(iu->srp.rsp.data, req->sense, req->senselen); - total_len += req->senselen; + iu->srp.rsp.sense_data_len = cpu_to_be32(sense_data_len); + memcpy(iu->srp.rsp.data, req->sense, sense_data_len); + total_len += sense_data_len; } } else { iu->srp.rsp.sol_not = (sol_not & 0x02) >> 1; @@ -896,6 +902,7 @@ static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req) } /* Compose the response here as */ + QEMU_BUILD_BUG_ON(SRP_MAX_IU_DATA_LEN < 4); memset(iu, 0, sizeof(struct srp_rsp) + 4); iu->srp.rsp.opcode = SRP_RSP; iu->srp.rsp.req_lim_delta = cpu_to_be32(1); From patchwork Tue Mar 17 10:04:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442449 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A202814B4 for ; Tue, 17 Mar 2020 10:18:43 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 78ED0206EC for ; Tue, 17 Mar 2020 10:18:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="k6YbDP7P" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 78ED0206EC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55756 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9J4-0001Rn-L8 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:18:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45975) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE968-0001j8-TU for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE967-0005mu-OK for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:20 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:51149 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE967-00030h-DZ; Tue, 17 Mar 2020 06:05:19 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKz4Hnbz9sTP; Tue, 17 Mar 2020 21:04:38 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439479; bh=D29V9qAZgS7/TrioIy7viFrcpIYypxn45k8+wQFRzEA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k6YbDP7Pm05r97t7GJLZslld2Wkl4m4Mo+Ki19SLRDO+CtLxxHOK+vof+dg0mhM6b uDRYgK92yv37BZIzAyd78B1lUi3zQdWa54LXOVxhFcHZwlEurWt1MiZ+wyaFik8QOD CO58mWfCemNGsYdhvTpI+ZXuq95g+h0ha1usLZZ4= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 28/45] hw/scsi/spapr_vscsi: Convert debug fprintf() to trace event Date: Tue, 17 Mar 2020 21:04:06 +1100 Message-Id: <20200317100423.622643-29-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Paolo Bonzini , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daudé Signed-off-by: Philippe Mathieu-Daudé Message-Id: <20200305121253.19078-8-philmd@redhat.com> Reviewed-by: Paolo Bonzini Signed-off-by: David Gibson --- hw/scsi/spapr_vscsi.c | 4 +--- hw/scsi/trace-events | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index c4c4f31170..923488beb2 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -839,9 +839,7 @@ static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req) uint64_t tag = iu->srp.rsp.tag; uint8_t sol_not = iu->srp.cmd.sol_not; - fprintf(stderr, "vscsi_process_tsk_mgmt %02x\n", - iu->srp.tsk_mgmt.tsk_mgmt_func); - + trace_spapr_vscsi_process_tsk_mgmt(iu->srp.tsk_mgmt.tsk_mgmt_func); d = vscsi_device_find(&s->bus, be64_to_cpu(req_iu(req)->srp.tsk_mgmt.lun), &lun); if (!d) { diff --git a/hw/scsi/trace-events b/hw/scsi/trace-events index b0820052f8..9a4a60ca63 100644 --- a/hw/scsi/trace-events +++ b/hw/scsi/trace-events @@ -227,6 +227,7 @@ spapr_vscsi_command_complete_status(uint32_t status) "Command complete err=%"PRI spapr_vscsi_save_request(uint32_t qtag, unsigned desc, unsigned offset) "saving tag=%"PRIu32", current desc#%u, offset=0x%x" spapr_vscsi_load_request(uint32_t qtag, unsigned desc, unsigned offset) "restoring tag=%"PRIu32", current desc#%u, offset=0x%x" spapr_vscsi_process_login(void) "Got login, sending response !" +spapr_vscsi_process_tsk_mgmt(uint8_t func) "tsk_mgmt_func 0x%02x" spapr_vscsi_queue_cmd_no_drive(uint64_t lun) "Command for lun 0x%08" PRIx64 " with no drive" spapr_vscsi_queue_cmd(uint32_t qtag, unsigned cdb, const char *cmd, int lun, int ret) "Queued command tag 0x%"PRIx32" CMD 0x%x=%s LUN %d ret: %d" spapr_vscsi_do_crq(unsigned c0, unsigned c1) "crq: %02x %02x ..." From patchwork Tue Mar 17 10:04:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442471 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 703DF913 for ; Tue, 17 Mar 2020 10:21:28 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4529820658 for ; Tue, 17 Mar 2020 10:21:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="jpSo3RZq" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4529820658 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55816 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Lj-0006rf-Bq for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:21:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46014) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96A-0001ku-0R for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE968-0005ul-OO for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:21 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:35837 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE968-0002yS-98; Tue, 17 Mar 2020 06:05:20 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKz1W4zz9sTM; Tue, 17 Mar 2020 21:04:38 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439479; bh=UKbkwRK7I1bLV959/gSC/rtFeiYnU4cghDHk8Er4hVE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jpSo3RZql7UljcEQwDrX8mYomfBCpGKDKHCn+gk/l2FNAOgLYGpLsLFx6Ugc8qwGO pPRb0xFpxK4Ih1YqJexipfHH+T1iHU+E/ZIYU2a6gOO4kPKzKdlQxKZKynBfRrsupS /cGumbvw1yYXEGTOZLg7kEtufo9pgrT8Unfsxlxs= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 29/45] spapr/xive: use SPAPR_IRQ_IPI to define IPI ranges exposed to the guest Date: Tue, 17 Mar 2020 21:04:07 +1100 Message-Id: <20200317100423.622643-30-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Cédric Le Goater The "ibm,xive-lisn-ranges" defines ranges of interrupt numbers that the guest can use to configure IPIs. It starts at 0 today but it could change to some other offset. Make clear which IRQ range we are exposing by using SPAPR_IRQ_IPI in the property definition. Signed-off-by: Cédric Le Goater Message-Id: <20200306123307.1348-1-clg@kaod.org> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/intc/spapr_xive.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c index 20c8155557..6608d7220a 100644 --- a/hw/intc/spapr_xive.c +++ b/hw/intc/spapr_xive.c @@ -677,8 +677,8 @@ static void spapr_xive_dt(SpaprInterruptController *intc, uint32_t nr_servers, uint64_t timas[2 * 2]; /* Interrupt number ranges for the IPIs */ uint32_t lisn_ranges[] = { - cpu_to_be32(0), - cpu_to_be32(nr_servers), + cpu_to_be32(SPAPR_IRQ_IPI), + cpu_to_be32(SPAPR_IRQ_IPI + nr_servers), }; /* * EQ size - the sizes of pages supported by the system 4K, 64K, From patchwork Tue Mar 17 10:04:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442495 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C671492A for ; Tue, 17 Mar 2020 10:31:07 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9C61C20663 for ; Tue, 17 Mar 2020 10:31:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="UQ+mM4JU" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9C61C20663 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:56127 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9V4-0006N9-Nq for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:31:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46415) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96P-0002Bz-Ai for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96O-0007ct-34 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:37 -0400 Received: from ozlabs.org ([203.11.71.1]:46565) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96N-0003xE-Me; Tue, 17 Mar 2020 06:05:36 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL039dLz9sTS; Tue, 17 Mar 2020 21:04:39 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439480; bh=SAXwkEjbnnAeuIlPrPLqPBmFdg7DXOMyP1ESLVuY0oE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UQ+mM4JUpVvLAwBbWygdDmgo69WCA/RGQIxlzAiPh9k8Mo9aWpOI/fuiNOF2kWvFq dkW7CXbrDrNNOpzgKDu/2VOfwXZMm6XL1v3JZUpRomINbNW/+XiUzLPHZ51YAmL/YW aUFP9FAH8NUao5jZD06RSKIeWa5v5OQHP204hPWo= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 30/45] target/ppc: Fix rlwinm on ppc64 Date: Tue, 17 Mar 2020 21:04:08 +1100 Message-Id: <20200317100423.622643-31-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, qemu-stable@nongnu.org, Richard Henderson , mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, Vitaly Chikunov , groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Vitaly Chikunov rlwinm cannot just AND with Mask if shift value is zero on ppc64 when Mask Begin is greater than Mask End and high bits are set to 1. Note that PowerISA 3.0B says that for `rlwinm' ROTL32 is used, and ROTL32 is defined (in 3.3.14) so that rotated value should have two copies of lower word of the source value. This seems to be another incarnation of the fix from 820724d170 ("target-ppc: Fix rlwimi, rlwinm, rlwnm again"), except I leave optimization when Mask value is less than 32 bits. Fixes: 7b4d326f47 ("target-ppc: Use the new deposit and extract ops") Cc: qemu-stable@nongnu.org Signed-off-by: Vitaly Chikunov Message-Id: <20200309204557.14836-1-vt@altlinux.org> Reviewed-by: Richard Henderson Signed-off-by: David Gibson --- target/ppc/translate.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/target/ppc/translate.c b/target/ppc/translate.c index 36fa27367c..127c82a24e 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -1938,15 +1938,17 @@ static void gen_rlwinm(DisasContext *ctx) me += 32; #endif mask = MASK(mb, me); - if (sh == 0) { - tcg_gen_andi_tl(t_ra, t_rs, mask); - } else if (mask <= 0xffffffffu) { - TCGv_i32 t0 = tcg_temp_new_i32(); - tcg_gen_trunc_tl_i32(t0, t_rs); - tcg_gen_rotli_i32(t0, t0, sh); - tcg_gen_andi_i32(t0, t0, mask); - tcg_gen_extu_i32_tl(t_ra, t0); - tcg_temp_free_i32(t0); + if (mask <= 0xffffffffu) { + if (sh == 0) { + tcg_gen_andi_tl(t_ra, t_rs, mask); + } else { + TCGv_i32 t0 = tcg_temp_new_i32(); + tcg_gen_trunc_tl_i32(t0, t_rs); + tcg_gen_rotli_i32(t0, t0, sh); + tcg_gen_andi_i32(t0, t0, mask); + tcg_gen_extu_i32_tl(t_ra, t0); + tcg_temp_free_i32(t0); + } } else { #if defined(TARGET_PPC64) tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32); From patchwork Tue Mar 17 10:04:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442479 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C0B46913 for ; Tue, 17 Mar 2020 10:23:30 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 983CD205ED for ; Tue, 17 Mar 2020 10:23:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="qInBKg/l" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 983CD205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55868 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Nh-0002hy-Nt for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:23:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45645) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE95u-0001NW-KF for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE95r-0003un-5k for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:06 -0400 Received: from ozlabs.org ([203.11.71.1]:53971) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE95q-0003ar-OO; Tue, 17 Mar 2020 06:05:03 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTKz6Bwbz9sTN; Tue, 17 Mar 2020 21:04:39 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439479; bh=FaXtE4aVP4kSFiv6Zc0QMgus3jnk/WUhyrbIvs+5kNs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qInBKg/lIeCK5dWDLkc9bQBu0Z8K0qJuHmIaHQdyNkBb2qHgWc2uHa/AUo7xzq4Jn F2dQCZYTUHFsXHgTzBUpLtbzhVNtUt28M/JUukhDPL2EO393dpCr56fGcaUxLYLfp5 yCd++BEwcY2pzwCFuW7cdp7FrsrYHPrV4lKM9mCg= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 31/45] ppc/spapr: Move GPRs setup to one place Date: Tue, 17 Mar 2020 21:04:09 +1100 Message-Id: <20200317100423.622643-32-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Alexey Kardashevskiy At the moment "pseries" starts in SLOF which only expects the FDT blob pointer in r3. As we are going to introduce a OpenFirmware support in QEMU, we will be booting OF clients directly and these expect a stack pointer in r1, Linux looks at r3/r4 for the initramdisk location (although vmlinux can find this from the device tree but zImage from distro kernels cannot). This extends spapr_cpu_set_entry_state() to take more registers. This should cause no behavioral change. Signed-off-by: Alexey Kardashevskiy Message-Id: <20200310050733.29805-2-aik@ozlabs.ru> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr.c | 2 +- hw/ppc/spapr_cpu_core.c | 6 +++++- hw/ppc/spapr_rtas.c | 2 +- include/hw/ppc/spapr_cpu_core.h | 4 +++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 1950fc303e..1038420c4a 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1698,7 +1698,7 @@ static void spapr_machine_reset(MachineState *machine) spapr->fdt_blob = fdt; /* Set up the entry state */ - spapr_cpu_set_entry_state(first_ppc_cpu, SPAPR_ENTRY_POINT, fdt_addr); + spapr_cpu_set_entry_state(first_ppc_cpu, SPAPR_ENTRY_POINT, 0, fdt_addr, 0); first_ppc_cpu->env.gpr[5] = 0; spapr->cas_reboot = false; diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index 36ed3a2b66..ac1c109427 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -76,13 +76,17 @@ static void spapr_reset_vcpu(PowerPCCPU *cpu) spapr_irq_cpu_intc_reset(spapr, cpu); } -void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, target_ulong r3) +void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, + target_ulong r1, target_ulong r3, + target_ulong r4) { PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); CPUPPCState *env = &cpu->env; env->nip = nip; + env->gpr[1] = r1; env->gpr[3] = r3; + env->gpr[4] = r4; kvmppc_set_reg_ppc_online(cpu, 1); CPU(cpu)->halted = 0; /* Enable Power-saving mode Exit Cause exceptions */ diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 656fdd2216..fe83b50c66 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -190,7 +190,7 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, SpaprMachineState *spapr, */ newcpu->env.tb_env->tb_offset = callcpu->env.tb_env->tb_offset; - spapr_cpu_set_entry_state(newcpu, start, r3); + spapr_cpu_set_entry_state(newcpu, start, 0, r3, 0); qemu_cpu_kick(CPU(newcpu)); diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_core.h index 1c4cc6559c..7aed8f555b 100644 --- a/include/hw/ppc/spapr_cpu_core.h +++ b/include/hw/ppc/spapr_cpu_core.h @@ -40,7 +40,9 @@ typedef struct SpaprCpuCoreClass { } SpaprCpuCoreClass; const char *spapr_get_cpu_core_type(const char *cpu_type); -void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, target_ulong r3); +void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, + target_ulong r1, target_ulong r3, + target_ulong r4); typedef struct SpaprCpuState { uint64_t vpa_addr; From patchwork Tue Mar 17 10:04:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442489 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E304B913 for ; Tue, 17 Mar 2020 10:27:05 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7532E205ED for ; Tue, 17 Mar 2020 10:27:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="BRvGxesg" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7532E205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55928 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9RA-000070-JH for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:27:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46409) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96P-0002Bq-7s for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96E-0006RM-6O for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:37 -0400 Received: from ozlabs.org ([203.11.71.1]:39765) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96C-0003f5-RD; Tue, 17 Mar 2020 06:05:26 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL015Rxz9sTR; Tue, 17 Mar 2020 21:04:39 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439480; bh=Fjki+hWC0Jaqo84diV7gveqf53k42Err4nZmrwJkG+c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BRvGxesggf+oRzvrRlMwYTTc45epnNikQdfwHFr8jCL5ErlpBYjOcWfUS73NlMmbA 3jXurkkKBaDSN4r7dzsL1J3ZBECpoA4Trtq8VdqNgMaZ/ObIFq6aTEWEhwmnG7TVpk TR83im+JOyoUkf4zB2XCAj/nk+ud7BWBzSRHR338= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 32/45] pseries: Update SLOF firmware image Date: Tue, 17 Mar 2020 21:04:10 +1100 Message-Id: <20200317100423.622643-33-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Alexey Kardashevskiy This mainly fixes virtio-serial with and without enabled iommu-platform. The full list of changes is: Alexey Kardashevskiy (3): llfw: Fix debug printf warnings virtio-serial: Close device completely version: update to 20200312 Cédric Le Goater (1): virtio: Fix typo in virtio_serial_init() Greg Kurz (2): virtio-serial: Don't override some words virtio-serial: Rework shutdown sequence Signed-off-by: Alexey Kardashevskiy Signed-off-by: David Gibson --- pc-bios/README | 2 +- pc-bios/slof.bin | Bin 968616 -> 968848 bytes roms/SLOF | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pc-bios/README b/pc-bios/README index a71fb318b3..bab0e8ec1a 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -14,7 +14,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/aik/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20200221. + built from git tag qemu-slof-20200312. - sgabios (the Serial Graphics Adapter option ROM) provides a means for legacy x86 software to communicate with an attached serial console as diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index 1c5948561639cfe244ad5d60506050ddb0c9b5b2..b87353befa2ec0de2ef405dd1fd89c616f4f054e 100644 GIT binary patch delta 151063 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�Hg6IC@h;sN8Dp@ESZvoXW)WwJkBIM2gTT*WO2jj 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®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 delta 150546 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

sYOi~ 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 F{RQN(^11*3 diff --git a/roms/SLOF b/roms/SLOF index 7c98b3b613..8d4033d0d2 160000 --- a/roms/SLOF +++ b/roms/SLOF @@ -1 +1 @@ -Subproject commit 7c98b3b613338a385722a953517349664aa4f532 +Subproject commit 8d4033d0d2e5b434fe14a81d5192cdb1911469e4 From patchwork Tue Mar 17 10:04:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442481 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A710414B4 for ; Tue, 17 Mar 2020 10:24:13 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7E96C205ED for ; Tue, 17 Mar 2020 10:24:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="BdEcvAiL" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7E96C205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55876 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9OO-00042a-Lk for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:24:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46525) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96T-0002JQ-GG for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96S-0008AZ-3q for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:41 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:39649 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96R-0005bs-OR; Tue, 17 Mar 2020 06:05:40 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL070bTz9sTW; Tue, 17 Mar 2020 21:04:40 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439480; bh=oiZ3JZYRTp5ngIchAz0dmXK42fd85g4mCvyBpTXbBeM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BdEcvAiLfudgqFFJJFolwfh7oKjpjtDE2/kA0wOMl09hz/FyVz4QGwfy5mC4WsbB1 BlqfJjji1B4nKJWb/sNYf/hNH//N1SG4zChNnpBF3fK0VLRXFkCAx5cj+owyzehUSo +nRPRyw1IQdfMNm6Osphnx8MAy1kyArRSfvN7+6U= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 33/45] spapr/rtas: Reserve space for RTAS blob and log Date: Tue, 17 Mar 2020 21:04:11 +1100 Message-Id: <20200317100423.622643-34-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Alexey Kardashevskiy At the moment SLOF reserves space for RTAS and instantiates the RTAS blob which is 20 bytes binary blob calling an hypercall. The rest of the RTAS area is a log which SLOF has no idea about but QEMU does. This moves RTAS sizing to QEMU and this overrides the size from SLOF. The only remaining problem is that SLOF copies the number of bytes it reserved (2KB for now) so QEMU needs to reserve at least this much; SLOF will be fixed separately to check that rtas-size from QEMU is enough for those 20 bytes for the H_RTAS hcall. Signed-off-by: Alexey Kardashevskiy Message-Id: <20200316011841.99970-1-aik@ozlabs.ru> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr.c | 1 + include/hw/ppc/spapr.h | 1 + 2 files changed, 2 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 1038420c4a..2f9a65b414 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -967,6 +967,7 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt) _FDT(fdt_setprop(fdt, rtas, "ibm,max-associativity-domains", maxdomains, sizeof(maxdomains))); + _FDT(fdt_setprop_cell(fdt, rtas, "rtas-size", RTAS_SIZE)); _FDT(fdt_setprop_cell(fdt, rtas, "rtas-error-log-max", RTAS_ERROR_LOG_MAX)); _FDT(fdt_setprop_cell(fdt, rtas, "rtas-event-scan-rate", diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 2015e37ac5..35b489a549 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -736,6 +736,7 @@ void spapr_load_rtas(SpaprMachineState *spapr, void *fdt, hwaddr addr); #define SPAPR_IS_PCI_LIOBN(liobn) (!!((liobn) & 0x80000000)) #define SPAPR_PCI_DMA_WINDOW_NUM(liobn) ((liobn) & 0xff) +#define RTAS_SIZE 2048 #define RTAS_ERROR_LOG_MAX 2048 /* Offset from rtas-base where error log is placed */ From patchwork Tue Mar 17 10:04:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442493 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 62ED21820 for ; Tue, 17 Mar 2020 10:30:01 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 02AFE20663 for ; Tue, 17 Mar 2020 10:30:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="alYwWJ4q" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 02AFE20663 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:56084 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9U0-0004d2-4z for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:30:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46665) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96Y-0002SD-27 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96U-0008QH-4T for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:45 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:42435 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96T-0005nt-GC; Tue, 17 Mar 2020 06:05:42 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL119HHz9sTT; Tue, 17 Mar 2020 21:04:40 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439481; bh=FhepqqVZ6pumuQdjmbFwm45Zhnxo3XugrtWy+4DrEk8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=alYwWJ4qADrfZPoi/IidrztK0XqesGkN/9Jkzs7YPaqrHlFlPtxL+INWdDXM+YbFh 925tG6TsYUebjSGCQMaEvzoOvjuFrYmimvCnSIic2Yb6gvT/VwMTaktVWphpsPaF2d hQpAfoQWbWezw1KpNPQoR9Z8VRzyg/ssvigsUytE= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 34/45] spapr: Move creation of ibm, dynamic-reconfiguration-memory dt node Date: Tue, 17 Mar 2020 21:04:12 +1100 Message-Id: <20200317100423.622643-35-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Currently this node with information about hotpluggable memory is created from spapr_dt_cas_updates(). But that's just a hangover from when we created it only as a diff to the device tree at CAS time. Now that we fully rebuild the DT as CAS time, it makes more sense to create this along with the rest of the memory information in the device tree. So, move it to spapr_populate_memory(). The patch is huge, but it's nearly all just code motion. Signed-off-by: David Gibson Reviewed-by: Greg Kurz --- hw/ppc/spapr.c | 512 +++++++++++++++++++++++++------------------------ 1 file changed, 257 insertions(+), 255 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 2f9a65b414..5e938833f3 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -341,257 +341,6 @@ static int spapr_populate_memory_node(void *fdt, int nodeid, hwaddr start, return off; } -static int spapr_populate_memory(SpaprMachineState *spapr, void *fdt) -{ - MachineState *machine = MACHINE(spapr); - hwaddr mem_start, node_size; - int i, nb_nodes = machine->numa_state->num_nodes; - NodeInfo *nodes = machine->numa_state->nodes; - - for (i = 0, mem_start = 0; i < nb_nodes; ++i) { - if (!nodes[i].node_mem) { - continue; - } - if (mem_start >= machine->ram_size) { - node_size = 0; - } else { - node_size = nodes[i].node_mem; - if (node_size > machine->ram_size - mem_start) { - node_size = machine->ram_size - mem_start; - } - } - if (!mem_start) { - /* spapr_machine_init() checks for rma_size <= node0_size - * already */ - spapr_populate_memory_node(fdt, i, 0, spapr->rma_size); - mem_start += spapr->rma_size; - node_size -= spapr->rma_size; - } - for ( ; node_size; ) { - hwaddr sizetmp = pow2floor(node_size); - - /* mem_start != 0 here */ - if (ctzl(mem_start) < ctzl(sizetmp)) { - sizetmp = 1ULL << ctzl(mem_start); - } - - spapr_populate_memory_node(fdt, i, mem_start, sizetmp); - node_size -= sizetmp; - mem_start += sizetmp; - } - } - - return 0; -} - -static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset, - SpaprMachineState *spapr) -{ - MachineState *ms = MACHINE(spapr); - PowerPCCPU *cpu = POWERPC_CPU(cs); - CPUPPCState *env = &cpu->env; - PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs); - int index = spapr_get_vcpu_id(cpu); - uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40), - 0xffffffff, 0xffffffff}; - uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() - : SPAPR_TIMEBASE_FREQ; - uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000; - uint32_t page_sizes_prop[64]; - size_t page_sizes_prop_size; - unsigned int smp_threads = ms->smp.threads; - uint32_t vcpus_per_socket = smp_threads * ms->smp.cores; - uint32_t pft_size_prop[] = {0, cpu_to_be32(spapr->htab_shift)}; - int compat_smt = MIN(smp_threads, ppc_compat_max_vthreads(cpu)); - SpaprDrc *drc; - int drc_index; - uint32_t radix_AP_encodings[PPC_PAGE_SIZES_MAX_SZ]; - int i; - - drc = spapr_drc_by_id(TYPE_SPAPR_DRC_CPU, index); - if (drc) { - drc_index = spapr_drc_index(drc); - _FDT((fdt_setprop_cell(fdt, offset, "ibm,my-drc-index", drc_index))); - } - - _FDT((fdt_setprop_cell(fdt, offset, "reg", index))); - _FDT((fdt_setprop_string(fdt, offset, "device_type", "cpu"))); - - _FDT((fdt_setprop_cell(fdt, offset, "cpu-version", env->spr[SPR_PVR]))); - _FDT((fdt_setprop_cell(fdt, offset, "d-cache-block-size", - env->dcache_line_size))); - _FDT((fdt_setprop_cell(fdt, offset, "d-cache-line-size", - env->dcache_line_size))); - _FDT((fdt_setprop_cell(fdt, offset, "i-cache-block-size", - env->icache_line_size))); - _FDT((fdt_setprop_cell(fdt, offset, "i-cache-line-size", - env->icache_line_size))); - - if (pcc->l1_dcache_size) { - _FDT((fdt_setprop_cell(fdt, offset, "d-cache-size", - pcc->l1_dcache_size))); - } else { - warn_report("Unknown L1 dcache size for cpu"); - } - if (pcc->l1_icache_size) { - _FDT((fdt_setprop_cell(fdt, offset, "i-cache-size", - pcc->l1_icache_size))); - } else { - warn_report("Unknown L1 icache size for cpu"); - } - - _FDT((fdt_setprop_cell(fdt, offset, "timebase-frequency", tbfreq))); - _FDT((fdt_setprop_cell(fdt, offset, "clock-frequency", cpufreq))); - _FDT((fdt_setprop_cell(fdt, offset, "slb-size", cpu->hash64_opts->slb_size))); - _FDT((fdt_setprop_cell(fdt, offset, "ibm,slb-size", cpu->hash64_opts->slb_size))); - _FDT((fdt_setprop_string(fdt, offset, "status", "okay"))); - _FDT((fdt_setprop(fdt, offset, "64-bit", NULL, 0))); - - if (env->spr_cb[SPR_PURR].oea_read) { - _FDT((fdt_setprop_cell(fdt, offset, "ibm,purr", 1))); - } - if (env->spr_cb[SPR_SPURR].oea_read) { - _FDT((fdt_setprop_cell(fdt, offset, "ibm,spurr", 1))); - } - - if (ppc_hash64_has(cpu, PPC_HASH64_1TSEG)) { - _FDT((fdt_setprop(fdt, offset, "ibm,processor-segment-sizes", - segs, sizeof(segs)))); - } - - /* Advertise VSX (vector extensions) if available - * 1 == VMX / Altivec available - * 2 == VSX available - * - * Only CPUs for which we create core types in spapr_cpu_core.c - * are possible, and all of those have VMX */ - if (spapr_get_cap(spapr, SPAPR_CAP_VSX) != 0) { - _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 2))); - } else { - _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 1))); - } - - /* Advertise DFP (Decimal Floating Point) if available - * 0 / no property == no DFP - * 1 == DFP available */ - if (spapr_get_cap(spapr, SPAPR_CAP_DFP) != 0) { - _FDT((fdt_setprop_cell(fdt, offset, "ibm,dfp", 1))); - } - - page_sizes_prop_size = ppc_create_page_sizes_prop(cpu, page_sizes_prop, - sizeof(page_sizes_prop)); - if (page_sizes_prop_size) { - _FDT((fdt_setprop(fdt, offset, "ibm,segment-page-sizes", - page_sizes_prop, page_sizes_prop_size))); - } - - spapr_populate_pa_features(spapr, cpu, fdt, offset); - - _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id", - cs->cpu_index / vcpus_per_socket))); - - _FDT((fdt_setprop(fdt, offset, "ibm,pft-size", - pft_size_prop, sizeof(pft_size_prop)))); - - if (ms->numa_state->num_nodes > 1) { - _FDT(spapr_fixup_cpu_numa_dt(fdt, offset, cpu)); - } - - _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu, compat_smt)); - - if (pcc->radix_page_info) { - for (i = 0; i < pcc->radix_page_info->count; i++) { - radix_AP_encodings[i] = - cpu_to_be32(pcc->radix_page_info->entries[i]); - } - _FDT((fdt_setprop(fdt, offset, "ibm,processor-radix-AP-encodings", - radix_AP_encodings, - pcc->radix_page_info->count * - sizeof(radix_AP_encodings[0])))); - } - - /* - * We set this property to let the guest know that it can use the large - * decrementer and its width in bits. - */ - if (spapr_get_cap(spapr, SPAPR_CAP_LARGE_DECREMENTER) != SPAPR_CAP_OFF) - _FDT((fdt_setprop_u32(fdt, offset, "ibm,dec-bits", - pcc->lrg_decr_bits))); -} - -static void spapr_populate_cpus_dt_node(void *fdt, SpaprMachineState *spapr) -{ - CPUState **rev; - CPUState *cs; - int n_cpus; - int cpus_offset; - char *nodename; - int i; - - cpus_offset = fdt_add_subnode(fdt, 0, "cpus"); - _FDT(cpus_offset); - _FDT((fdt_setprop_cell(fdt, cpus_offset, "#address-cells", 0x1))); - _FDT((fdt_setprop_cell(fdt, cpus_offset, "#size-cells", 0x0))); - - /* - * We walk the CPUs in reverse order to ensure that CPU DT nodes - * created by fdt_add_subnode() end up in the right order in FDT - * for the guest kernel the enumerate the CPUs correctly. - * - * The CPU list cannot be traversed in reverse order, so we need - * to do extra work. - */ - n_cpus = 0; - rev = NULL; - CPU_FOREACH(cs) { - rev = g_renew(CPUState *, rev, n_cpus + 1); - rev[n_cpus++] = cs; - } - - for (i = n_cpus - 1; i >= 0; i--) { - CPUState *cs = rev[i]; - PowerPCCPU *cpu = POWERPC_CPU(cs); - int index = spapr_get_vcpu_id(cpu); - DeviceClass *dc = DEVICE_GET_CLASS(cs); - int offset; - - if (!spapr_is_thread0_in_vcore(spapr, cpu)) { - continue; - } - - nodename = g_strdup_printf("%s@%x", dc->fw_name, index); - offset = fdt_add_subnode(fdt, cpus_offset, nodename); - g_free(nodename); - _FDT(offset); - spapr_populate_cpu_dt(cs, fdt, offset, spapr); - } - - g_free(rev); -} - -static int spapr_rng_populate_dt(void *fdt) -{ - int node; - int ret; - - node = qemu_fdt_add_subnode(fdt, "/ibm,platform-facilities"); - if (node <= 0) { - return -1; - } - ret = fdt_setprop_string(fdt, node, "device_type", - "ibm,platform-facilities"); - ret |= fdt_setprop_cell(fdt, node, "#address-cells", 0x1); - ret |= fdt_setprop_cell(fdt, node, "#size-cells", 0x0); - - node = fdt_add_subnode(fdt, node, "ibm,random-v1"); - if (node <= 0) { - return -1; - } - ret |= fdt_setprop_string(fdt, node, "compatible", "ibm,random"); - - return ret ? -1 : 0; -} - static uint32_t spapr_pc_dimm_node(MemoryDeviceInfoList *list, ram_addr_t addr) { MemoryDeviceInfoList *info; @@ -877,14 +626,51 @@ static int spapr_populate_drconf_memory(SpaprMachineState *spapr, void *fdt) return ret; } -static int spapr_dt_cas_updates(SpaprMachineState *spapr, void *fdt, - SpaprOptionVector *ov5_updates) +static int spapr_populate_memory(SpaprMachineState *spapr, void *fdt) { + MachineState *machine = MACHINE(spapr); SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr); - int ret = 0, offset; + hwaddr mem_start, node_size; + int i, nb_nodes = machine->numa_state->num_nodes; + NodeInfo *nodes = machine->numa_state->nodes; + + for (i = 0, mem_start = 0; i < nb_nodes; ++i) { + if (!nodes[i].node_mem) { + continue; + } + if (mem_start >= machine->ram_size) { + node_size = 0; + } else { + node_size = nodes[i].node_mem; + if (node_size > machine->ram_size - mem_start) { + node_size = machine->ram_size - mem_start; + } + } + if (!mem_start) { + /* spapr_machine_init() checks for rma_size <= node0_size + * already */ + spapr_populate_memory_node(fdt, i, 0, spapr->rma_size); + mem_start += spapr->rma_size; + node_size -= spapr->rma_size; + } + for ( ; node_size; ) { + hwaddr sizetmp = pow2floor(node_size); + + /* mem_start != 0 here */ + if (ctzl(mem_start) < ctzl(sizetmp)) { + sizetmp = 1ULL << ctzl(mem_start); + } + + spapr_populate_memory_node(fdt, i, mem_start, sizetmp); + node_size -= sizetmp; + mem_start += sizetmp; + } + } /* Generate ibm,dynamic-reconfiguration-memory node if required */ - if (spapr_ovec_test(ov5_updates, OV5_DRCONF_MEMORY)) { + if (spapr_ovec_test(spapr->ov5_cas, OV5_DRCONF_MEMORY)) { + int ret; + g_assert(smc->dr_lmb_enabled); ret = spapr_populate_drconf_memory(spapr, fdt); if (ret) { @@ -892,6 +678,222 @@ static int spapr_dt_cas_updates(SpaprMachineState *spapr, void *fdt, } } + return 0; +} + +static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset, + SpaprMachineState *spapr) +{ + MachineState *ms = MACHINE(spapr); + PowerPCCPU *cpu = POWERPC_CPU(cs); + CPUPPCState *env = &cpu->env; + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs); + int index = spapr_get_vcpu_id(cpu); + uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40), + 0xffffffff, 0xffffffff}; + uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() + : SPAPR_TIMEBASE_FREQ; + uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000; + uint32_t page_sizes_prop[64]; + size_t page_sizes_prop_size; + unsigned int smp_threads = ms->smp.threads; + uint32_t vcpus_per_socket = smp_threads * ms->smp.cores; + uint32_t pft_size_prop[] = {0, cpu_to_be32(spapr->htab_shift)}; + int compat_smt = MIN(smp_threads, ppc_compat_max_vthreads(cpu)); + SpaprDrc *drc; + int drc_index; + uint32_t radix_AP_encodings[PPC_PAGE_SIZES_MAX_SZ]; + int i; + + drc = spapr_drc_by_id(TYPE_SPAPR_DRC_CPU, index); + if (drc) { + drc_index = spapr_drc_index(drc); + _FDT((fdt_setprop_cell(fdt, offset, "ibm,my-drc-index", drc_index))); + } + + _FDT((fdt_setprop_cell(fdt, offset, "reg", index))); + _FDT((fdt_setprop_string(fdt, offset, "device_type", "cpu"))); + + _FDT((fdt_setprop_cell(fdt, offset, "cpu-version", env->spr[SPR_PVR]))); + _FDT((fdt_setprop_cell(fdt, offset, "d-cache-block-size", + env->dcache_line_size))); + _FDT((fdt_setprop_cell(fdt, offset, "d-cache-line-size", + env->dcache_line_size))); + _FDT((fdt_setprop_cell(fdt, offset, "i-cache-block-size", + env->icache_line_size))); + _FDT((fdt_setprop_cell(fdt, offset, "i-cache-line-size", + env->icache_line_size))); + + if (pcc->l1_dcache_size) { + _FDT((fdt_setprop_cell(fdt, offset, "d-cache-size", + pcc->l1_dcache_size))); + } else { + warn_report("Unknown L1 dcache size for cpu"); + } + if (pcc->l1_icache_size) { + _FDT((fdt_setprop_cell(fdt, offset, "i-cache-size", + pcc->l1_icache_size))); + } else { + warn_report("Unknown L1 icache size for cpu"); + } + + _FDT((fdt_setprop_cell(fdt, offset, "timebase-frequency", tbfreq))); + _FDT((fdt_setprop_cell(fdt, offset, "clock-frequency", cpufreq))); + _FDT((fdt_setprop_cell(fdt, offset, "slb-size", cpu->hash64_opts->slb_size))); + _FDT((fdt_setprop_cell(fdt, offset, "ibm,slb-size", cpu->hash64_opts->slb_size))); + _FDT((fdt_setprop_string(fdt, offset, "status", "okay"))); + _FDT((fdt_setprop(fdt, offset, "64-bit", NULL, 0))); + + if (env->spr_cb[SPR_PURR].oea_read) { + _FDT((fdt_setprop_cell(fdt, offset, "ibm,purr", 1))); + } + if (env->spr_cb[SPR_SPURR].oea_read) { + _FDT((fdt_setprop_cell(fdt, offset, "ibm,spurr", 1))); + } + + if (ppc_hash64_has(cpu, PPC_HASH64_1TSEG)) { + _FDT((fdt_setprop(fdt, offset, "ibm,processor-segment-sizes", + segs, sizeof(segs)))); + } + + /* Advertise VSX (vector extensions) if available + * 1 == VMX / Altivec available + * 2 == VSX available + * + * Only CPUs for which we create core types in spapr_cpu_core.c + * are possible, and all of those have VMX */ + if (spapr_get_cap(spapr, SPAPR_CAP_VSX) != 0) { + _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 2))); + } else { + _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 1))); + } + + /* Advertise DFP (Decimal Floating Point) if available + * 0 / no property == no DFP + * 1 == DFP available */ + if (spapr_get_cap(spapr, SPAPR_CAP_DFP) != 0) { + _FDT((fdt_setprop_cell(fdt, offset, "ibm,dfp", 1))); + } + + page_sizes_prop_size = ppc_create_page_sizes_prop(cpu, page_sizes_prop, + sizeof(page_sizes_prop)); + if (page_sizes_prop_size) { + _FDT((fdt_setprop(fdt, offset, "ibm,segment-page-sizes", + page_sizes_prop, page_sizes_prop_size))); + } + + spapr_populate_pa_features(spapr, cpu, fdt, offset); + + _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id", + cs->cpu_index / vcpus_per_socket))); + + _FDT((fdt_setprop(fdt, offset, "ibm,pft-size", + pft_size_prop, sizeof(pft_size_prop)))); + + if (ms->numa_state->num_nodes > 1) { + _FDT(spapr_fixup_cpu_numa_dt(fdt, offset, cpu)); + } + + _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu, compat_smt)); + + if (pcc->radix_page_info) { + for (i = 0; i < pcc->radix_page_info->count; i++) { + radix_AP_encodings[i] = + cpu_to_be32(pcc->radix_page_info->entries[i]); + } + _FDT((fdt_setprop(fdt, offset, "ibm,processor-radix-AP-encodings", + radix_AP_encodings, + pcc->radix_page_info->count * + sizeof(radix_AP_encodings[0])))); + } + + /* + * We set this property to let the guest know that it can use the large + * decrementer and its width in bits. + */ + if (spapr_get_cap(spapr, SPAPR_CAP_LARGE_DECREMENTER) != SPAPR_CAP_OFF) + _FDT((fdt_setprop_u32(fdt, offset, "ibm,dec-bits", + pcc->lrg_decr_bits))); +} + +static void spapr_populate_cpus_dt_node(void *fdt, SpaprMachineState *spapr) +{ + CPUState **rev; + CPUState *cs; + int n_cpus; + int cpus_offset; + char *nodename; + int i; + + cpus_offset = fdt_add_subnode(fdt, 0, "cpus"); + _FDT(cpus_offset); + _FDT((fdt_setprop_cell(fdt, cpus_offset, "#address-cells", 0x1))); + _FDT((fdt_setprop_cell(fdt, cpus_offset, "#size-cells", 0x0))); + + /* + * We walk the CPUs in reverse order to ensure that CPU DT nodes + * created by fdt_add_subnode() end up in the right order in FDT + * for the guest kernel the enumerate the CPUs correctly. + * + * The CPU list cannot be traversed in reverse order, so we need + * to do extra work. + */ + n_cpus = 0; + rev = NULL; + CPU_FOREACH(cs) { + rev = g_renew(CPUState *, rev, n_cpus + 1); + rev[n_cpus++] = cs; + } + + for (i = n_cpus - 1; i >= 0; i--) { + CPUState *cs = rev[i]; + PowerPCCPU *cpu = POWERPC_CPU(cs); + int index = spapr_get_vcpu_id(cpu); + DeviceClass *dc = DEVICE_GET_CLASS(cs); + int offset; + + if (!spapr_is_thread0_in_vcore(spapr, cpu)) { + continue; + } + + nodename = g_strdup_printf("%s@%x", dc->fw_name, index); + offset = fdt_add_subnode(fdt, cpus_offset, nodename); + g_free(nodename); + _FDT(offset); + spapr_populate_cpu_dt(cs, fdt, offset, spapr); + } + + g_free(rev); +} + +static int spapr_rng_populate_dt(void *fdt) +{ + int node; + int ret; + + node = qemu_fdt_add_subnode(fdt, "/ibm,platform-facilities"); + if (node <= 0) { + return -1; + } + ret = fdt_setprop_string(fdt, node, "device_type", + "ibm,platform-facilities"); + ret |= fdt_setprop_cell(fdt, node, "#address-cells", 0x1); + ret |= fdt_setprop_cell(fdt, node, "#size-cells", 0x0); + + node = fdt_add_subnode(fdt, node, "ibm,random-v1"); + if (node <= 0) { + return -1; + } + ret |= fdt_setprop_string(fdt, node, "compatible", "ibm,random"); + + return ret ? -1 : 0; +} + +static int spapr_dt_cas_updates(SpaprMachineState *spapr, void *fdt, + SpaprOptionVector *ov5_updates) +{ + int offset; + offset = fdt_path_offset(fdt, "/chosen"); if (offset < 0) { offset = fdt_add_subnode(fdt, 0, "chosen"); From patchwork Tue Mar 17 10:04:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442505 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 678BB913 for ; Tue, 17 Mar 2020 10:33:44 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3E16B20663 for ; Tue, 17 Mar 2020 10:33:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="QqAN9nmD" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3E16B20663 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:56188 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Xb-0001ht-CK for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:33:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46540) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96T-0002K8-Tv for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96S-0008A1-0w for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:41 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:47397 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96R-0005aq-Kq; Tue, 17 Mar 2020 06:05:39 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL05lgtz9sTQ; Tue, 17 Mar 2020 21:04:40 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439480; bh=KT5ze/+yN+LYC+I7poQ2KhjH7DVbMMJtLwam/nRyiCk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QqAN9nmD9i2Ily7p6eYGvvr65Aq/cr/YQbXfpcrPSV+6Q03Leze3rHbqD5rkUWZZw I1y4FwDtPVZcL9wi7F/l5shL4owHr4J8P7rcv6egf+4szAaBsNfB7sp8Qox+K89k37 MGln+mvvjtrVXX2W3hZXLETW7YwjlhreI076b5eY= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 35/45] spapr: Move creation of ibm,architecture-vec-5 property Date: Tue, 17 Mar 2020 21:04:13 +1100 Message-Id: <20200317100423.622643-36-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" This is currently called from spapr_dt_cas_updates() which is a hang over from when we created this only as a diff to the DT at CAS time. Now that we fully rebuild the DT at CAS time, just create it along with the rest of the properties in /chosen. Signed-off-by: David Gibson Reviewed-by: Greg Kurz --- hw/ppc/spapr.c | 144 ++++++++++++++++++++++--------------------------- 1 file changed, 65 insertions(+), 79 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 5e938833f3..aff8c87fad 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -889,22 +889,6 @@ static int spapr_rng_populate_dt(void *fdt) return ret ? -1 : 0; } -static int spapr_dt_cas_updates(SpaprMachineState *spapr, void *fdt, - SpaprOptionVector *ov5_updates) -{ - int offset; - - offset = fdt_path_offset(fdt, "/chosen"); - if (offset < 0) { - offset = fdt_add_subnode(fdt, 0, "chosen"); - if (offset < 0) { - return offset; - } - } - return spapr_ovec_populate_dt(fdt, offset, spapr->ov5_cas, - "ibm,architecture-vec-5"); -} - static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt) { MachineState *ms = MACHINE(spapr); @@ -1043,81 +1027,92 @@ static void spapr_dt_ov5_platform_support(SpaprMachineState *spapr, void *fdt, val, sizeof(val))); } -static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt) +static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset) { MachineState *machine = MACHINE(spapr); SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine); int chosen; - const char *boot_device = machine->boot_order; - char *stdout_path = spapr_vio_stdout_path(spapr->vio_bus); - size_t cb = 0; - char *bootlist = get_boot_devices_list(&cb); _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen")); - if (machine->kernel_cmdline && machine->kernel_cmdline[0]) { - _FDT(fdt_setprop_string(fdt, chosen, "bootargs", - machine->kernel_cmdline)); - } - if (spapr->initrd_size) { - _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-start", - spapr->initrd_base)); - _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-end", - spapr->initrd_base + spapr->initrd_size)); - } + if (reset) { + const char *boot_device = machine->boot_order; + char *stdout_path = spapr_vio_stdout_path(spapr->vio_bus); + size_t cb = 0; + char *bootlist = get_boot_devices_list(&cb); + + if (machine->kernel_cmdline && machine->kernel_cmdline[0]) { + _FDT(fdt_setprop_string(fdt, chosen, "bootargs", + machine->kernel_cmdline)); + } - if (spapr->kernel_size) { - uint64_t kprop[2] = { cpu_to_be64(spapr->kernel_addr), - cpu_to_be64(spapr->kernel_size) }; + if (spapr->initrd_size) { + _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-start", + spapr->initrd_base)); + _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-end", + spapr->initrd_base + spapr->initrd_size)); + } + + if (spapr->kernel_size) { + uint64_t kprop[2] = { cpu_to_be64(spapr->kernel_addr), + cpu_to_be64(spapr->kernel_size) }; - _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel", + _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel", &kprop, sizeof(kprop))); - if (spapr->kernel_le) { - _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel-le", NULL, 0)); + if (spapr->kernel_le) { + _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel-le", NULL, 0)); + } } - } - if (boot_menu) { - _FDT((fdt_setprop_cell(fdt, chosen, "qemu,boot-menu", boot_menu))); - } - _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-width", graphic_width)); - _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-height", graphic_height)); - _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-depth", graphic_depth)); + if (boot_menu) { + _FDT((fdt_setprop_cell(fdt, chosen, "qemu,boot-menu", boot_menu))); + } + _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-width", graphic_width)); + _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-height", graphic_height)); + _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-depth", graphic_depth)); - if (cb && bootlist) { - int i; + if (cb && bootlist) { + int i; - for (i = 0; i < cb; i++) { - if (bootlist[i] == '\n') { - bootlist[i] = ' '; + for (i = 0; i < cb; i++) { + if (bootlist[i] == '\n') { + bootlist[i] = ' '; + } } + _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-list", bootlist)); } - _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-list", bootlist)); - } - if (boot_device && strlen(boot_device)) { - _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-device", boot_device)); - } + if (boot_device && strlen(boot_device)) { + _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-device", boot_device)); + } + + if (!spapr->has_graphics && stdout_path) { + /* + * "linux,stdout-path" and "stdout" properties are + * deprecated by linux kernel. New platforms should only + * use the "stdout-path" property. Set the new property + * and continue using older property to remain compatible + * with the existing firmware. + */ + _FDT(fdt_setprop_string(fdt, chosen, "linux,stdout-path", stdout_path)); + _FDT(fdt_setprop_string(fdt, chosen, "stdout-path", stdout_path)); + } - if (!spapr->has_graphics && stdout_path) { /* - * "linux,stdout-path" and "stdout" properties are deprecated by linux - * kernel. New platforms should only use the "stdout-path" property. Set - * the new property and continue using older property to remain - * compatible with the existing firmware. + * We can deal with BAR reallocation just fine, advertise it + * to the guest */ - _FDT(fdt_setprop_string(fdt, chosen, "linux,stdout-path", stdout_path)); - _FDT(fdt_setprop_string(fdt, chosen, "stdout-path", stdout_path)); - } + if (smc->linux_pci_probe) { + _FDT(fdt_setprop_cell(fdt, chosen, "linux,pci-probe-only", 0)); + } - /* We can deal with BAR reallocation just fine, advertise it to the guest */ - if (smc->linux_pci_probe) { - _FDT(fdt_setprop_cell(fdt, chosen, "linux,pci-probe-only", 0)); - } + spapr_dt_ov5_platform_support(spapr, fdt, chosen); - spapr_dt_ov5_platform_support(spapr, fdt, chosen); + g_free(stdout_path); + g_free(bootlist); + } - g_free(stdout_path); - g_free(bootlist); + _FDT(spapr_ovec_populate_dt(fdt, chosen, spapr->ov5_cas, + "ibm,architecture-vec-5")); } static void spapr_dt_hypervisor(SpaprMachineState *spapr, void *fdt) @@ -1243,9 +1238,7 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space) spapr_dt_rtas(spapr, fdt); /* /chosen */ - if (reset) { - spapr_dt_chosen(spapr, fdt); - } + spapr_dt_chosen(spapr, fdt, reset); /* /hypervisor */ if (kvm_enabled()) { @@ -1264,13 +1257,6 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space) } } - /* ibm,client-architecture-support updates */ - ret = spapr_dt_cas_updates(spapr, fdt, spapr->ov5_cas); - if (ret < 0) { - error_report("couldn't setup CAS properties fdt"); - exit(1); - } - if (smc->dr_phb_enabled) { ret = spapr_dt_drc(fdt, 0, NULL, SPAPR_DR_CONNECTOR_TYPE_PHB); if (ret < 0) { From patchwork Tue Mar 17 10:04:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442465 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A519E913 for ; Tue, 17 Mar 2020 10:20:48 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4A7C420658 for ; Tue, 17 Mar 2020 10:20:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="TSroW0ey" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4A7C420658 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55800 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9L5-0005bH-C1 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:20:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46115) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96D-0001qk-3S for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96A-000661-Fh for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:24 -0400 Received: from ozlabs.org ([203.11.71.1]:44903) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96A-0005pc-0B; Tue, 17 Mar 2020 06:05:22 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL14T90z9sTB; Tue, 17 Mar 2020 21:04:40 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439481; bh=9X+8xQKXdp9aA6GplPtlsf1pdhSBkl1CBAH7RG1EDMI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TSroW0ey0zqJgTqQguWkUxpAzmQ52/WPhxNqqkq1AKnqzLDkCqLif5UJqUlabGVpJ esWAxKjaOT1QDUqys7QkxsEWpHABAbY4Sd5+mMQtxzkiwRTzGsX/cOHLZFpr/ge0Vr ZHtaQjHUwQfCQAxUdmI0bMd63o95dYnf/5cKs2go= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 36/45] spapr: Rename DT functions to newer naming convention Date: Tue, 17 Mar 2020 21:04:14 +1100 Message-Id: <20200317100423.622643-37-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" In the spapr code we've been gradually moving towards a convention that functions which create pieces of the device tree are called spapr_dt_*(). This patch speeds that along by renaming most of the things that don't yet match that so that they do. For now we leave the *_dt_populate() functions which are actual methods used in the DRCClass::dt_populate method. While we're there we remove a few comments that don't really say anything useful. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater --- hw/ppc/spapr.c | 62 +++++++++++++++++-------------------- hw/ppc/spapr_ovec.c | 4 +-- include/hw/ppc/spapr_ovec.h | 4 +-- 3 files changed, 33 insertions(+), 37 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index aff8c87fad..878ed3f719 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -217,10 +217,9 @@ static int spapr_fixup_cpu_numa_dt(void *fdt, int offset, PowerPCCPU *cpu) sizeof(associativity)); } -/* Populate the "ibm,pa-features" property */ -static void spapr_populate_pa_features(SpaprMachineState *spapr, - PowerPCCPU *cpu, - void *fdt, int offset) +static void spapr_dt_pa_features(SpaprMachineState *spapr, + PowerPCCPU *cpu, + void *fdt, int offset) { uint8_t pa_features_206[] = { 6, 0, 0xf6, 0x1f, 0xc7, 0x00, 0x80, 0xc0 }; @@ -315,8 +314,8 @@ static void add_str(GString *s, const gchar *s1) g_string_append_len(s, s1, strlen(s1) + 1); } -static int spapr_populate_memory_node(void *fdt, int nodeid, hwaddr start, - hwaddr size) +static int spapr_dt_memory_node(void *fdt, int nodeid, hwaddr start, + hwaddr size) { uint32_t associativity[] = { cpu_to_be32(0x4), /* length */ @@ -391,9 +390,8 @@ spapr_get_drconf_cell(uint32_t seq_lmbs, uint64_t base_addr, return elem; } -/* ibm,dynamic-memory-v2 */ -static int spapr_populate_drmem_v2(SpaprMachineState *spapr, void *fdt, - int offset, MemoryDeviceInfoList *dimms) +static int spapr_dt_dynamic_memory_v2(SpaprMachineState *spapr, void *fdt, + int offset, MemoryDeviceInfoList *dimms) { MachineState *machine = MACHINE(spapr); uint8_t *int_buf, *cur_index; @@ -484,8 +482,7 @@ static int spapr_populate_drmem_v2(SpaprMachineState *spapr, void *fdt, return 0; } -/* ibm,dynamic-memory */ -static int spapr_populate_drmem_v1(SpaprMachineState *spapr, void *fdt, +static int spapr_dt_dynamic_memory(SpaprMachineState *spapr, void *fdt, int offset, MemoryDeviceInfoList *dimms) { MachineState *machine = MACHINE(spapr); @@ -554,7 +551,8 @@ static int spapr_populate_drmem_v1(SpaprMachineState *spapr, void *fdt, * Refer to docs/specs/ppc-spapr-hotplug.txt for the documentation * of this device tree node. */ -static int spapr_populate_drconf_memory(SpaprMachineState *spapr, void *fdt) +static int spapr_dt_dynamic_reconfiguration_memory(SpaprMachineState *spapr, + void *fdt) { MachineState *machine = MACHINE(spapr); int nb_numa_nodes = machine->numa_state->num_nodes; @@ -593,9 +591,9 @@ static int spapr_populate_drconf_memory(SpaprMachineState *spapr, void *fdt) /* ibm,dynamic-memory or ibm,dynamic-memory-v2 */ dimms = qmp_memory_device_list(); if (spapr_ovec_test(spapr->ov5_cas, OV5_DRMEM_V2)) { - ret = spapr_populate_drmem_v2(spapr, fdt, offset, dimms); + ret = spapr_dt_dynamic_memory_v2(spapr, fdt, offset, dimms); } else { - ret = spapr_populate_drmem_v1(spapr, fdt, offset, dimms); + ret = spapr_dt_dynamic_memory(spapr, fdt, offset, dimms); } qapi_free_MemoryDeviceInfoList(dimms); @@ -626,7 +624,7 @@ static int spapr_populate_drconf_memory(SpaprMachineState *spapr, void *fdt) return ret; } -static int spapr_populate_memory(SpaprMachineState *spapr, void *fdt) +static int spapr_dt_memory(SpaprMachineState *spapr, void *fdt) { MachineState *machine = MACHINE(spapr); SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr); @@ -649,7 +647,7 @@ static int spapr_populate_memory(SpaprMachineState *spapr, void *fdt) if (!mem_start) { /* spapr_machine_init() checks for rma_size <= node0_size * already */ - spapr_populate_memory_node(fdt, i, 0, spapr->rma_size); + spapr_dt_memory_node(fdt, i, 0, spapr->rma_size); mem_start += spapr->rma_size; node_size -= spapr->rma_size; } @@ -661,7 +659,7 @@ static int spapr_populate_memory(SpaprMachineState *spapr, void *fdt) sizetmp = 1ULL << ctzl(mem_start); } - spapr_populate_memory_node(fdt, i, mem_start, sizetmp); + spapr_dt_memory_node(fdt, i, mem_start, sizetmp); node_size -= sizetmp; mem_start += sizetmp; } @@ -672,7 +670,7 @@ static int spapr_populate_memory(SpaprMachineState *spapr, void *fdt) int ret; g_assert(smc->dr_lmb_enabled); - ret = spapr_populate_drconf_memory(spapr, fdt); + ret = spapr_dt_dynamic_reconfiguration_memory(spapr, fdt); if (ret) { return ret; } @@ -681,8 +679,8 @@ static int spapr_populate_memory(SpaprMachineState *spapr, void *fdt) return 0; } -static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset, - SpaprMachineState *spapr) +static void spapr_dt_cpu(CPUState *cs, void *fdt, int offset, + SpaprMachineState *spapr) { MachineState *ms = MACHINE(spapr); PowerPCCPU *cpu = POWERPC_CPU(cs); @@ -782,7 +780,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset, page_sizes_prop, page_sizes_prop_size))); } - spapr_populate_pa_features(spapr, cpu, fdt, offset); + spapr_dt_pa_features(spapr, cpu, fdt, offset); _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id", cs->cpu_index / vcpus_per_socket))); @@ -816,7 +814,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset, pcc->lrg_decr_bits))); } -static void spapr_populate_cpus_dt_node(void *fdt, SpaprMachineState *spapr) +static void spapr_dt_cpus(void *fdt, SpaprMachineState *spapr) { CPUState **rev; CPUState *cs; @@ -860,13 +858,13 @@ static void spapr_populate_cpus_dt_node(void *fdt, SpaprMachineState *spapr) offset = fdt_add_subnode(fdt, cpus_offset, nodename); g_free(nodename); _FDT(offset); - spapr_populate_cpu_dt(cs, fdt, offset, spapr); + spapr_dt_cpu(cs, fdt, offset, spapr); } g_free(rev); } -static int spapr_rng_populate_dt(void *fdt) +static int spapr_dt_rng(void *fdt) { int node; int ret; @@ -1111,8 +1109,7 @@ static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt, bool reset) g_free(bootlist); } - _FDT(spapr_ovec_populate_dt(fdt, chosen, spapr->ov5_cas, - "ibm,architecture-vec-5")); + _FDT(spapr_dt_ovec(fdt, chosen, spapr->ov5_cas, "ibm,architecture-vec-5")); } static void spapr_dt_hypervisor(SpaprMachineState *spapr, void *fdt) @@ -1190,7 +1187,7 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space) /* /interrupt controller */ spapr_irq_dt(spapr, spapr_max_server_number(spapr), fdt, PHANDLE_INTC); - ret = spapr_populate_memory(spapr, fdt); + ret = spapr_dt_memory(spapr, fdt); if (ret < 0) { error_report("couldn't setup memory nodes in fdt"); exit(1); @@ -1200,7 +1197,7 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space) spapr_dt_vdevice(spapr->vio_bus, fdt); if (object_resolve_path_type("", TYPE_SPAPR_RNG, NULL)) { - ret = spapr_rng_populate_dt(fdt); + ret = spapr_dt_rng(fdt); if (ret < 0) { error_report("could not set up rng device in the fdt"); exit(1); @@ -1215,8 +1212,7 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space) } } - /* cpus */ - spapr_populate_cpus_dt_node(fdt, spapr); + spapr_dt_cpus(fdt, spapr); if (smc->dr_lmb_enabled) { _FDT(spapr_dt_drc(fdt, 0, NULL, SPAPR_DR_CONNECTOR_TYPE_LMB)); @@ -3408,8 +3404,8 @@ int spapr_lmb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, addr = spapr_drc_index(drc) * SPAPR_MEMORY_BLOCK_SIZE; node = object_property_get_uint(OBJECT(drc->dev), PC_DIMM_NODE_PROP, &error_abort); - *fdt_start_offset = spapr_populate_memory_node(fdt, node, addr, - SPAPR_MEMORY_BLOCK_SIZE); + *fdt_start_offset = spapr_dt_memory_node(fdt, node, addr, + SPAPR_MEMORY_BLOCK_SIZE); return 0; } @@ -3810,7 +3806,7 @@ int spapr_core_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, offset = fdt_add_subnode(fdt, 0, nodename); g_free(nodename); - spapr_populate_cpu_dt(cs, fdt, offset, spapr); + spapr_dt_cpu(cs, fdt, offset, spapr); *fdt_start_offset = offset; return 0; diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c index 0ff6d1aeae..dd003f1763 100644 --- a/hw/ppc/spapr_ovec.c +++ b/hw/ppc/spapr_ovec.c @@ -200,8 +200,8 @@ SpaprOptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int vector) return ov; } -int spapr_ovec_populate_dt(void *fdt, int fdt_offset, - SpaprOptionVector *ov, const char *name) +int spapr_dt_ovec(void *fdt, int fdt_offset, + SpaprOptionVector *ov, const char *name) { uint8_t vec[OV_MAXBYTES + 1]; uint16_t vec_len; diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h index 2bed517a2b..d4dee9e06a 100644 --- a/include/hw/ppc/spapr_ovec.h +++ b/include/hw/ppc/spapr_ovec.h @@ -72,8 +72,8 @@ void spapr_ovec_set(SpaprOptionVector *ov, long bitnr); void spapr_ovec_clear(SpaprOptionVector *ov, long bitnr); bool spapr_ovec_test(SpaprOptionVector *ov, long bitnr); SpaprOptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int vector); -int spapr_ovec_populate_dt(void *fdt, int fdt_offset, - SpaprOptionVector *ov, const char *name); +int spapr_dt_ovec(void *fdt, int fdt_offset, + SpaprOptionVector *ov, const char *name); /* migration */ extern const VMStateDescription vmstate_spapr_ovec; From patchwork Tue Mar 17 10:04:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442447 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B71BB913 for ; Tue, 17 Mar 2020 10:18:28 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8A6B3206EC for ; Tue, 17 Mar 2020 10:18:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="bWg75vvt" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8A6B3206EC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55746 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Ip-0000xP-KV for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:18:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46581) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96V-0002Mh-Ah for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96T-0008P1-U9 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:43 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:43735 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96T-0005o2-H7; Tue, 17 Mar 2020 06:05:41 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL12ZBpz9sTV; Tue, 17 Mar 2020 21:04:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439481; bh=lfwtAqakSHQ2oL/cyuePyT3lif+wTyFCZKQf8mU9yS0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bWg75vvtYOff8Cyx7nXTWFHze0b2yh4vu2qehCJ7Fc6kZjsW3j/Y86QzvQ3tr2CD5 ak5FrhyaTrwMLa707GrZJ8XVCGHjqbsbslYZwIZEKRtKxS4XyvcKxUTtLTbf/XJ9Y7 1HfX7KnHB6/MehZo39jQGxXscxTohlf6qQmxSOiE= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 37/45] ppc/spapr: Fix FWNMI machine check failure handling Date: Tue, 17 Mar 2020 21:04:15 +1100 Message-Id: <20200317100423.622643-38-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, Nicholas Piggin , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Nicholas Piggin ppc_cpu_do_system_reset delivers a system rreset interrupt to the guest, which is certainly not what is intended here. Panic the guest like other failure cases here do. Signed-off-by: Nicholas Piggin Message-Id: <20200316142613.121089-2-npiggin@gmail.com> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr_events.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 2afd1844e4..11303258d4 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -785,7 +785,6 @@ static uint32_t spapr_mce_get_elog_type(PowerPCCPU *cpu, bool recovered, static void spapr_mce_dispatch_elog(PowerPCCPU *cpu, bool recovered) { SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); - CPUState *cs = CPU(cpu); uint64_t rtas_addr; CPUPPCState *env = &cpu->env; PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); @@ -823,8 +822,7 @@ static void spapr_mce_dispatch_elog(PowerPCCPU *cpu, bool recovered) /* get rtas addr from fdt */ rtas_addr = spapr_get_rtas_addr(); if (!rtas_addr) { - /* Unable to fetch rtas_addr. Hence reset the guest */ - ppc_cpu_do_system_reset(cs); + qemu_system_guest_panicked(NULL); g_free(ext_elog); return; } From patchwork Tue Mar 17 10:04:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442483 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9FCEE14B4 for ; Tue, 17 Mar 2020 10:24:29 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 65DC5205ED for ; Tue, 17 Mar 2020 10:24:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="G6Azbc/x" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 65DC5205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55886 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Oe-0004hb-Ip for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:24:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46709) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96Z-0002UD-1w for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96V-00008a-Qx for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:46 -0400 Received: from ozlabs.org ([203.11.71.1]:59027) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96U-0005xN-VQ; Tue, 17 Mar 2020 06:05:43 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL16ytnz9sTX; Tue, 17 Mar 2020 21:04:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439481; bh=CFx9U3Nn3GNQcuH3RQT4UN9qMLOEmEHZjLqKFif0dpk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G6Azbc/xBnjkG0yrX/SU16HnDbIGyELVqXL47Hi5k7MDnyPWjH+AVNGwV1vTD7I+o krTd6hS1um2MzOlrOLM7Ei8e21mwfgUjUs+mhfQ5Wknjcab0T7GvQTHiA6/h9CMaPw Q3HUrfjZJKAMtdZlRuESURX680O32QG50ruAXEsE= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 38/45] ppc/spapr: Change FWNMI names Date: Tue, 17 Mar 2020 21:04:16 +1100 Message-Id: <20200317100423.622643-39-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, Nicholas Piggin , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Nicholas Piggin The option is called "FWNMI", and it involves more than just machine checks, also machine checks can be delivered without the FWNMI option, so re-name various things to reflect that. Signed-off-by: Nicholas Piggin Message-Id: <20200316142613.121089-3-npiggin@gmail.com> Reviewed-by: Greg Kurz Reviewed-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/spapr.c | 28 ++++++++++++++-------------- hw/ppc/spapr_caps.c | 14 +++++++------- hw/ppc/spapr_events.c | 14 +++++++------- hw/ppc/spapr_rtas.c | 17 +++++++++-------- include/hw/ppc/spapr.h | 27 +++++++++++++++++---------- tests/qtest/libqos/libqos-spapr.h | 2 +- 6 files changed, 55 insertions(+), 47 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 878ed3f719..822dea8118 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1688,11 +1688,11 @@ static void spapr_machine_reset(MachineState *machine) spapr->cas_reboot = false; - spapr->mc_status = -1; - spapr->guest_machine_check_addr = -1; + spapr->fwnmi_machine_check_addr = -1; + spapr->fwnmi_machine_check_interlock = -1; /* Signal all vCPUs waiting on this condition */ - qemu_cond_broadcast(&spapr->mc_delivery_cond); + qemu_cond_broadcast(&spapr->fwnmi_machine_check_interlock_cond); migrate_del_blocker(spapr->fwnmi_migration_blocker); } @@ -1981,7 +1981,7 @@ static bool spapr_fwnmi_needed(void *opaque) { SpaprMachineState *spapr = (SpaprMachineState *)opaque; - return spapr->guest_machine_check_addr != -1; + return spapr->fwnmi_machine_check_addr != -1; } static int spapr_fwnmi_pre_save(void *opaque) @@ -1992,7 +1992,7 @@ static int spapr_fwnmi_pre_save(void *opaque) * Check if machine check handling is in progress and print a * warning message. */ - if (spapr->mc_status != -1) { + if (spapr->fwnmi_machine_check_interlock != -1) { warn_report("A machine check is being handled during migration. The" "handler may run and log hardware error on the destination"); } @@ -2000,15 +2000,15 @@ static int spapr_fwnmi_pre_save(void *opaque) return 0; } -static const VMStateDescription vmstate_spapr_machine_check = { - .name = "spapr_machine_check", +static const VMStateDescription vmstate_spapr_fwnmi = { + .name = "spapr_fwnmi", .version_id = 1, .minimum_version_id = 1, .needed = spapr_fwnmi_needed, .pre_save = spapr_fwnmi_pre_save, .fields = (VMStateField[]) { - VMSTATE_UINT64(guest_machine_check_addr, SpaprMachineState), - VMSTATE_INT32(mc_status, SpaprMachineState), + VMSTATE_UINT64(fwnmi_machine_check_addr, SpaprMachineState), + VMSTATE_INT32(fwnmi_machine_check_interlock, SpaprMachineState), VMSTATE_END_OF_LIST() }, }; @@ -2047,7 +2047,7 @@ static const VMStateDescription vmstate_spapr = { &vmstate_spapr_cap_large_decr, &vmstate_spapr_cap_ccf_assist, &vmstate_spapr_cap_fwnmi, - &vmstate_spapr_machine_check, + &vmstate_spapr_fwnmi, NULL } }; @@ -2869,7 +2869,7 @@ static void spapr_machine_init(MachineState *machine) spapr_create_lmb_dr_connectors(spapr); } - if (spapr_get_cap(spapr, SPAPR_CAP_FWNMI_MCE) == SPAPR_CAP_ON) { + if (spapr_get_cap(spapr, SPAPR_CAP_FWNMI) == SPAPR_CAP_ON) { /* Create the error string for live migration blocker */ error_setg(&spapr->fwnmi_migration_blocker, "A machine check is being handled during migration. The handler" @@ -3038,7 +3038,7 @@ static void spapr_machine_init(MachineState *machine) kvmppc_spapr_enable_inkernel_multitce(); } - qemu_cond_init(&spapr->mc_delivery_cond); + qemu_cond_init(&spapr->fwnmi_machine_check_interlock_cond); } static int spapr_kvm_type(MachineState *machine, const char *vm_type) @@ -4519,7 +4519,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF; smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON; smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_ON; - smc->default_caps.caps[SPAPR_CAP_FWNMI_MCE] = SPAPR_CAP_ON; + smc->default_caps.caps[SPAPR_CAP_FWNMI] = SPAPR_CAP_ON; spapr_caps_add_properties(smc, &error_abort); smc->irq = &spapr_irq_dual; smc->dr_phb_enabled = true; @@ -4597,7 +4597,7 @@ static void spapr_machine_4_2_class_options(MachineClass *mc) spapr_machine_5_0_class_options(mc); compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len); smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF; - smc->default_caps.caps[SPAPR_CAP_FWNMI_MCE] = SPAPR_CAP_OFF; + smc->default_caps.caps[SPAPR_CAP_FWNMI] = SPAPR_CAP_OFF; smc->rma_limit = 16 * GiB; mc->nvdimm_supported = false; } diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 8b27d3ac09..f626d769a0 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -509,7 +509,7 @@ static void cap_ccf_assist_apply(SpaprMachineState *spapr, uint8_t val, } } -static void cap_fwnmi_mce_apply(SpaprMachineState *spapr, uint8_t val, +static void cap_fwnmi_apply(SpaprMachineState *spapr, uint8_t val, Error **errp) { if (!val) { @@ -626,14 +626,14 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = { .type = "bool", .apply = cap_ccf_assist_apply, }, - [SPAPR_CAP_FWNMI_MCE] = { - .name = "fwnmi-mce", - .description = "Handle fwnmi machine check exceptions", - .index = SPAPR_CAP_FWNMI_MCE, + [SPAPR_CAP_FWNMI] = { + .name = "fwnmi", + .description = "Implements PAPR FWNMI option", + .index = SPAPR_CAP_FWNMI, .get = spapr_cap_get_bool, .set = spapr_cap_set_bool, .type = "bool", - .apply = cap_fwnmi_mce_apply, + .apply = cap_fwnmi_apply, }, }; @@ -774,7 +774,7 @@ SPAPR_CAP_MIG_STATE(hpt_maxpagesize, SPAPR_CAP_HPT_MAXPAGESIZE); SPAPR_CAP_MIG_STATE(nested_kvm_hv, SPAPR_CAP_NESTED_KVM_HV); SPAPR_CAP_MIG_STATE(large_decr, SPAPR_CAP_LARGE_DECREMENTER); SPAPR_CAP_MIG_STATE(ccf_assist, SPAPR_CAP_CCF_ASSIST); -SPAPR_CAP_MIG_STATE(fwnmi, SPAPR_CAP_FWNMI_MCE); +SPAPR_CAP_MIG_STATE(fwnmi, SPAPR_CAP_FWNMI); void spapr_caps_init(SpaprMachineState *spapr) { diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 11303258d4..27ba8a2c19 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -837,7 +837,7 @@ static void spapr_mce_dispatch_elog(PowerPCCPU *cpu, bool recovered) env->gpr[3] = rtas_addr + RTAS_ERROR_LOG_OFFSET; env->msr = msr; - env->nip = spapr->guest_machine_check_addr; + env->nip = spapr->fwnmi_machine_check_addr; g_free(ext_elog); } @@ -849,7 +849,7 @@ void spapr_mce_req_event(PowerPCCPU *cpu, bool recovered) int ret; Error *local_err = NULL; - if (spapr->guest_machine_check_addr == -1) { + if (spapr->fwnmi_machine_check_addr == -1) { /* * This implies that we have hit a machine check either when the * guest has not registered FWNMI (i.e., "ibm,nmi-register" not @@ -861,19 +861,19 @@ void spapr_mce_req_event(PowerPCCPU *cpu, bool recovered) return; } - while (spapr->mc_status != -1) { + while (spapr->fwnmi_machine_check_interlock != -1) { /* * Check whether the same CPU got machine check error * while still handling the mc error (i.e., before * that CPU called "ibm,nmi-interlock") */ - if (spapr->mc_status == cpu->vcpu_id) { + if (spapr->fwnmi_machine_check_interlock == cpu->vcpu_id) { qemu_system_guest_panicked(NULL); return; } - qemu_cond_wait_iothread(&spapr->mc_delivery_cond); + qemu_cond_wait_iothread(&spapr->fwnmi_machine_check_interlock_cond); /* Meanwhile if the system is reset, then just return */ - if (spapr->guest_machine_check_addr == -1) { + if (spapr->fwnmi_machine_check_addr == -1) { return; } } @@ -889,7 +889,7 @@ void spapr_mce_req_event(PowerPCCPU *cpu, bool recovered) warn_report("Received a fwnmi while migration was in progress"); } - spapr->mc_status = cpu->vcpu_id; + spapr->fwnmi_machine_check_interlock = cpu->vcpu_id; spapr_mce_dispatch_elog(cpu, recovered); } diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index fe83b50c66..0b8c481593 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -415,7 +415,7 @@ static void rtas_ibm_nmi_register(PowerPCCPU *cpu, { hwaddr rtas_addr; - if (spapr_get_cap(spapr, SPAPR_CAP_FWNMI_MCE) == SPAPR_CAP_OFF) { + if (spapr_get_cap(spapr, SPAPR_CAP_FWNMI) == SPAPR_CAP_OFF) { rtas_st(rets, 0, RTAS_OUT_NOT_SUPPORTED); return; } @@ -426,7 +426,8 @@ static void rtas_ibm_nmi_register(PowerPCCPU *cpu, return; } - spapr->guest_machine_check_addr = rtas_ld(args, 1); + spapr->fwnmi_machine_check_addr = rtas_ld(args, 1); + rtas_st(rets, 0, RTAS_OUT_SUCCESS); } @@ -436,18 +437,18 @@ static void rtas_ibm_nmi_interlock(PowerPCCPU *cpu, target_ulong args, uint32_t nret, target_ulong rets) { - if (spapr_get_cap(spapr, SPAPR_CAP_FWNMI_MCE) == SPAPR_CAP_OFF) { + if (spapr_get_cap(spapr, SPAPR_CAP_FWNMI) == SPAPR_CAP_OFF) { rtas_st(rets, 0, RTAS_OUT_NOT_SUPPORTED); return; } - if (spapr->guest_machine_check_addr == -1) { + if (spapr->fwnmi_machine_check_addr == -1) { /* NMI register not called */ rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); return; } - if (spapr->mc_status != cpu->vcpu_id) { + if (spapr->fwnmi_machine_check_interlock != cpu->vcpu_id) { /* The vCPU that hit the NMI should invoke "ibm,nmi-interlock" */ rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); return; @@ -455,10 +456,10 @@ static void rtas_ibm_nmi_interlock(PowerPCCPU *cpu, /* * vCPU issuing "ibm,nmi-interlock" is done with NMI handling, - * hence unset mc_status. + * hence unset fwnmi_machine_check_interlock. */ - spapr->mc_status = -1; - qemu_cond_signal(&spapr->mc_delivery_cond); + spapr->fwnmi_machine_check_interlock = -1; + qemu_cond_signal(&spapr->fwnmi_machine_check_interlock_cond); rtas_st(rets, 0, RTAS_OUT_SUCCESS); migrate_del_blocker(spapr->fwnmi_migration_blocker); } diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 35b489a549..64b83402cb 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -79,10 +79,10 @@ typedef enum { #define SPAPR_CAP_LARGE_DECREMENTER 0x08 /* Count Cache Flush Assist HW Instruction */ #define SPAPR_CAP_CCF_ASSIST 0x09 -/* FWNMI machine check handling */ -#define SPAPR_CAP_FWNMI_MCE 0x0A +/* Implements PAPR FWNMI option */ +#define SPAPR_CAP_FWNMI 0x0A /* Num Caps */ -#define SPAPR_CAP_NUM (SPAPR_CAP_FWNMI_MCE + 1) +#define SPAPR_CAP_NUM (SPAPR_CAP_FWNMI + 1) /* * Capability Values @@ -192,14 +192,21 @@ struct SpaprMachineState { * occurs during the unplug process. */ QTAILQ_HEAD(, SpaprDimmState) pending_dimm_unplugs; - /* State related to "ibm,nmi-register" and "ibm,nmi-interlock" calls */ - target_ulong guest_machine_check_addr; - /* - * mc_status is set to -1 if mc is not in progress, else is set to the CPU - * handling the mc. + /* State related to FWNMI option */ + + /* Machine Check Notification Routine address + * registered by "ibm,nmi-register" RTAS call. + */ + target_ulong fwnmi_machine_check_addr; + + /* Machine Check FWNMI synchronization, fwnmi_machine_check_interlock is + * set to -1 if a FWNMI machine check is not in progress, else is set to + * the CPU that was delivered the machine check, and is set back to -1 + * when that CPU makes an "ibm,nmi-interlock" RTAS call. The cond is used + * to synchronize other CPUs. */ - int mc_status; - QemuCond mc_delivery_cond; + int fwnmi_machine_check_interlock; + QemuCond fwnmi_machine_check_interlock_cond; /*< public >*/ char *kvm_type; diff --git a/tests/qtest/libqos/libqos-spapr.h b/tests/qtest/libqos/libqos-spapr.h index d9c4c22343..16174dbada 100644 --- a/tests/qtest/libqos/libqos-spapr.h +++ b/tests/qtest/libqos/libqos-spapr.h @@ -13,6 +13,6 @@ void qtest_spapr_shutdown(QOSState *qs); "cap-sbbc=broken," \ "cap-ibs=broken," \ "cap-ccf-assist=off," \ - "cap-fwnmi-mce=off" + "cap-fwnmi=off" #endif From patchwork Tue Mar 17 10:04:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442511 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D7B2792A for ; Tue, 17 Mar 2020 10:38:46 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AE3EC20663 for ; Tue, 17 Mar 2020 10:38:46 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="jqj9t+wQ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AE3EC20663 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:56298 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9cT-0000hi-SB for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:38:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46692) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96Y-0002TJ-Jt for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96X-0000GX-0R for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:46 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:51335 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96W-00068N-Gw; Tue, 17 Mar 2020 06:05:44 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL23GBZz9sTY; Tue, 17 Mar 2020 21:04:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439482; bh=mIsHUpFrAFGza27JGR43LmGf3jqwhFuZkDmxkORmg/g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jqj9t+wQWiRoAgbmZl0u41GOl63uTFTX7s8cbsztwMNQvV1m4lZyN/VpJBZQCpLmC xxR8tpo+TsLKq1RsnoErDYSxRyUSZ11Bqe2gsL0pbwfHIN5hQZZcj3/ULdZMTX9GsA XYSfePumh+O9wBSy91fUkGHZhQbCDoYrityuGbSM= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 39/45] ppc/spapr: Add FWNMI System Reset state Date: Tue, 17 Mar 2020 21:04:17 +1100 Message-Id: <20200317100423.622643-40-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, Nicholas Piggin , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Mahesh Salgaonkar , David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Nicholas Piggin The FWNMI option must deliver system reset interrupts to their registered address, and there are a few constraints on the handler addresses specified in PAPR. Add the system reset address state and checks. Signed-off-by: Nicholas Piggin Message-Id: <20200316142613.121089-4-npiggin@gmail.com> Reviewed-by: Greg Kurz Reviwed-by: Mahesh Salgaonkar Reviewed-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/spapr.c | 2 ++ hw/ppc/spapr_rtas.c | 14 +++++++++++++- include/hw/ppc/spapr.h | 3 ++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 822dea8118..d22bf54baf 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1688,6 +1688,7 @@ static void spapr_machine_reset(MachineState *machine) spapr->cas_reboot = false; + spapr->fwnmi_system_reset_addr = -1; spapr->fwnmi_machine_check_addr = -1; spapr->fwnmi_machine_check_interlock = -1; @@ -2007,6 +2008,7 @@ static const VMStateDescription vmstate_spapr_fwnmi = { .needed = spapr_fwnmi_needed, .pre_save = spapr_fwnmi_pre_save, .fields = (VMStateField[]) { + VMSTATE_UINT64(fwnmi_system_reset_addr, SpaprMachineState), VMSTATE_UINT64(fwnmi_machine_check_addr, SpaprMachineState), VMSTATE_INT32(fwnmi_machine_check_interlock, SpaprMachineState), VMSTATE_END_OF_LIST() diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 0b8c481593..521e6b0b72 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -414,6 +414,7 @@ static void rtas_ibm_nmi_register(PowerPCCPU *cpu, uint32_t nret, target_ulong rets) { hwaddr rtas_addr; + target_ulong sreset_addr, mce_addr; if (spapr_get_cap(spapr, SPAPR_CAP_FWNMI) == SPAPR_CAP_OFF) { rtas_st(rets, 0, RTAS_OUT_NOT_SUPPORTED); @@ -426,7 +427,18 @@ static void rtas_ibm_nmi_register(PowerPCCPU *cpu, return; } - spapr->fwnmi_machine_check_addr = rtas_ld(args, 1); + sreset_addr = rtas_ld(args, 0); + mce_addr = rtas_ld(args, 1); + + /* PAPR requires these are in the first 32M of memory and within RMA */ + if (sreset_addr >= 32 * MiB || sreset_addr >= spapr->rma_size || + mce_addr >= 32 * MiB || mce_addr >= spapr->rma_size) { + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + return; + } + + spapr->fwnmi_system_reset_addr = sreset_addr; + spapr->fwnmi_machine_check_addr = mce_addr; rtas_st(rets, 0, RTAS_OUT_SUCCESS); } diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 64b83402cb..42d64a0368 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -194,9 +194,10 @@ struct SpaprMachineState { /* State related to FWNMI option */ - /* Machine Check Notification Routine address + /* System Reset and Machine Check Notification Routine addresses * registered by "ibm,nmi-register" RTAS call. */ + target_ulong fwnmi_system_reset_addr; target_ulong fwnmi_machine_check_addr; /* Machine Check FWNMI synchronization, fwnmi_machine_check_interlock is From patchwork Tue Mar 17 10:04:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442477 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CE4A1913 for ; Tue, 17 Mar 2020 10:22:34 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A60EB205ED for ; Tue, 17 Mar 2020 10:22:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="gpGHSqMS" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A60EB205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55838 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Mn-0000ak-P9 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:22:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46495) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96S-0002Ho-JL for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96Q-0007xa-NS for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:40 -0400 Received: from ozlabs.org ([203.11.71.1]:57301) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96Q-0007fI-9t; Tue, 17 Mar 2020 06:05:38 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL31M4Nz9sTc; Tue, 17 Mar 2020 21:04:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439483; bh=w8FnmTmTKIT07gXVMMuYlFdyZ2CmcEwbXiUvJcwhsFA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gpGHSqMSfO3nHyHZ+w/vkYmDxuDhD/w7YjACT+89gXc/igVlucLLHk5wyUl4ZCGQ7 9WHDD5f+68BsIsCqWwhofFEKC+8mhOse3FTEfiIza4XErSE7wCUgbVt2PMPTUoMkWt KK5FeFtO5vmlhhhqBwp/pI2sMcQq7vZmXVQGUvsg= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 40/45] ppc/spapr: Fix FWNMI machine check interrupt delivery Date: Tue, 17 Mar 2020 21:04:18 +1100 Message-Id: <20200317100423.622643-41-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, Nicholas Piggin , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Nicholas Piggin FWNMI machine check delivery misses a few things that will make it fail with TCG at least (which we would like to allow in future to improve testing). It's not nice to scatter interrupt delivery logic around the tree, so move it to excp_helper.c and share code where possible. Signed-off-by: Nicholas Piggin Message-Id: <20200316142613.121089-5-npiggin@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr_events.c | 24 +++---------- target/ppc/cpu.h | 1 + target/ppc/excp_helper.c | 74 ++++++++++++++++++++++++++++------------ 3 files changed, 57 insertions(+), 42 deletions(-) diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 27ba8a2c19..323fcef4aa 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -785,28 +785,13 @@ static uint32_t spapr_mce_get_elog_type(PowerPCCPU *cpu, bool recovered, static void spapr_mce_dispatch_elog(PowerPCCPU *cpu, bool recovered) { SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); - uint64_t rtas_addr; + CPUState *cs = CPU(cpu); CPUPPCState *env = &cpu->env; - PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); - target_ulong msr = 0; + uint64_t rtas_addr; struct rtas_error_log log; struct mc_extended_log *ext_elog; uint32_t summary; - /* - * Properly set bits in MSR before we invoke the handler. - * SRR0/1, DAR and DSISR are properly set by KVM - */ - if (!(*pcc->interrupts_big_endian)(cpu)) { - msr |= (1ULL << MSR_LE); - } - - if (env->msr & (1ULL << MSR_SF)) { - msr |= (1ULL << MSR_SF); - } - - msr |= (1ULL << MSR_ME); - ext_elog = g_malloc0(sizeof(*ext_elog)); summary = spapr_mce_get_elog_type(cpu, recovered, ext_elog); @@ -834,12 +819,11 @@ static void spapr_mce_dispatch_elog(PowerPCCPU *cpu, bool recovered) cpu_physical_memory_write(rtas_addr + RTAS_ERROR_LOG_OFFSET + sizeof(env->gpr[3]) + sizeof(log), ext_elog, sizeof(*ext_elog)); + g_free(ext_elog); env->gpr[3] = rtas_addr + RTAS_ERROR_LOG_OFFSET; - env->msr = msr; - env->nip = spapr->fwnmi_machine_check_addr; - g_free(ext_elog); + ppc_cpu_do_fwnmi_machine_check(cs, spapr->fwnmi_machine_check_addr); } void spapr_mce_req_event(PowerPCCPU *cpu, bool recovered) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 5a55fb02bd..3953680534 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1221,6 +1221,7 @@ int ppc32_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs, int cpuid, void *opaque); #ifndef CONFIG_USER_ONLY void ppc_cpu_do_system_reset(CPUState *cs); +void ppc_cpu_do_fwnmi_machine_check(CPUState *cs, target_ulong vector); extern const VMStateDescription vmstate_ppc_cpu; #endif diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index 027f54c0ed..7f2b5899d3 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -128,6 +128,37 @@ static uint64_t ppc_excp_vector_offset(CPUState *cs, int ail) return offset; } +static inline void powerpc_set_excp_state(PowerPCCPU *cpu, + target_ulong vector, target_ulong msr) +{ + CPUState *cs = CPU(cpu); + CPUPPCState *env = &cpu->env; + + /* + * We don't use hreg_store_msr here as already have treated any + * special case that could occur. Just store MSR and update hflags + * + * Note: We *MUST* not use hreg_store_msr() as-is anyway because it + * will prevent setting of the HV bit which some exceptions might need + * to do. + */ + env->msr = msr & env->msr_mask; + hreg_compute_hflags(env); + env->nip = vector; + /* Reset exception state */ + cs->exception_index = POWERPC_EXCP_NONE; + env->error_code = 0; + + /* Reset the reservation */ + env->reserve_addr = -1; + + /* + * Any interrupt is context synchronizing, check if TCG TLB needs + * a delayed flush on ppc64 + */ + check_tlb_flush(env, false); +} + /* * Note that this function should be greatly optimized when called * with a constant excp, from ppc_hw_interrupt @@ -768,29 +799,8 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp) } } #endif - /* - * We don't use hreg_store_msr here as already have treated any - * special case that could occur. Just store MSR and update hflags - * - * Note: We *MUST* not use hreg_store_msr() as-is anyway because it - * will prevent setting of the HV bit which some exceptions might need - * to do. - */ - env->msr = new_msr & env->msr_mask; - hreg_compute_hflags(env); - env->nip = vector; - /* Reset exception state */ - cs->exception_index = POWERPC_EXCP_NONE; - env->error_code = 0; - /* Reset the reservation */ - env->reserve_addr = -1; - - /* - * Any interrupt is context synchronizing, check if TCG TLB needs - * a delayed flush on ppc64 - */ - check_tlb_flush(env, false); + powerpc_set_excp_state(cpu, vector, new_msr); } void ppc_cpu_do_interrupt(CPUState *cs) @@ -958,6 +968,26 @@ void ppc_cpu_do_system_reset(CPUState *cs) powerpc_excp(cpu, env->excp_model, POWERPC_EXCP_RESET); } + +void ppc_cpu_do_fwnmi_machine_check(CPUState *cs, target_ulong vector) +{ + PowerPCCPU *cpu = POWERPC_CPU(cs); + CPUPPCState *env = &cpu->env; + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); + target_ulong msr = 0; + + /* + * Set MSR and NIP for the handler, SRR0/1, DAR and DSISR have already + * been set by KVM. + */ + msr = (1ULL << MSR_ME); + msr |= env->msr & (1ULL << MSR_SF); + if (!(*pcc->interrupts_big_endian)(cpu)) { + msr |= (1ULL << MSR_LE); + } + + powerpc_set_excp_state(cpu, vector, msr); +} #endif /* !CONFIG_USER_ONLY */ bool ppc_cpu_exec_interrupt(CPUState *cs, int interrupt_request) From patchwork Tue Mar 17 10:04:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442461 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8F0AA14B4 for ; Tue, 17 Mar 2020 10:20:34 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6693B20735 for ; Tue, 17 Mar 2020 10:20:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="Szs+mtCH" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6693B20735 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55790 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Kr-00056e-Hj for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:20:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46826) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96c-0002an-BW for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96a-0000k0-MR for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:50 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:49853 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96a-0006UO-7O; Tue, 17 Mar 2020 06:05:48 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL26Nbsz9sTZ; Tue, 17 Mar 2020 21:04:42 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439482; bh=bQQmdDvTIGTYx9hToVqDanlWHhCaBUAPPuQxwhbV9d4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Szs+mtCHEuG7pJhOWVtyNcVeUiRz0W20aviFU8F21j9s/3iP6aPIMGNAaouPtlhIQ SccB+wE18iry5mn4V9a+UlrVXfm/lxWQJuwNK2FDzEBD9x8QJ8S3HlAtL6fJcohpj3 u3cxIPnQdZ3T+akLA0ZDFZx112csMId2cn1188w0= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 41/45] ppc/spapr: Allow FWNMI on TCG Date: Tue, 17 Mar 2020 21:04:19 +1100 Message-Id: <20200317100423.622643-42-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, Nicholas Piggin , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Nicholas Piggin There should no longer be a reason to prevent TCG providing FWNMI. System Reset interrupts are generated to the guest with nmi monitor command and H_SIGNAL_SYS_RESET. Machine Checks can not be injected currently, but this could be implemented with the mce monitor cmd similarly to i386. Signed-off-by: Nicholas Piggin Message-Id: <20200316142613.121089-6-npiggin@gmail.com> Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz [dwg: Re-enable FWNMI in qtests, since that now works] Signed-off-by: David Gibson --- hw/ppc/spapr_caps.c | 5 +---- tests/qtest/libqos/libqos-spapr.h | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index f626d769a0..679ae7959f 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -516,10 +516,7 @@ static void cap_fwnmi_apply(SpaprMachineState *spapr, uint8_t val, return; /* Disabled by default */ } - if (tcg_enabled()) { - warn_report("Firmware Assisted Non-Maskable Interrupts(FWNMI) not " - "supported in TCG"); - } else if (kvm_enabled()) { + if (kvm_enabled()) { if (kvmppc_set_fwnmi() < 0) { error_setg(errp, "Firmware Assisted Non-Maskable Interrupts(FWNMI) " "not supported by KVM"); diff --git a/tests/qtest/libqos/libqos-spapr.h b/tests/qtest/libqos/libqos-spapr.h index 16174dbada..49bd72d20b 100644 --- a/tests/qtest/libqos/libqos-spapr.h +++ b/tests/qtest/libqos/libqos-spapr.h @@ -12,7 +12,6 @@ void qtest_spapr_shutdown(QOSState *qs); "cap-cfpc=broken," \ "cap-sbbc=broken," \ "cap-ibs=broken," \ - "cap-ccf-assist=off," \ - "cap-fwnmi=off" + "cap-ccf-assist=off," #endif From patchwork Tue Mar 17 10:04:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442475 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0BF5314B4 for ; Tue, 17 Mar 2020 10:22:25 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D6B7A205ED for ; Tue, 17 Mar 2020 10:22:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="NPM2mOm7" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D6B7A205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55830 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Md-00009J-TT for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:22:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47125) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96s-0002xi-2K for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:06:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96q-0002Ew-If for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:06:05 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:47543 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96m-00081J-O7; Tue, 17 Mar 2020 06:06:04 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL33lsSz9sTb; Tue, 17 Mar 2020 21:04:42 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439483; bh=dmNCSb023joqbBJUG6s88uCYWWL25UKE/pXw6CARv/4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NPM2mOm7TU5dhhDBlyBBVYpqLwYZCVfIUJUbHkWSbHQD0oma0prTaFD7BBe4WGIAM JDJBern2G5acy3pKAnlzqKLUAf0+BExXZpe/ognqjt+xTYVUdhjdRc39O2wOboe0Vm l76FdTA9dIydDm7AeTlazdxxXV42MGLPlVX3rXGo= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 42/45] target/ppc: allow ppc_cpu_do_system_reset to take an alternate vector Date: Tue, 17 Mar 2020 21:04:20 +1100 Message-Id: <20200317100423.622643-43-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, Nicholas Piggin , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Nicholas Piggin Provide for an alternate delivery location, -1 defaults to the architected address. Signed-off-by: Nicholas Piggin Message-Id: <20200316142613.121089-7-npiggin@gmail.com> Reviewed-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr.c | 2 +- target/ppc/cpu.h | 2 +- target/ppc/excp_helper.c | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index d22bf54baf..6d65c0797b 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3385,7 +3385,7 @@ static void spapr_machine_finalizefn(Object *obj) void spapr_do_system_reset_on_cpu(CPUState *cs, run_on_cpu_data arg) { cpu_synchronize_state(cs); - ppc_cpu_do_system_reset(cs); + ppc_cpu_do_system_reset(cs, -1); } static void spapr_nmi(NMIState *n, int cpu_index, Error **errp) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 3953680534..f8c7d6f19c 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1220,7 +1220,7 @@ int ppc64_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs, int ppc32_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs, int cpuid, void *opaque); #ifndef CONFIG_USER_ONLY -void ppc_cpu_do_system_reset(CPUState *cs); +void ppc_cpu_do_system_reset(CPUState *cs, target_ulong vector); void ppc_cpu_do_fwnmi_machine_check(CPUState *cs, target_ulong vector); extern const VMStateDescription vmstate_ppc_cpu; #endif diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index 7f2b5899d3..08bc885ca6 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -961,12 +961,15 @@ static void ppc_hw_interrupt(CPUPPCState *env) } } -void ppc_cpu_do_system_reset(CPUState *cs) +void ppc_cpu_do_system_reset(CPUState *cs, target_ulong vector) { PowerPCCPU *cpu = POWERPC_CPU(cs); CPUPPCState *env = &cpu->env; powerpc_excp(cpu, env->excp_model, POWERPC_EXCP_RESET); + if (vector != -1) { + env->nip = vector; + } } void ppc_cpu_do_fwnmi_machine_check(CPUState *cs, target_ulong vector) From patchwork Tue Mar 17 10:04:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442509 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 769EE92A for ; Tue, 17 Mar 2020 10:36:13 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4D8E620663 for ; Tue, 17 Mar 2020 10:36:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="iIMZrzVd" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4D8E620663 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:56234 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9a0-0005X7-Da for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:36:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46628) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96W-0002Ph-MB for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96U-0008Td-Kv for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:05:44 -0400 Received: from ozlabs.org ([203.11.71.1]:41279) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96U-0008DY-79; Tue, 17 Mar 2020 06:05:42 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL34bSpz9sTd; Tue, 17 Mar 2020 21:04:43 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439483; bh=K5aTTPyNTiXqeOFBunos2P9/ndyBJIQYmUSNYf41ZFc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iIMZrzVdNvmPhM6YjcW+ERmTHq82D/SPCh7tlGw1FUDJn+UeeRj63ht8HByWXD021 T3e3EabJdXqFv68QOvZe8RgaOD+hzEN94x+9aqpQvqIXSgumFvshLV4PWwL61HXqEj DxpFRY0POwSZUwLYpEk+qqQ0eTj1Fks1fFpOfYWo= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 43/45] ppc/spapr: Implement FWNMI System Reset delivery Date: Tue, 17 Mar 2020 21:04:21 +1100 Message-Id: <20200317100423.622643-44-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, Nicholas Piggin , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Nicholas Piggin PAPR requires that if "ibm,nmi-register" succeeds, then the hypervisor delivers all system reset and machine check exceptions to the registered addresses. System Resets are delivered with registers set to the architected state, and with no interlock. Signed-off-by: Nicholas Piggin Message-Id: <20200316142613.121089-8-npiggin@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 6d65c0797b..8fcd21ac7b 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -951,7 +951,29 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt) _FDT(fdt_setprop(fdt, rtas, "ibm,max-associativity-domains", maxdomains, sizeof(maxdomains))); - _FDT(fdt_setprop_cell(fdt, rtas, "rtas-size", RTAS_SIZE)); + /* + * FWNMI reserves RTAS_ERROR_LOG_MAX for the machine check error log, + * and 16 bytes per CPU for system reset error log plus an extra 8 bytes. + * + * The system reset requirements are driven by existing Linux and PowerVM + * implementation which (contrary to PAPR) saves r3 in the error log + * structure like machine check, so Linux expects to find the saved r3 + * value at the address in r3 upon FWNMI-enabled sreset interrupt (and + * does not look at the error value). + * + * System reset interrupts are not subject to interlock like machine + * check, so this memory area could be corrupted if the sreset is + * interrupted by a machine check (or vice versa) if it was shared. To + * prevent this, system reset uses per-CPU areas for the sreset save + * area. A system reset that interrupts a system reset handler could + * still overwrite this area, but Linux doesn't try to recover in that + * case anyway. + * + * The extra 8 bytes is required because Linux's FWNMI error log check + * is off-by-one. + */ + _FDT(fdt_setprop_cell(fdt, rtas, "rtas-size", RTAS_ERROR_LOG_MAX + + ms->smp.max_cpus * sizeof(uint64_t)*2 + sizeof(uint64_t))); _FDT(fdt_setprop_cell(fdt, rtas, "rtas-error-log-max", RTAS_ERROR_LOG_MAX)); _FDT(fdt_setprop_cell(fdt, rtas, "rtas-event-scan-rate", @@ -3384,8 +3406,28 @@ static void spapr_machine_finalizefn(Object *obj) void spapr_do_system_reset_on_cpu(CPUState *cs, run_on_cpu_data arg) { + SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); + cpu_synchronize_state(cs); - ppc_cpu_do_system_reset(cs, -1); + /* If FWNMI is inactive, addr will be -1, which will deliver to 0x100 */ + if (spapr->fwnmi_system_reset_addr != -1) { + uint64_t rtas_addr, addr; + PowerPCCPU *cpu = POWERPC_CPU(cs); + CPUPPCState *env = &cpu->env; + + /* get rtas addr from fdt */ + rtas_addr = spapr_get_rtas_addr(); + if (!rtas_addr) { + qemu_system_guest_panicked(NULL); + return; + } + + addr = rtas_addr + RTAS_ERROR_LOG_MAX + cs->cpu_index * sizeof(uint64_t)*2; + stq_be_phys(&address_space_memory, addr, env->gpr[3]); + stq_be_phys(&address_space_memory, addr + sizeof(uint64_t), 0); + env->gpr[3] = addr; + } + ppc_cpu_do_system_reset(cs, spapr->fwnmi_system_reset_addr); } static void spapr_nmi(NMIState *n, int cpu_index, Error **errp) From patchwork Tue Mar 17 10:04:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442513 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 606E992A for ; Tue, 17 Mar 2020 10:41:06 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 37E6520663 for ; Tue, 17 Mar 2020 10:41:06 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="Aus/naQ/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 37E6520663 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:56374 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9ej-0004gw-DP for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:41:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47121) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE96r-0002xR-UQ for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:06:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96q-0002Eh-I8 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:06:05 -0400 Received: from ozlabs.org ([203.11.71.1]:37583) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96o-0008EI-8Y; Tue, 17 Mar 2020 06:06:04 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL36CyJz9sTf; Tue, 17 Mar 2020 21:04:43 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439483; bh=gKwYQwb5HTXse/b5oCF+Tl+1Y9dBwynzr4Ti010BJdU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Aus/naQ/cFH7OfOJV1sxcMZXH86fQtHSvjRYazNFJCE/Iq8P1vr7xcl2j4O00UP5i k3cYxL3/x9H/1Aykan+l3v00laL0xDRpwB6674RhrmpxUQZ2oYu8TzKdn1Wkyb6lwS eC5jxtiOxe4A5DS0MLN2AuEDLFTN53Ssa6oOsFH0= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 44/45] ppc/spapr: Ignore common "ibm,nmi-interlock" Linux bug Date: Tue, 17 Mar 2020 21:04:22 +1100 Message-Id: <20200317100423.622643-45-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, Nicholas Piggin , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Nicholas Piggin Linux kernels call "ibm,nmi-interlock" in their system reset handlers contrary to PAPR. Returning an error because the CPU does not hold the interlock here causes Linux to print warning messages. PowerVM returns success in this case, so do the same for now. Signed-off-by: Nicholas Piggin Message-Id: <20200316142613.121089-9-npiggin@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr_rtas.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 521e6b0b72..9fb8c8632a 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -461,8 +461,18 @@ static void rtas_ibm_nmi_interlock(PowerPCCPU *cpu, } if (spapr->fwnmi_machine_check_interlock != cpu->vcpu_id) { - /* The vCPU that hit the NMI should invoke "ibm,nmi-interlock" */ - rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + /* + * The vCPU that hit the NMI should invoke "ibm,nmi-interlock" + * This should be PARAM_ERROR, but Linux calls "ibm,nmi-interlock" + * for system reset interrupts, despite them not being interlocked. + * PowerVM silently ignores this and returns success here. Returning + * failure causes Linux to print the error "FWNMI: nmi-interlock + * failed: -3", although no other apparent ill effects, this is a + * regression for the user when enabling FWNMI. So for now, match + * PowerVM. When most Linux clients are fixed, this could be + * changed. + */ + rtas_st(rets, 0, RTAS_OUT_SUCCESS); return; } From patchwork Tue Mar 17 10:04:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 11442485 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 54FF0913 for ; Tue, 17 Mar 2020 10:24:33 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E5B0E205ED for ; Tue, 17 Mar 2020 10:24:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b="TKuFXZ9j" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E5B0E205ED Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55890 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE9Oi-0004rk-2x for patchwork-qemu-devel@patchwork.kernel.org; Tue, 17 Mar 2020 06:24:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47348) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jE972-0003IG-BS for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:06:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jE96r-0002JO-H7 for qemu-devel@nongnu.org; Tue, 17 Mar 2020 06:06:16 -0400 Received: from bilbo.ozlabs.org ([2401:3900:2:1::2]:51683 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jE96q-0008S3-6C; Tue, 17 Mar 2020 06:06:05 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 48hTL40TRVz9sTg; Tue, 17 Mar 2020 21:04:43 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1584439484; bh=/C2qYHBP9vUx+WLlav1mxRRNAWvXRY1BO8MgLe+eJ1Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TKuFXZ9jvVHBQeNlg4YxG6d8EmEOaaxcxunB/dgUT0gE11dhC+PDT4cYLzisJP+vI w/j9vDMnHS82P7c7a51v/cnc/vVHjhvHemcnRHzK37ZKSVzedpO/1x/qNp0Ncw81tQ E7kDzcCDg8z6a973gQs/TOTtBaR8RWHVuUoautNk= From: David Gibson To: peter.maydell@linaro.org Subject: [PULL 45/45] pseries: Update SLOF firmware image Date: Tue, 17 Mar 2020 21:04:23 +1100 Message-Id: <20200317100423.622643-46-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200317100423.622643-1-david@gibson.dropbear.id.au> References: <20200317100423.622643-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" From: Alexey Kardashevskiy The only change here is moving the decision about rtas-size to QEMU. Signed-off-by: Alexey Kardashevskiy Signed-off-by: David Gibson --- pc-bios/README | 2 +- pc-bios/slof.bin | Bin 968848 -> 965008 bytes roms/SLOF | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pc-bios/README b/pc-bios/README index bab0e8ec1a..f54c2743d0 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -14,7 +14,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/aik/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20200312. + built from git tag qemu-slof-20200317. - sgabios (the Serial Graphics Adapter option ROM) provides a means for legacy x86 software to communicate with an attached serial console as diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index b87353befa2ec0de2ef405dd1fd89c616f4f054e..40499a1451f4f63f79f64f2457ae62b08d7d66eb 100644 GIT binary patch delta 150415 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 ZUcN@1oKzk@QJ7Tz)DJHC?mf>;|NrE`MR@=K delta 149968 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 H^o#!=xlQEh diff --git a/roms/SLOF b/roms/SLOF index 8d4033d0d2..ab6984f5a6 160000 --- a/roms/SLOF +++ b/roms/SLOF @@ -1 +1 @@ -Subproject commit 8d4033d0d2e5b434fe14a81d5192cdb1911469e4 +Subproject commit ab6984f5a6d054e1f634dda855b32e5357111974