From patchwork Mon Jun 28 14:35:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 12348139 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 98886C49EAB for ; Mon, 28 Jun 2021 14:38: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 4EDAC61C75 for ; Mon, 28 Jun 2021 14:38:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4EDAC61C75 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.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 1lxsPG-0005uN-HZ for qemu-devel@archiver.kernel.org; Mon, 28 Jun 2021 10:38:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58244) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lxsMe-0007c6-1C for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:35:56 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]:43006) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lxsMc-0000aC-4f for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:35:55 -0400 Received: by mail-pl1-x62c.google.com with SMTP id v13so9037360ple.9 for ; Mon, 28 Jun 2021 07:35:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=0RIZcAGtf2wk/6EK7iE6Gu5hPUTlpTApAXivA9sXxo8=; b=pYJuM5EJDJ729E3hLZOpJevEVDKWLhVasz/blIA2qljmlaegNewTdQt1tB/srC3ScQ aa1G/kpTh2T2wLNuupq0DJl335gE53nbx6KsRqCFhqHHncg9q1CaIGpJCSlGWPGmMxum vTYsR1Pv5dYmnx+Rs4TmDUle1d1uOcMPhqzqxplDzJ3N0yleugx4w8RIg/TkFHimUdwY p7PaMeXVWaothqR4zKT7cKJPQHRcFNcYc5bpuqS9XUn6idYVfNkYRumQI8ia/dkHCHDU tqK+i9vzSVIBQz+hOo+fjYlwug2r1oQ1O65Ky6tbmQDJsquVWRDkvpFKANvOjGkZT32h BHWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0RIZcAGtf2wk/6EK7iE6Gu5hPUTlpTApAXivA9sXxo8=; b=fGDz5DGwGi6HHWHYnfj29iud7k++0zJI0TQeM33oBs/u4zrQVKSeLlHmQw7B8b0FG6 1qQsIc+8wPHFzCkfTyqb/X2flwnoCfWh3No7HyDJZjQ0Y8HJBM/aW4NxmkkzmM4EctH1 kV7U2PvoEDgV5BQ+EiVqB7xWcJSNdVMYBvp/GTiRSCKazNkd5xZ/WEzivjCNfDEfBdfJ Ysf0Z3F7bF+YahtKuMzXgRU5HaVB3QZG2iv0C3t6FE1buB1Ppz55oIkXLEz0HtB88yqa zy4OEWj2AeD3xNissME8CuXTmeIFHJMEdBvgqjkTs7DYpWHpanuaISbQtf0X7OSD3ulq 94Zw== X-Gm-Message-State: AOAM532GyXQLF6U0PxqN9RlLEGZnG0skIuoWE0jnTYeBYgWJvoSsvcFw De/b/gfBznWjO5xzloWJ0J1YVu7yCvT0vA== X-Google-Smtp-Source: ABdhPJxPNmRB2fFWmDqarz1CqekWQ/iOmympp/Wk42PGua5bnBokhHTZTLyqfSINBIdxY0oplAn6tQ== X-Received: by 2002:a17:90a:d3d2:: with SMTP id d18mr38272250pjw.102.1624890952883; Mon, 28 Jun 2021 07:35:52 -0700 (PDT) Received: from localhost.localdomain ([71.212.149.176]) by smtp.gmail.com with ESMTPSA id k13sm72779pgh.82.2021.06.28.07.35.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 07:35:52 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PULL 1/5] hw/alpha: Set minimum PCI device ID to 1 to match Clipper IRQ mappings Date: Mon, 28 Jun 2021 07:35:47 -0700 Message-Id: <20210628143551.2870006-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210628143551.2870006-1-richard.henderson@linaro.org> References: <20210628143551.2870006-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: peter.maydell@linaro.org, Jason Thorpe Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Jason Thorpe Since we are emulating a Clipper device topology, we need to set the minimum PCI device ID to 1, as there is no IRQ mapping for a device at ID 0 (see sys_dp264.c:clipper_map_irq()). - Add a 'devfn_min' argument to typhoon_init(). Pass that argument along to pci_register_root_bus(). - In clipper_init(), pass PCI_DEVFN(1, 0) as the minimum PCI device ID/function. Signed-off-by: Jason Thorpe Message-Id: <20210613211549.18094-3-thorpej@me.com> Signed-off-by: Richard Henderson --- hw/alpha/alpha_sys.h | 2 +- hw/alpha/dp264.c | 7 +++++-- hw/alpha/typhoon.c | 5 +++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/hw/alpha/alpha_sys.h b/hw/alpha/alpha_sys.h index e2c02e2bbe..4835b3d5ee 100644 --- a/hw/alpha/alpha_sys.h +++ b/hw/alpha/alpha_sys.h @@ -11,7 +11,7 @@ PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4], - pci_map_irq_fn); + pci_map_irq_fn, uint8_t devfn_min); /* alpha_pci.c. */ extern const MemoryRegionOps alpha_pci_ignore_ops; diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c index 1017ecf330..010d22476b 100644 --- a/hw/alpha/dp264.c +++ b/hw/alpha/dp264.c @@ -76,9 +76,12 @@ static void clipper_init(MachineState *machine) cpus[0]->env.trap_arg1 = 0; cpus[0]->env.trap_arg2 = smp_cpus; - /* Init the chipset. */ + /* + * Init the chipset. Because we're using CLIPPER IRQ mappings, + * the minimum PCI device IdSel is 1. + */ pci_bus = typhoon_init(machine->ram, &isa_bus, &rtc_irq, cpus, - clipper_pci_map_irq); + clipper_pci_map_irq, PCI_DEVFN(1, 0)); /* Since we have an SRM-compatible PALcode, use the SRM epoch. */ mc146818_rtc_init(isa_bus, 1900, rtc_irq); diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c index 87020cbe0d..fa31a2f286 100644 --- a/hw/alpha/typhoon.c +++ b/hw/alpha/typhoon.c @@ -815,7 +815,8 @@ static void typhoon_alarm_timer(void *opaque) } PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq, - AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq) + AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq, + uint8_t devfn_min) { MemoryRegion *addr_space = get_system_memory(); DeviceState *dev; @@ -885,7 +886,7 @@ PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq, b = pci_register_root_bus(dev, "pci", typhoon_set_irq, sys_map_irq, s, &s->pchip.reg_mem, &s->pchip.reg_io, - 0, 64, TYPE_PCI_BUS); + devfn_min, 64, TYPE_PCI_BUS); phb->bus = b; sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); From patchwork Mon Jun 28 14:35:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 12348129 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D6127C2B9F4 for ; Mon, 28 Jun 2021 14:37:11 +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 9B0FB61CD5 for ; Mon, 28 Jun 2021 14:37:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B0FB61CD5 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:49902 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lxsNq-0001et-Ku for qemu-devel@archiver.kernel.org; Mon, 28 Jun 2021 10:37:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58276) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lxsMf-0007cG-3t for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:35:57 -0400 Received: from mail-pj1-x1033.google.com ([2607:f8b0:4864:20::1033]:46706) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lxsMc-0000bs-Te for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:35:56 -0400 Received: by mail-pj1-x1033.google.com with SMTP id b5-20020a17090a9905b029016fc06f6c5bso128549pjp.5 for ; Mon, 28 Jun 2021 07:35:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/oq/GCJo3ej444ufvYE37nA1CpuIBiVrhB+99DMw+hU=; b=m/HGN5MlUzgE6KEdyfeDbS8I8hbnNkAHaqGURau0oRDRQOVyDvf7XODNw962J2sriv mGYGqbg9eG3JPMgk/0+5P+mrVCGBqFSxPKjR1TaGqr0ukyFu+Dje0kqu8PkXnyfWim7o JzcLA32H8fuzyNYqF/vZopRw5BmQp1yGAOCgJBtvuJn3Ute6rR1uckaMblqMnshqjtLB ulvLDSzDD8X1p5hW8s/yliCAVwVUbYDK3xP7V/BhjH1w66d+teJjoyIaNDlazdK3Y+7I mP8fRbVmkoWxCLihxLGraIyBD6NUwBvzWrM9PBW5aNJg/K2hJWgaYobT6WBbM9IawwAD dBnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/oq/GCJo3ej444ufvYE37nA1CpuIBiVrhB+99DMw+hU=; b=V8DcyfrfRa+6A7rFhmEG2pHJ2ns/uA+Zf0TYIEnA5c4QCkcbS1CFEQnmLpnRZ43EyC jwbnpIoEuWaJavZM6CEG0XsG5rhE/LozCoPE7RE8ta3FqWpUv+nxlt9W7CbiHch95nMO 4xa42BAz3pE7/+mrEGnZr5yo+lxwBBOEIwXCq0bBEucRIXaFFviL5a2D+WCOVAmX1xPz 4+p+S+X7CB9p2QGzPi4KG7/X3DH63arWT90SDNrM+xmPQmYenHbq9u0LGUWn31sW5Qj8 Mi90GZf6K/IvYH3nX/EH/3ZhEMEMupfiMEfKTfLywwhtRNaWtiqsrygheUibP/a+9Fqv Zk8A== X-Gm-Message-State: AOAM531QeKxD9cjRGdsCwaTUTlatAaraLKdOxkxsEa3e9e1SLCdwE61M 0u205N3WMGbvHYvOrJ4UfhXtVSfRPSd7JA== X-Google-Smtp-Source: ABdhPJwbfzqALaTQ2BJ1jUJRdooGzS94hHNVbhjr8oD/4h/bC8IHXVAJQmR39LwqIc2+zFp8bWT8JQ== X-Received: by 2002:a17:902:b210:b029:11a:bf7b:1a83 with SMTP id t16-20020a170902b210b029011abf7b1a83mr23017375plr.84.1624890953688; Mon, 28 Jun 2021 07:35:53 -0700 (PDT) Received: from localhost.localdomain ([71.212.149.176]) by smtp.gmail.com with ESMTPSA id k13sm72779pgh.82.2021.06.28.07.35.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 07:35:53 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PULL 2/5] hw/alpha: Provide console information to the PALcode at start-up Date: Mon, 28 Jun 2021 07:35:48 -0700 Message-Id: <20210628143551.2870006-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210628143551.2870006-1-richard.henderson@linaro.org> References: <20210628143551.2870006-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::1033; envelope-from=richard.henderson@linaro.org; helo=mail-pj1-x1033.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: peter.maydell@linaro.org, Jason Thorpe Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Jason Thorpe Redefine the a2 register passed by Qemu at start-up to also include some configuration flags, in addition to the CPU count, and define a flag to mirror the "-nographic" option. Signed-off-by: Jason Thorpe Message-Id: <20210613211549.18094-5-thorpej@me.com> Signed-off-by: Richard Henderson --- hw/alpha/dp264.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c index 010d22476b..316f0691cd 100644 --- a/hw/alpha/dp264.c +++ b/hw/alpha/dp264.c @@ -72,9 +72,19 @@ static void clipper_init(MachineState *machine) cpus[i] = ALPHA_CPU(cpu_create(machine->cpu_type)); } + /* + * arg0 -> memory size + * arg1 -> kernel entry point + * arg2 -> config word + * + * Config word: bits 0-5 -> ncpus + * bit 6 -> nographics option (for HWRPB CTB) + * + * See init_hwrpb() in the PALcode. + */ cpus[0]->env.trap_arg0 = ram_size; cpus[0]->env.trap_arg1 = 0; - cpus[0]->env.trap_arg2 = smp_cpus; + cpus[0]->env.trap_arg2 = smp_cpus | (!machine->enable_graphics << 6); /* * Init the chipset. Because we're using CLIPPER IRQ mappings, From patchwork Mon Jun 28 14:35:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 12348131 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0F3D2C2B9F4 for ; Mon, 28 Jun 2021 14:37:16 +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 AD29E61D34 for ; Mon, 28 Jun 2021 14:37:13 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AD29E61D34 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:50098 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lxsNs-0001mT-T4 for qemu-devel@archiver.kernel.org; Mon, 28 Jun 2021 10:37:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58290) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lxsMg-0007dQ-3w for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:35:58 -0400 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]:39767) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lxsMd-0000ce-GS for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:35:57 -0400 Received: by mail-pl1-x630.google.com with SMTP id d1so8405507plg.6 for ; Mon, 28 Jun 2021 07:35:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bHxD8qeEAlVIf2aUTicni+fSY9kjYBTFskhADVFY3eY=; b=IpErAsfOCy+nl7K9+Rran74y7ZCFhIeSoOglV5J7Pkb2Z9G5OPMGmqA2Rnb7kpAiis IXhc4+38TsjFvo1E69N9hBaxxxX18SW2bVTrT6D1SgM6+sHj6F0td4Js5Z9KrZPBPr4m cYXPNcs+uRtGXn+ksfNEntvt+r8KQcD+uPh09Pl3yvlxjJeMdats2wNCIYU0e/Hzyvmd IIPL8Gs4qi03ofMkCxSVaxdK4QJw619IVaEW8+qpNQal3zxRvfzJ2eYr3gNiBaoxh4re twQpb6yjvHGvNI2pEoXRkIzYK919aYwnDyTHcici5wLLpbYBr/ZAXDas7kRXSS+Arh4F jctQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bHxD8qeEAlVIf2aUTicni+fSY9kjYBTFskhADVFY3eY=; b=j3k1WMhSh8GCs0lx5lN/oKWa0LM9yadcC30oG1eYVbAgI959FY08rpKPSuXBoKtj4A c2m6WM7i7z2My34kf2Ndvoq0hgqy8fAmzDJtOfsu7YtxCnJMOZYqFtZgupyS/3cfJPzI qjyeVbgMmbLSd3nP/wrrVYjipdxV/4vwaBW0lhXMnCFOcwBAlVBESvAo9IKTgubib6pr 3zUo9u2Ans+JhTDoUqttjSBqhilHs4EErxFDwQMb5ohyaQYP3xD3paPeG63kvW699l3w cowfhaDvGeiWlt7pPpOHj5ffpQPgIbQLCs9nZAa+KDdKWU412Kf26/aInpOiMoT23UUP RRDw== X-Gm-Message-State: AOAM533rYOU2uA6MwepD1FRJ+6RYC+tbtgBahcrqCSP3RyHSdkUcyOhX RHVMP+dAK5GUr3N556dhb8VbzcO22n3/Gw== X-Google-Smtp-Source: ABdhPJzTE6TceflJ5tPABx2KW/HX8svh0JZddUSvrbDScciQ+ZeF3a9apvkjgiDgoTkjqwbIH6kKpA== X-Received: by 2002:a17:902:b198:b029:11b:2246:e374 with SMTP id s24-20020a170902b198b029011b2246e374mr23142896plr.17.1624890954219; Mon, 28 Jun 2021 07:35:54 -0700 (PDT) Received: from localhost.localdomain ([71.212.149.176]) by smtp.gmail.com with ESMTPSA id k13sm72779pgh.82.2021.06.28.07.35.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 07:35:54 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PULL 3/5] hw/alpha: Provide a PCI-ISA bridge device node Date: Mon, 28 Jun 2021 07:35:49 -0700 Message-Id: <20210628143551.2870006-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210628143551.2870006-1-richard.henderson@linaro.org> References: <20210628143551.2870006-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::630; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x630.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: peter.maydell@linaro.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Jason Thorpe Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Jason Thorpe - Move initialization of the ISA bus from typhoon_init() to clipper_init(); this apsect of device topology is really associated with the individual model, not the core logic chipset. typhoon_init() now returns the IRQ to use for the output of the ISA PIC. - In clipper_init(), instantiate an i82378 instance, and connect its PIC output to the ISA IRQ input provided by typhoon_init(). Remove the explicit instantiations of i8254 and i82374, as these devices are subsumed by the i82378. Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Jason Thorpe Message-Id: <20210616141538.25436-1-thorpej@me.com> [rth: Remove direct dependencies on i82374, i8254, i8259.] Signed-off-by: Richard Henderson --- hw/alpha/alpha_sys.h | 2 +- hw/alpha/dp264.c | 38 ++++++++++++++++++++++++++++++-------- hw/alpha/typhoon.c | 19 ++++--------------- hw/alpha/Kconfig | 4 +--- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/hw/alpha/alpha_sys.h b/hw/alpha/alpha_sys.h index 4835b3d5ee..2263e821da 100644 --- a/hw/alpha/alpha_sys.h +++ b/hw/alpha/alpha_sys.h @@ -10,7 +10,7 @@ #include "hw/intc/i8259.h" -PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4], +PCIBus *typhoon_init(MemoryRegion *, qemu_irq *, qemu_irq *, AlphaCPU *[4], pci_map_irq_fn, uint8_t devfn_min); /* alpha_pci.c. */ diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c index 316f0691cd..c78ed96d0e 100644 --- a/hw/alpha/dp264.c +++ b/hw/alpha/dp264.c @@ -15,9 +15,7 @@ #include "qemu/error-report.h" #include "hw/rtc/mc146818rtc.h" #include "hw/ide/pci.h" -#include "hw/timer/i8254.h" #include "hw/isa/superio.h" -#include "hw/dma/i8257.h" #include "net/net.h" #include "qemu/cutils.h" #include "qemu/datadir.h" @@ -58,8 +56,10 @@ static void clipper_init(MachineState *machine) AlphaCPU *cpus[4]; PCIBus *pci_bus; PCIDevice *pci_dev; + DeviceState *i82378_dev; ISABus *isa_bus; qemu_irq rtc_irq; + qemu_irq isa_irq; long size, i; char *palcode_filename; uint64_t palcode_entry; @@ -90,14 +90,39 @@ static void clipper_init(MachineState *machine) * Init the chipset. Because we're using CLIPPER IRQ mappings, * the minimum PCI device IdSel is 1. */ - pci_bus = typhoon_init(machine->ram, &isa_bus, &rtc_irq, cpus, + pci_bus = typhoon_init(machine->ram, &isa_irq, &rtc_irq, cpus, clipper_pci_map_irq, PCI_DEVFN(1, 0)); + /* + * Init the PCI -> ISA bridge. + * + * Technically, PCI-based Alphas shipped with one of three different + * PCI-ISA bridges: + * + * - Intel i82378 SIO + * - Cypress CY82c693UB + * - ALI M1533 + * + * (An Intel i82375 PCI-EISA bridge was also used on some models.) + * + * For simplicity, we model an i82378 here, even though it wouldn't + * have been on any Tsunami/Typhoon systems; it's close enough, and + * we don't want to deal with modelling the CY82c693UB (which has + * incompatible edge/level control registers, plus other peripherals + * like IDE and USB) or the M1533 (which also has IDE and USB). + * + * Importantly, we need to provide a PCI device node for it, otherwise + * some operating systems won't notice there's an ISA bus to configure. + */ + i82378_dev = DEVICE(pci_create_simple(pci_bus, PCI_DEVFN(7, 0), "i82378")); + isa_bus = ISA_BUS(qdev_get_child_bus(i82378_dev, "isa.0")); + + /* Connect the ISA PIC to the Typhoon IRQ used for ISA interrupts. */ + qdev_connect_gpio_out(i82378_dev, 0, isa_irq); + /* Since we have an SRM-compatible PALcode, use the SRM epoch. */ mc146818_rtc_init(isa_bus, 1900, rtc_irq); - i8254_pit_init(isa_bus, 0x40, 0, NULL); - /* VGA setup. Don't bother loading the bios. */ pci_vga_init(pci_bus); @@ -106,9 +131,6 @@ static void clipper_init(MachineState *machine) pci_nic_init_nofail(&nd_table[i], pci_bus, "e1000", NULL); } - /* 2 82C37 (dma) */ - isa_create_simple(isa_bus, "i82374"); - /* Super I/O */ isa_create_simple(isa_bus, TYPE_SMC37C669_SUPERIO); diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c index fa31a2f286..bd39c8ca86 100644 --- a/hw/alpha/typhoon.c +++ b/hw/alpha/typhoon.c @@ -814,9 +814,9 @@ static void typhoon_alarm_timer(void *opaque) cpu_interrupt(CPU(s->cchip.cpu[cpu]), CPU_INTERRUPT_TIMER); } -PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq, - AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq, - uint8_t devfn_min) +PCIBus *typhoon_init(MemoryRegion *ram, qemu_irq *p_isa_irq, + qemu_irq *p_rtc_irq, AlphaCPU *cpus[4], + pci_map_irq_fn sys_map_irq, uint8_t devfn_min) { MemoryRegion *addr_space = get_system_memory(); DeviceState *dev; @@ -844,6 +844,7 @@ PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq, } } + *p_isa_irq = qemu_allocate_irq(typhoon_set_isa_irq, s, 0); *p_rtc_irq = qemu_allocate_irq(typhoon_set_timer_irq, s, 0); /* Main memory region, 0x00.0000.0000. Real hardware supports 32GB, @@ -919,18 +920,6 @@ PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq, /* Pchip1 PCI I/O, 0x802.FC00.0000, 32MB. */ /* Pchip1 PCI configuration, 0x802.FE00.0000, 16MB. */ - /* Init the ISA bus. */ - /* ??? Technically there should be a cy82c693ub pci-isa bridge. */ - { - qemu_irq *isa_irqs; - - *isa_bus = isa_bus_new(NULL, get_system_memory(), &s->pchip.reg_io, - &error_abort); - isa_irqs = i8259_init(*isa_bus, - qemu_allocate_irq(typhoon_set_isa_irq, s, 0)); - isa_bus_irqs(*isa_bus, isa_irqs); - } - return b; } diff --git a/hw/alpha/Kconfig b/hw/alpha/Kconfig index 15c59ff264..9af650c94e 100644 --- a/hw/alpha/Kconfig +++ b/hw/alpha/Kconfig @@ -3,9 +3,7 @@ config DP264 imply PCI_DEVICES imply TEST_DEVICES imply E1000_PCI - select I82374 - select I8254 - select I8259 + select I82378 select IDE_CMD646 select MC146818RTC select PCI From patchwork Mon Jun 28 14:35:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 12348133 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,LOTS_OF_MONEY,MAILING_LIST_MULTI,NORMAL_HTTP_TO_IP, NUMERIC_HTTP_ADDR,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5154DC49361 for ; Mon, 28 Jun 2021 14:37: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 C1F6061D40 for ; Mon, 28 Jun 2021 14:37:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C1F6061D40 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:51200 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lxsO7-0002WF-00 for qemu-devel@archiver.kernel.org; Mon, 28 Jun 2021 10:37:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58322) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lxsMl-0007u5-AU for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:36:03 -0400 Received: from mail-pj1-x1032.google.com ([2607:f8b0:4864:20::1032]:45965) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lxsMe-0000eK-Rx for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:36:03 -0400 Received: by mail-pj1-x1032.google.com with SMTP id z3-20020a17090a3983b029016bc232e40bso131932pjb.4 for ; Mon, 28 Jun 2021 07:35:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=LfdYk51K1595b0RWOYp7awJ+sVFa31MPp8ETbOsCfpg=; b=y7d16mvN+UM8a2w/zJUabrrxvuA0U08+ghc509f44Fei/GmbxoJtXHCNRaLhvXlFYa AX90qkOyui0fZ6Ph7L+ZZ6oytKuHijjn85tud33J3xqWel8GwVuI09/SjGb8Vp5SRxLw T51jMHRaWM61gvBIjgSG8TH0xdZtaGDy9DpOgMYKyeo3gH26ujww4giRkNr7QEYDD5zo +c3ZKNFQiLkdNcRY1M+zPheTrPMDKlZUiK/G0SXvv0/fIyOVmG6/mUQxDbyZVctdeecY 1EE0lrGSN/QsNxCvtbJydMTK7TM3YiR9jiJw8YalVsBS9Q/a4a8QPhqKEiNngNDyxEkx yR1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=LfdYk51K1595b0RWOYp7awJ+sVFa31MPp8ETbOsCfpg=; b=KLKizZEmZiGNRoNlWJX+DpaRiRuODqR0eZfnS9EURplknBPBzkBai+3k0KU643FHZx KjNsrISgV9c2/MYXR1UOICu9edvd4PK+KPTobHJxiaUo8gircI70+rLNZJnMNb8sidfb y4MkRKAa8vVEJehxGNYFHvlhV6K5OqhkMUlH3XL/ENEA8YrKggB6NREvbFRMvC0Yeqqb nbcM+PjmAGAs4HgxyNZM9NNOOv0ell3NxqEpdkUUWbfj/34twjGV8A0K6vrIzm04lbKY y/tVX4f8qNxWk+V3VrjkqzexxIaMTJGjoxxEjNYzGR7odyPclJtMVBWhiO6asDAsEnJT DcoA== X-Gm-Message-State: AOAM533UTS62pYV5sngGJvXlzx98gjVdmMagU5d7bpnySssM79cjLNXb 0ilB1LjUN7a3x4h7akRDwAKRx1uzahvo8A== X-Google-Smtp-Source: ABdhPJzcM33TTofNyQB+7NT1v86aNnIkwmH9UKbqJB0v3dnEzY9Oq2uXmFf6udCf4bs0eycpXdGQMQ== X-Received: by 2002:a17:903:1243:b029:ed:8298:7628 with SMTP id u3-20020a1709031243b02900ed82987628mr22709517plh.11.1624890955037; Mon, 28 Jun 2021 07:35:55 -0700 (PDT) Received: from localhost.localdomain ([71.212.149.176]) by smtp.gmail.com with ESMTPSA id k13sm72779pgh.82.2021.06.28.07.35.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 07:35:54 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PULL 4/5] pc-bios: Update the palcode-clipper image Date: Mon, 28 Jun 2021 07:35:50 -0700 Message-Id: <20210628143551.2870006-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210628143551.2870006-1-richard.henderson@linaro.org> References: <20210628143551.2870006-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::1032; envelope-from=richard.henderson@linaro.org; helo=mail-pj1-x1032.google.com X-Spam_score_int: 6 X-Spam_score: 0.6 X-Spam_bar: / X-Spam_report: (0.6 / 5.0 requ) BAYES_50=0.8, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Build a new palcode image with Jason Thorpe's patches to support NetBSD. Signed-off-by: Richard Henderson --- pc-bios/palcode-clipper | Bin 156328 -> 153728 bytes roms/qemu-palcode | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pc-bios/palcode-clipper b/pc-bios/palcode-clipper index b7dbc5d88c14b0191d34f76f79fb6cb7eb1f3327..aecb30403641e1f2acac0bfd472174d06fa1da5f 100644 GIT binary patch literal 153728 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%0Dt;DMw^WL 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 Qn{@u8nXDYLa$ETS0R=@1N&o-= literal 156328 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 X-Patchwork-Id: 12348141 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-20.9 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3A786C49EA3 for ; Mon, 28 Jun 2021 14:39:51 +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 A26EF610EA for ; Mon, 28 Jun 2021 14:39:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A26EF610EA Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:58478 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lxsQP-0007No-Si for qemu-devel@archiver.kernel.org; Mon, 28 Jun 2021 10:39:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58300) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lxsMh-0007iV-S6 for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:35:59 -0400 Received: from mail-pf1-x42e.google.com ([2607:f8b0:4864:20::42e]:44551) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lxsMf-0000eX-68 for qemu-devel@nongnu.org; Mon, 28 Jun 2021 10:35:59 -0400 Received: by mail-pf1-x42e.google.com with SMTP id g21so12550569pfc.11 for ; Mon, 28 Jun 2021 07:35:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Vp5736yOMydpKE1zQPGNndbyR0U6Z095Dt0H0/Paj6Y=; b=orfKHyrlZyhndv5eILwIzBfsEsOFq7XNNkSS0KETReMEFJX5P5UmU6hcgOteJke9+Q VDcBAp2+YI119xKF9bratfcKjdH+clxRM6LPz//1hLdiaOaA6a7u+xVyibQmqGiotWYE 6AH1QsqCeB0fbInN6z6Mqz1SWeD4BOMYQZJJC5PPchcZ4orROBYUvpz8qj2WqNivjrYJ B0TYz/YFVR1AIoncsxa3jOWpG2lHmq3vLkqCQU+LMidkZLWnMVcIn0uYVkppSdjkBR8i WPm0XvHLwN609chz3CYRck2O0pDQgZmKFz1K+helCUb9U2ZusqC0eTY2rqixq6IRvdTQ LTjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Vp5736yOMydpKE1zQPGNndbyR0U6Z095Dt0H0/Paj6Y=; b=UjQZYJb0g895cNW8ZHmpt5VA4XwLmEB075ZClbLX3jyfvnqiR7t9ceA+rV0nwUf8Rm PI3ydnMZ9fRvGsf7tHO/kwOPSpA10Lswd/k1Ee/ZI1C0u1Zj5t057Dqa9DoG4+GBqsPd 6Qk1OWdUMxD5LZFXMnpRhAv2vizPONigZ9SuyeIC/QGBr8ZpmhT6DaTQmxDS/WzxmTGZ JPv2f4Yb0cqXPoK6ERsWQ3ukI41K8eW0yszhaWXwT5NotcLl1tmSDIHC+fsA2hMnaQDN Vm2S4ulJwUE5qDs3OCH/l/yenfdEdP+/DzO6EeRsErP74ES1Eispqo9o+5/f23n7eeNZ QA3Q== X-Gm-Message-State: AOAM5319h74xuVRIdlJfWYbkvIO21RfkESmasES4VimnnUHYUNA1Ta65 E9ZN5mFQW+6k9S1BBLejsvmP+/vYCfZbTw== X-Google-Smtp-Source: ABdhPJw/LRbqwQr2de6jKyexkrAM9UdDCYmjhOk5Y4KyOKsO4Ow1C5rq02siqjyg5pp5omjYd3QXUQ== X-Received: by 2002:a65:454b:: with SMTP id x11mr23711537pgr.48.1624890955766; Mon, 28 Jun 2021 07:35:55 -0700 (PDT) Received: from localhost.localdomain ([71.212.149.176]) by smtp.gmail.com with ESMTPSA id k13sm72779pgh.82.2021.06.28.07.35.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 07:35:55 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PULL 5/5] target/alpha: Honor the FEN bit Date: Mon, 28 Jun 2021 07:35:51 -0700 Message-Id: <20210628143551.2870006-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210628143551.2870006-1-richard.henderson@linaro.org> References: <20210628143551.2870006-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::42e; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x42e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: peter.maydell@linaro.org, Jason Thorpe Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" This bit is used by NetBSD for lazy fpu migration. Tested-by: Jason Thorpe Reported-by: Jason Thorpe Resolves: https://gitlab.com/qemu-project/qemu/-/issues/438 Signed-off-by: Richard Henderson --- target/alpha/translate.c | 75 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/target/alpha/translate.c b/target/alpha/translate.c index f454adea5e..f2922f5f8c 100644 --- a/target/alpha/translate.c +++ b/target/alpha/translate.c @@ -1471,6 +1471,13 @@ static DisasJumpType gen_mtpr(DisasContext *ctx, TCGv vb, int regno) } \ } while (0) +#define REQUIRE_FEN \ + do { \ + if (!(ctx->tbflags & ENV_FLAG_FEN)) { \ + goto raise_fen; \ + } \ + } while (0) + static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) { int32_t disp21, disp16, disp12 __attribute__((unused)); @@ -2066,6 +2073,7 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) case 0x04: /* ITOFS */ REQUIRE_REG_31(rb); + REQUIRE_FEN; t32 = tcg_temp_new_i32(); va = load_gpr(ctx, ra); tcg_gen_extrl_i64_i32(t32, va); @@ -2075,17 +2083,20 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) case 0x0A: /* SQRTF */ REQUIRE_REG_31(ra); + REQUIRE_FEN; vb = load_fpr(ctx, rb); gen_helper_sqrtf(vc, cpu_env, vb); break; case 0x0B: /* SQRTS */ REQUIRE_REG_31(ra); + REQUIRE_FEN; gen_sqrts(ctx, rb, rc, fn11); break; case 0x14: /* ITOFF */ REQUIRE_REG_31(rb); + REQUIRE_FEN; t32 = tcg_temp_new_i32(); va = load_gpr(ctx, ra); tcg_gen_extrl_i64_i32(t32, va); @@ -2095,18 +2106,21 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) case 0x24: /* ITOFT */ REQUIRE_REG_31(rb); + REQUIRE_FEN; va = load_gpr(ctx, ra); tcg_gen_mov_i64(vc, va); break; case 0x2A: /* SQRTG */ REQUIRE_REG_31(ra); + REQUIRE_FEN; vb = load_fpr(ctx, rb); gen_helper_sqrtg(vc, cpu_env, vb); break; case 0x02B: /* SQRTT */ REQUIRE_REG_31(ra); + REQUIRE_FEN; gen_sqrtt(ctx, rb, rc, fn11); break; default: @@ -2123,18 +2137,22 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) switch (fpfn) { /* fn11 & 0x3F */ case 0x00: /* ADDF */ + REQUIRE_FEN; gen_helper_addf(vc, cpu_env, va, vb); break; case 0x01: /* SUBF */ + REQUIRE_FEN; gen_helper_subf(vc, cpu_env, va, vb); break; case 0x02: /* MULF */ + REQUIRE_FEN; gen_helper_mulf(vc, cpu_env, va, vb); break; case 0x03: /* DIVF */ + REQUIRE_FEN; gen_helper_divf(vc, cpu_env, va, vb); break; case 0x1E: @@ -2143,35 +2161,43 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) goto invalid_opc; case 0x20: /* ADDG */ + REQUIRE_FEN; gen_helper_addg(vc, cpu_env, va, vb); break; case 0x21: /* SUBG */ + REQUIRE_FEN; gen_helper_subg(vc, cpu_env, va, vb); break; case 0x22: /* MULG */ + REQUIRE_FEN; gen_helper_mulg(vc, cpu_env, va, vb); break; case 0x23: /* DIVG */ + REQUIRE_FEN; gen_helper_divg(vc, cpu_env, va, vb); break; case 0x25: /* CMPGEQ */ + REQUIRE_FEN; gen_helper_cmpgeq(vc, cpu_env, va, vb); break; case 0x26: /* CMPGLT */ + REQUIRE_FEN; gen_helper_cmpglt(vc, cpu_env, va, vb); break; case 0x27: /* CMPGLE */ + REQUIRE_FEN; gen_helper_cmpgle(vc, cpu_env, va, vb); break; case 0x2C: /* CVTGF */ REQUIRE_REG_31(ra); + REQUIRE_FEN; gen_helper_cvtgf(vc, cpu_env, vb); break; case 0x2D: @@ -2181,16 +2207,19 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) case 0x2F: /* CVTGQ */ REQUIRE_REG_31(ra); + REQUIRE_FEN; gen_helper_cvtgq(vc, cpu_env, vb); break; case 0x3C: /* CVTQF */ REQUIRE_REG_31(ra); + REQUIRE_FEN; gen_helper_cvtqf(vc, cpu_env, vb); break; case 0x3E: /* CVTQG */ REQUIRE_REG_31(ra); + REQUIRE_FEN; gen_helper_cvtqg(vc, cpu_env, vb); break; default: @@ -2203,54 +2232,67 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) switch (fpfn) { /* fn11 & 0x3F */ case 0x00: /* ADDS */ + REQUIRE_FEN; gen_adds(ctx, ra, rb, rc, fn11); break; case 0x01: /* SUBS */ + REQUIRE_FEN; gen_subs(ctx, ra, rb, rc, fn11); break; case 0x02: /* MULS */ + REQUIRE_FEN; gen_muls(ctx, ra, rb, rc, fn11); break; case 0x03: /* DIVS */ + REQUIRE_FEN; gen_divs(ctx, ra, rb, rc, fn11); break; case 0x20: /* ADDT */ + REQUIRE_FEN; gen_addt(ctx, ra, rb, rc, fn11); break; case 0x21: /* SUBT */ + REQUIRE_FEN; gen_subt(ctx, ra, rb, rc, fn11); break; case 0x22: /* MULT */ + REQUIRE_FEN; gen_mult(ctx, ra, rb, rc, fn11); break; case 0x23: /* DIVT */ + REQUIRE_FEN; gen_divt(ctx, ra, rb, rc, fn11); break; case 0x24: /* CMPTUN */ + REQUIRE_FEN; gen_cmptun(ctx, ra, rb, rc, fn11); break; case 0x25: /* CMPTEQ */ + REQUIRE_FEN; gen_cmpteq(ctx, ra, rb, rc, fn11); break; case 0x26: /* CMPTLT */ + REQUIRE_FEN; gen_cmptlt(ctx, ra, rb, rc, fn11); break; case 0x27: /* CMPTLE */ + REQUIRE_FEN; gen_cmptle(ctx, ra, rb, rc, fn11); break; case 0x2C: REQUIRE_REG_31(ra); + REQUIRE_FEN; if (fn11 == 0x2AC || fn11 == 0x6AC) { /* CVTST */ gen_cvtst(ctx, rb, rc, fn11); @@ -2262,16 +2304,19 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) case 0x2F: /* CVTTQ */ REQUIRE_REG_31(ra); + REQUIRE_FEN; gen_cvttq(ctx, rb, rc, fn11); break; case 0x3C: /* CVTQS */ REQUIRE_REG_31(ra); + REQUIRE_FEN; gen_cvtqs(ctx, rb, rc, fn11); break; case 0x3E: /* CVTQT */ REQUIRE_REG_31(ra); + REQUIRE_FEN; gen_cvtqt(ctx, rb, rc, fn11); break; default: @@ -2284,12 +2329,14 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) case 0x010: /* CVTLQ */ REQUIRE_REG_31(ra); + REQUIRE_FEN; vc = dest_fpr(ctx, rc); vb = load_fpr(ctx, rb); gen_cvtlq(vc, vb); break; case 0x020: /* CPYS */ + REQUIRE_FEN; if (rc == 31) { /* Special case CPYS as FNOP. */ } else { @@ -2306,6 +2353,7 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) break; case 0x021: /* CPYSN */ + REQUIRE_FEN; vc = dest_fpr(ctx, rc); vb = load_fpr(ctx, rb); va = load_fpr(ctx, ra); @@ -2313,6 +2361,7 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) break; case 0x022: /* CPYSE */ + REQUIRE_FEN; vc = dest_fpr(ctx, rc); vb = load_fpr(ctx, rb); va = load_fpr(ctx, ra); @@ -2320,6 +2369,7 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) break; case 0x024: /* MT_FPCR */ + REQUIRE_FEN; va = load_fpr(ctx, ra); gen_helper_store_fpcr(cpu_env, va); if (ctx->tb_rm == QUAL_RM_D) { @@ -2330,37 +2380,45 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) break; case 0x025: /* MF_FPCR */ + REQUIRE_FEN; va = dest_fpr(ctx, ra); gen_helper_load_fpcr(va, cpu_env); break; case 0x02A: /* FCMOVEQ */ + REQUIRE_FEN; gen_fcmov(ctx, TCG_COND_EQ, ra, rb, rc); break; case 0x02B: /* FCMOVNE */ + REQUIRE_FEN; gen_fcmov(ctx, TCG_COND_NE, ra, rb, rc); break; case 0x02C: /* FCMOVLT */ + REQUIRE_FEN; gen_fcmov(ctx, TCG_COND_LT, ra, rb, rc); break; case 0x02D: /* FCMOVGE */ + REQUIRE_FEN; gen_fcmov(ctx, TCG_COND_GE, ra, rb, rc); break; case 0x02E: /* FCMOVLE */ + REQUIRE_FEN; gen_fcmov(ctx, TCG_COND_LE, ra, rb, rc); break; case 0x02F: /* FCMOVGT */ + REQUIRE_FEN; gen_fcmov(ctx, TCG_COND_GT, ra, rb, rc); break; case 0x030: /* CVTQL */ case 0x130: /* CVTQL/V */ case 0x530: /* CVTQL/SV */ REQUIRE_REG_31(ra); + REQUIRE_FEN; vc = dest_fpr(ctx, rc); vb = load_fpr(ctx, rb); gen_helper_cvtql(vc, cpu_env, vb); @@ -2793,34 +2851,42 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) #endif case 0x20: /* LDF */ + REQUIRE_FEN; gen_load_mem(ctx, &gen_qemu_ldf, ra, rb, disp16, 1, 0); break; case 0x21: /* LDG */ + REQUIRE_FEN; gen_load_mem(ctx, &gen_qemu_ldg, ra, rb, disp16, 1, 0); break; case 0x22: /* LDS */ + REQUIRE_FEN; gen_load_mem(ctx, &gen_qemu_lds, ra, rb, disp16, 1, 0); break; case 0x23: /* LDT */ + REQUIRE_FEN; gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 1, 0); break; case 0x24: /* STF */ + REQUIRE_FEN; gen_store_mem(ctx, &gen_qemu_stf, ra, rb, disp16, 1, 0); break; case 0x25: /* STG */ + REQUIRE_FEN; gen_store_mem(ctx, &gen_qemu_stg, ra, rb, disp16, 1, 0); break; case 0x26: /* STS */ + REQUIRE_FEN; gen_store_mem(ctx, &gen_qemu_sts, ra, rb, disp16, 1, 0); break; case 0x27: /* STT */ + REQUIRE_FEN; gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 1, 0); break; case 0x28: @@ -2862,12 +2928,15 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) ret = gen_bdirect(ctx, ra, disp21); break; case 0x31: /* FBEQ */ + REQUIRE_FEN; ret = gen_fbcond(ctx, TCG_COND_EQ, ra, disp21); break; case 0x32: /* FBLT */ + REQUIRE_FEN; ret = gen_fbcond(ctx, TCG_COND_LT, ra, disp21); break; case 0x33: /* FBLE */ + REQUIRE_FEN; ret = gen_fbcond(ctx, TCG_COND_LE, ra, disp21); break; case 0x34: @@ -2875,12 +2944,15 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) ret = gen_bdirect(ctx, ra, disp21); break; case 0x35: /* FBNE */ + REQUIRE_FEN; ret = gen_fbcond(ctx, TCG_COND_NE, ra, disp21); break; case 0x36: /* FBGE */ + REQUIRE_FEN; ret = gen_fbcond(ctx, TCG_COND_GE, ra, disp21); break; case 0x37: /* FBGT */ + REQUIRE_FEN; ret = gen_fbcond(ctx, TCG_COND_GT, ra, disp21); break; case 0x38: @@ -2918,6 +2990,9 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) invalid_opc: ret = gen_invalid(ctx); break; + raise_fen: + ret = gen_excp(ctx, EXCP_FEN, 0); + break; } return ret;