From patchwork Wed Jul 13 08:07:07 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Kurz X-Patchwork-Id: 9227057 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 51EE56075D for ; Wed, 13 Jul 2016 08:07:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 43B9D212F2 for ; Wed, 13 Jul 2016 08:07:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 38D06277D9; Wed, 13 Jul 2016 08:07:44 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5E34A212F2 for ; Wed, 13 Jul 2016 08:07:43 +0000 (UTC) Received: from localhost ([::1]:45761 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNFCo-0005hg-0c for patchwork-qemu-devel@patchwork.kernel.org; Wed, 13 Jul 2016 04:07:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43813) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNFCT-0005gc-FN for qemu-devel@nongnu.org; Wed, 13 Jul 2016 04:07:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bNFCP-0000LQ-5Y for qemu-devel@nongnu.org; Wed, 13 Jul 2016 04:07:20 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:41005) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNFCO-0000LF-Tz for qemu-devel@nongnu.org; Wed, 13 Jul 2016 04:07:17 -0400 Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u6D84aOC055084 for ; Wed, 13 Jul 2016 04:07:16 -0400 Received: from e38.co.us.ibm.com (e38.co.us.ibm.com [32.97.110.159]) by mx0a-001b2d01.pphosted.com with ESMTP id 2455jsvjhp-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 13 Jul 2016 04:07:15 -0400 Received: from localhost by e38.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 13 Jul 2016 02:07:13 -0600 Received: from d03dlp01.boulder.ibm.com (9.17.202.177) by e38.co.us.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 13 Jul 2016 02:07:10 -0600 X-IBM-Helo: d03dlp01.boulder.ibm.com X-IBM-MailFrom: groug@kaod.org Received: from b03cxnp07029.gho.boulder.ibm.com (b03cxnp07029.gho.boulder.ibm.com [9.17.130.16]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id D0ABF1FF004A; Wed, 13 Jul 2016 02:06:52 -0600 (MDT) Received: from b03ledav001.gho.boulder.ibm.com (b03ledav001.gho.boulder.ibm.com [9.17.130.232]) by b03cxnp07029.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u6D879wD45481988; Wed, 13 Jul 2016 01:07:09 -0700 Received: from b03ledav001.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7A5256E038; Wed, 13 Jul 2016 02:07:09 -0600 (MDT) Received: from bahia.lan (unknown [9.164.146.113]) by b03ledav001.gho.boulder.ibm.com (Postfix) with ESMTP id 631586E035; Wed, 13 Jul 2016 02:07:08 -0600 (MDT) From: Greg Kurz To: David Gibson Date: Wed, 13 Jul 2016 10:07:07 +0200 User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16071308-0028-0000-0000-000005274F02 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16071308-0029-0000-0000-00002D79107D Message-Id: <146839674009.29126.18254528210644697405.stgit@bahia.lan> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-07-13_02:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1607130091 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PATCH] ppc: parse cpu features once X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org, Bharata B Rao Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Considering that features are converted to global properties and global properties are automatically applied to every new instance of created CPU (at object_new() time), there is no point in parsing cpu_model string every time a CPU created. So move parsing outside CPU creation loop and do it only once. Parsing also should be done before any CPU is created so that features would affect the first CPU a well. This patch does that for all PowerPC machine types. It is based on previous work from Bharata: https://lists.nongnu.org/archive/html/qemu-devel/2016-06/msg07564.html Signed-off-by: Greg Kurz --- This is a standalone version of patch 2 from my latest series: https://lists.nongnu.org/archive/html/qemu-devel/2016-07/msg02433.html The only changes are trivial conflict fixes caused by the introduction of ppc_cpu_init by patch 1. --- hw/ppc/e500.c | 2 ++ hw/ppc/mac_newworld.c | 1 + hw/ppc/mac_oldworld.c | 1 + hw/ppc/ppc.c | 26 ++++++++++++++++++++++++++ hw/ppc/ppc440_bamboo.c | 1 + hw/ppc/ppc4xx_devs.c | 1 + hw/ppc/prep.c | 1 + hw/ppc/spapr.c | 2 ++ hw/ppc/virtex_ml507.c | 1 + include/hw/ppc/ppc.h | 1 + 10 files changed, 37 insertions(+) diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 0cd534df55f8..616d0a07463b 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -814,6 +814,8 @@ void ppce500_init(MachineState *machine, PPCE500Params *params) machine->cpu_model = "e500v2_v30"; } + ppc_cpu_parse_features(machine->cpu_model); + irqs = g_malloc0(smp_cpus * sizeof(qemu_irq *)); irqs[0] = g_malloc0(smp_cpus * sizeof(qemu_irq) * OPENPIC_OUTPUT_NB); for (i = 0; i < smp_cpus; i++) { diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c index 7d2510658d0f..bf734a5976ef 100644 --- a/hw/ppc/mac_newworld.c +++ b/hw/ppc/mac_newworld.c @@ -192,6 +192,7 @@ static void ppc_core99_init(MachineState *machine) machine->cpu_model = "G4"; #endif } + ppc_cpu_parse_features(machine->cpu_model); for (i = 0; i < smp_cpus; i++) { cpu = cpu_ppc_init(machine->cpu_model); if (cpu == NULL) { diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c index 447948746b1a..f4678b13fe58 100644 --- a/hw/ppc/mac_oldworld.c +++ b/hw/ppc/mac_oldworld.c @@ -112,6 +112,7 @@ static void ppc_heathrow_init(MachineState *machine) /* init CPUs */ if (machine->cpu_model == NULL) machine->cpu_model = "G3"; + ppc_cpu_parse_features(machine->cpu_model); for (i = 0; i < smp_cpus; i++) { cpu = cpu_ppc_init(machine->cpu_model); if (cpu == NULL) { diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index e4252528a69d..89458690097f 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -33,6 +33,7 @@ #include "hw/timer/m48t59.h" #include "qemu/log.h" #include "qemu/error-report.h" +#include "qapi/error.h" #include "hw/loader.h" #include "sysemu/kvm.h" #include "kvm_ppc.h" @@ -1350,3 +1351,28 @@ PowerPCCPU *ppc_get_vcpu_by_dt_id(int cpu_dt_id) return NULL; } + +void ppc_cpu_parse_features(const char *cpu_model) +{ + CPUClass *cc; + ObjectClass *oc; + const char *typename; + gchar **model_pieces; + + model_pieces = g_strsplit(cpu_model, ",", 2); + if (!model_pieces[0]) { + error_report("Invalid/empty CPU model name"); + exit(1); + } + + oc = cpu_class_by_name(TYPE_POWERPC_CPU, model_pieces[0]); + if (oc == NULL) { + error_report("Unable to find CPU definition: %s", model_pieces[0]); + exit(1); + } + + typename = object_class_get_name(oc); + cc = CPU_CLASS(oc); + cc->parse_features(typename, model_pieces[1], &error_fatal); + g_strfreev(model_pieces); +} diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c index 5c535b18a20d..f778ad84a792 100644 --- a/hw/ppc/ppc440_bamboo.c +++ b/hw/ppc/ppc440_bamboo.c @@ -186,6 +186,7 @@ static void bamboo_init(MachineState *machine) if (machine->cpu_model == NULL) { machine->cpu_model = "440EP"; } + ppc_cpu_parse_features(machine->cpu_model); cpu = cpu_ppc_init(machine->cpu_model); if (cpu == NULL) { fprintf(stderr, "Unable to initialize CPU!\n"); diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c index e7f413e49d08..a350ebf26437 100644 --- a/hw/ppc/ppc4xx_devs.c +++ b/hw/ppc/ppc4xx_devs.c @@ -56,6 +56,7 @@ PowerPCCPU *ppc4xx_init(const char *cpu_model, CPUPPCState *env; /* init CPUs */ + ppc_cpu_parse_features(cpu_model); cpu = cpu_ppc_init(cpu_model); if (cpu == NULL) { fprintf(stderr, "Unable to find PowerPC %s CPU definition\n", diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c index 054af1e8b481..2faaf7f0784a 100644 --- a/hw/ppc/prep.c +++ b/hw/ppc/prep.c @@ -508,6 +508,7 @@ static void ppc_prep_init(MachineState *machine) /* init CPUs */ if (machine->cpu_model == NULL) machine->cpu_model = "602"; + ppc_cpu_parse_features(machine->cpu_model); for (i = 0; i < smp_cpus; i++) { cpu = cpu_ppc_init(machine->cpu_model); if (cpu == NULL) { diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 7f33a1b2b57d..d11b845497c8 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1803,6 +1803,8 @@ static void ppc_spapr_init(MachineState *machine) machine->cpu_model = kvm_enabled() ? "host" : "POWER7"; } + ppc_cpu_parse_features(machine->cpu_model); + if (smc->dr_cpu_enabled) { char *type = spapr_get_cpu_core_type(machine->cpu_model); diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c index b97d96685cf1..bbc41d86c851 100644 --- a/hw/ppc/virtex_ml507.c +++ b/hw/ppc/virtex_ml507.c @@ -96,6 +96,7 @@ static PowerPCCPU *ppc440_init_xilinx(ram_addr_t *ram_size, CPUPPCState *env; qemu_irq *irqs; + ppc_cpu_parse_features(cpu_model); cpu = cpu_ppc_init(cpu_model); if (cpu == NULL) { fprintf(stderr, "Unable to initialize CPU!\n"); diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h index 5617dc4a2c04..f0d1cf0a0f64 100644 --- a/include/hw/ppc/ppc.h +++ b/include/hw/ppc/ppc.h @@ -106,4 +106,5 @@ enum { /* ppc_booke.c */ void ppc_booke_timers_init(PowerPCCPU *cpu, uint32_t freq, uint32_t flags); +void ppc_cpu_parse_features(const char *cpu_model); #endif