From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id NEQ2OOt9u2o4ohYAWB0awg (envelope-from ) for ; Tue, 29 Sep 2026 04:59:23 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=TrnRhRY0; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id D04751E033; Tue, 29 Sep 2026 04:59:23 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.3 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id B8BC41E033 for ; Tue, 29 Sep 2026 04:59:20 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B59D64BB1C2C for ; Tue, 29 Sep 2026 08:59:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B59D64BB1C2C Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=TrnRhRY0 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by sourceware.org (Postfix) with ESMTPS id 049924BB24C3 for ; Tue, 29 Sep 2026 08:57:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 049924BB24C3 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.ibm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linux.ibm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 049924BB24C3 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790672235; cv=none; b=Ktnj61PKA14JOXnV6M++JhtYog8G387NXR2yKcTbO+5JdSIFnRHmO7qVD3tSumVO27VPEoyr91Eyup1rT12e+KxZ3a3rHTJdKCHNtNskmLBrsu20jaCS336X9RSgKzjHv4gUjZu3+7vuvyTMDMS8aKLjr6z2w8pXObD0z8yOxY0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790672235; c=relaxed/simple; bh=H/PpXYAbICvx0jnoR38PlZVRpm2pfEspmpem0+5PLH8=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=L40WfRFlTl9Dn5kgxmxCRFwnRvqDNoguBWZ1Z0qaNw2zou/pLDAxhyuVpWsGYTkYKPAGAhjBAc/Lndx9qv9TsebOZI28b6BYgvYZa+4Au4AoNx5ONDFjTpAHD7eqR/8W9Mst3M41MVal5BVzxJYrmlUAqV8Z70wpSbRsOd7A6CA= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=TrnRhRY0 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 049924BB24C3 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68T7ZfdB2292874 for ; Tue, 29 Sep 2026 08:57:13 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:message-id:mime-version :subject:to; s=pp1; bh=884D768XuqQ8UsR3ynj524oAHQOloMIYa3WHdiUmD cE=; b=TrnRhRY0KLVne2qNGB1aPRItr0DnlXpKjxLp2ScGQlkY5T+T+YmOqsFCc 2clz2P1nBMyxIyne+/Df5iBFBQDSF1+z0v9DXrg4wy/hj3WIE0JoNKmn5sASqHp/ MMM9xQkX7ig2ftIdqy1Se8WvcgKbPVFgn6YpUcqOVsDTDhjckEHtETXr/d7tO1mX wm701+/9e/10EkBobCt327AD4lxwVwgRGcsHD7q2yefMDeYUgLYkPSVQ6e34BE1w xNZgzgaxXaiJTNQnznw7Ob0RePq6s7Eqw6gFsMfFmNmNiDtBlToGYaX2Q6hCWVxg ms93NZR2xBOg5Hm5PcwpNyztDK2kQ== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gx4fe5gyq-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT) for ; Tue, 29 Sep 2026 08:57:13 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68T7WSeQ1349429 for ; Tue, 29 Sep 2026 08:57:13 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gxsck8y6n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 29 Sep 2026 08:57:12 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68T8v2ZA28180800 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 29 Sep 2026 08:57:02 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DF4812004B; Tue, 29 Sep 2026 08:57:01 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EFE4D20043; Tue, 29 Sep 2026 08:57:00 +0000 (GMT) Received: from kubota.pok.stglabs.ibm.com (unknown [9.114.39.181]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 29 Sep 2026 08:57:00 +0000 (GMT) From: Abhay Kandpal To: gdb-patches@sourceware.org Cc: Ulrich.Weigand@de.ibm.com, cel@linux.ibm.com, abhay.k@ibm.com, Abhay Kandpal Subject: [PATCH v2] PowerPC: Add support for Dense Math registers (RFC02653) Date: Tue, 29 Sep 2026 03:56:55 -0500 Message-ID: <20260929085655.1053446-1-abhay@linux.ibm.com> X-Mailer: git-send-email 2.52.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=FYWiV5+6 c=1 sm=1 tr=0 ts=6abb7d69 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwfpI68lZ4OlOjytoqYA:9 a=3zwON7FIotbiE0hS:21 a=Xe8pB3R93VgA:10 a=yDgal9y_5rEA:10 a=i3P-ilctZIAA:10 a=DhqX-eZDUwEA:10 a=D6qJ9oiIO3UA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI5MDAzNCBTYWx0ZWRfX5XrDV3EbzI2S 7exBQt9VO1XX10pdMdGcm4KYCD763miNur1BybXa0SLruEs5mcZ5OcrwI525MoKjGnjXcXpfrVm gj3PMfLNbgY4TyVw28yubtFyNKldi8k= X-Proofpoint-ORIG-GUID: w6dsMhhwU4mFOERAIPJ_VlTJBJRGtkHp X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI5MDAzNCBTYWx0ZWRfX30n7dDk7hANp NU/JJn8ZBuXlKEBnu3Hg8JuddiQIir6O2zvXsoRT5uQsDeW8ifuAhl57QWaPa1r2+bTQCS4ETN3 qijBX0s42PybIbPZN89J2NHyZWqBRxZltMFpm0kOSyxIl1NKaRG+mnUGJ4YIQoAQs1Pu/D7YXgy S1FGA5XmKiLuBzLgkqlUTAcwqt9IOMFsy0or5ECUBqnp3Zx7+yBIwD2XDmSYPk1y3TV+u1JHZFg t+kNeEhfIxG/N+THZG+Cn9fS+sx1kOXsqLhxkLGHxtw+tAF+cff8e8/BMYwnxwSGBmhydBux7oX /UJhUyXxJz2X/HGGtTDRmqvXiSw8m/aTRXQWcRKT+JSjm+PU0IF/fsAcnuL/7iFqeZz5tbKUx4g cMRif/yqLfUJ/xvZDajaJgruc2/Yrm98heVPq0P1bEt6lv4ETzTgj1f0RIGUthKvNY+A8x4G2+U ZxlYtQjVxGHq7tLGfOw== X-Proofpoint-GUID: w6dsMhhwU4mFOERAIPJ_VlTJBJRGtkHp X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-29_03,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 clxscore=1015 impostorscore=0 spamscore=0 phishscore=0 priorityscore=1501 malwarescore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609290034 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org This patch adds support for the Dense Math Registers (DMR) available on a future PowerPC processor, for the powerpc linux native and core file targets, and for the powerpc linux server stub. Eight 1024-bit DMR registers are provided. Each DMR contains eight 128-bit rows. DMR registers are accessed via the NT_PPC_DMR regset, which requires the Dense Math facility to be enabled in the kernel configuration. A new target description (powerpc-isa32-vsx32l/64l) is introduced for systems where the Dense Math facility is available. The existing isa207 target description is left unchanged so that earlier systems are not affected. Availability is detected at runtime from the PPC_FEATURE2_DMF hwcap bit together with a check for the NT_PPC_DMR regset. On systems without Dense Math support the registers are gracefully skipped and show as unavailable. The NT_PPC_DMR note type used for core files was added to binutils in commit 6a25d73ee2ab ("PowerPC: Add NT_PPC_DMR core file support"). gdb/ * arch/ppc-linux-common.h (PPC_LINUX_SIZEOF_DMRREGSET): Define. (ppc_linux_features): Add isa32 field. (ppc_linux_no_features): Initialize isa32 to false. * arch/ppc-linux-common.c (ppc_linux_match_description): Return the ISA 3.X target description when isa32 is set. * arch/ppc-linux-tdesc.h (tdesc_powerpc_isa32_vsx32l) (tdesc_powerpc_isa32_vsx64l): Declare. * features/Makefile: Add powerpc-isa32-vsx32l and powerpc-isa32-vsx64l entries. * features/rs6000/power-dmr.xml: New file. * features/rs6000/powerpc-isa32-vsx32l.xml: New file. * features/rs6000/powerpc-isa32-vsx64l.xml: New file. * features/rs6000/powerpc-isa32-vsx32l.c: New generated file. * features/rs6000/powerpc-isa32-vsx64l.c: New generated file. * regformats/rs6000/powerpc-isa32-vsx32l.dat: New generated file. * regformats/rs6000/powerpc-isa32-vsx64l.dat: New generated file. * nat/ppc-linux.h (PPC_FEATURE2_DMF): Define if not already defined. * ppc-linux-nat.c (fetch_register, fetch_ppc_registers): Fetch the dmr regset. (store_register, store_ppc_registers): Store the dmr regset. (ppc_linux_nat_target::read_description): Detect Dense Math availability and set the isa32 field in the features struct. * ppc-linux-tdep.c (ppc32_regmap_dmr, ppc32_linux_dmrregset): New globals. (ppc_linux_iterate_over_regset_sections): Call back with the dmr regset. * ppc-linux-tdep.h (ppc32_linux_dmrregset): Declare. * ppc-tdep.h (struct ppc_gdbarch_tdep) : New field. (enum): through : New enum values. (PPC_IS_DMR_REGNUM): Define. * rs6000-tdep.c (rs6000_gdbarch_init): Look for and validate the dmr feature. gdbserver/ * configure.srv (powerpc*-*-linux*): Add rs6000/power-dmr.xml, powerpc-isa32-vsx32l.o and powerpc-isa32-vsx64l.o. * linux-ppc-low.cc (ppc_fill_dmrregset, ppc_store_dmrregset): New functions. (ppc_regsets): Add entry for dmr regset. (ppc_target::low_arch_setup): Detect Dense Math availability and set isa32 in the features struct. Set size for dmr regset. (ppc_target::get_ipa_tdesc_idx): Return PPC_TDESC_ISA32_VSX for the ISA 3.X target description. * linux-ppc-ipa.cc (ppc_get_ipa_tdesc): Handle PPC_TDESC_ISA32_VSX. * linux-ppc-tdesc-init.h (PPC_TDESC_ISA32_VSX): New enum value. (init_registers_powerpc_isa32_vsx32l): Declare. (init_registers_powerpc_isa32_vsx64l): Declare. --- Tested on powerpc64le-linux. DMR register read, write, and core-file round-trip verified on a system with the Dense Math facility enabled in the kernel; graceful fallback verified on a kernel without it. Changes since v1: - Use the regset mechanism (NT_PPC_DMR) on the native side instead of the dedicated PTRACE_GETDMREGS/PTRACE_SETDMREGS requests, matching gdbserver and the other register sets. The PTRACE_ defines are no longer needed and have been dropped. - Detect availability from the PPC_FEATURE2_DMF hwcap bit together with a check_regset call, rather than a raw ptrace probe. - Rename the target description to powerpc-isa32-vsx32l/64l, since DMR is not optional in upcoming ISA. - Check the newest feature first in ppc_linux_match_description. - Rename the ppc_linux_features field from has_dmr to isa32, dropping the has_ prefix. - Rename the vector type from uint1024 to v8uint128. - Drop the have_dmr flag and test tdep->ppc_dmr0_regnum != -1 instead. gdb/arch/ppc-linux-common.c | 6 +- gdb/arch/ppc-linux-common.h | 3 + gdb/arch/ppc-linux-tdesc.h | 2 + gdb/features/Makefile | 4 + gdb/features/rs6000/power-dmr.xml | 23 ++ gdb/features/rs6000/powerpc-isa32-vsx32l.c | 227 ++++++++++++++++++ gdb/features/rs6000/powerpc-isa32-vsx32l.xml | 20 ++ gdb/features/rs6000/powerpc-isa32-vsx64l.c | 227 ++++++++++++++++++ gdb/features/rs6000/powerpc-isa32-vsx64l.xml | 20 ++ gdb/nat/ppc-linux.h | 3 + gdb/ppc-linux-nat.c | 31 +++ gdb/ppc-linux-tdep.c | 33 +++ gdb/ppc-linux-tdep.h | 1 + gdb/ppc-tdep.h | 16 ++ .../rs6000/powerpc-isa32-vsx32l.dat | 164 +++++++++++++ .../rs6000/powerpc-isa32-vsx64l.dat | 164 +++++++++++++ gdb/rs6000-tdep.c | 24 +- gdbserver/configure.srv | 7 +- gdbserver/linux-ppc-ipa.cc | 4 + gdbserver/linux-ppc-low.cc | 43 ++++ gdbserver/linux-ppc-tdesc-init.h | 7 + 21 files changed, 1025 insertions(+), 4 deletions(-) create mode 100644 gdb/features/rs6000/power-dmr.xml create mode 100644 gdb/features/rs6000/powerpc-isa32-vsx32l.c create mode 100644 gdb/features/rs6000/powerpc-isa32-vsx32l.xml create mode 100644 gdb/features/rs6000/powerpc-isa32-vsx64l.c create mode 100644 gdb/features/rs6000/powerpc-isa32-vsx64l.xml create mode 100644 gdb/regformats/rs6000/powerpc-isa32-vsx32l.dat create mode 100644 gdb/regformats/rs6000/powerpc-isa32-vsx64l.dat diff --git a/gdb/arch/ppc-linux-common.c b/gdb/arch/ppc-linux-common.c index d36bc369f9e..35d11e85f12 100644 --- a/gdb/arch/ppc-linux-common.c +++ b/gdb/arch/ppc-linux-common.c @@ -50,7 +50,8 @@ ppc_linux_match_description (struct ppc_linux_features features) if (features.wordsize == 8) { if (features.vsx) - tdesc = (features.htm ? tdesc_powerpc_isa207_htm_vsx64l + tdesc = (features.isa32 ? tdesc_powerpc_isa32_vsx64l + : features.htm ? tdesc_powerpc_isa207_htm_vsx64l : features.isa207 ? tdesc_powerpc_isa207_vsx64l : features.ppr_dscr ? tdesc_powerpc_isa205_ppr_dscr_vsx64l : features.isa205 ? tdesc_powerpc_isa205_vsx64l @@ -67,7 +68,8 @@ ppc_linux_match_description (struct ppc_linux_features features) gdb_assert (features.wordsize == 4); if (features.vsx) - tdesc = (features.htm ? tdesc_powerpc_isa207_htm_vsx32l + tdesc = (features.isa32 ? tdesc_powerpc_isa32_vsx32l + : features.htm ? tdesc_powerpc_isa207_htm_vsx32l : features.isa207 ? tdesc_powerpc_isa207_vsx32l : features.ppr_dscr ? tdesc_powerpc_isa205_ppr_dscr_vsx32l : features.isa205 ? tdesc_powerpc_isa205_vsx32l diff --git a/gdb/arch/ppc-linux-common.h b/gdb/arch/ppc-linux-common.h index 658801808db..5330713e57a 100644 --- a/gdb/arch/ppc-linux-common.h +++ b/gdb/arch/ppc-linux-common.h @@ -44,6 +44,7 @@ struct target_desc; #define PPC_LINUX_SIZEOF_CPPRREGSET 8 #define PPC_LINUX_SIZEOF_CDSCRREGSET 8 #define PPC_LINUX_SIZEOF_CTARREGSET 8 +#define PPC_LINUX_SIZEOF_DMRREGSET (8 * 128) /* Check if the hwcap auxv entry indicates that isa205 is supported. */ bool ppc_linux_has_isa205 (CORE_ADDR hwcap); @@ -58,6 +59,7 @@ struct ppc_linux_features bool ppr_dscr; bool isa207; bool htm; + bool isa32; }; /* Base value for ppc_linux_features variables. */ @@ -69,6 +71,7 @@ const struct ppc_linux_features ppc_linux_no_features = { false, false, false, + false, }; /* Return a target description that matches FEATURES. */ diff --git a/gdb/arch/ppc-linux-tdesc.h b/gdb/arch/ppc-linux-tdesc.h index 0a61ed8691d..262a04ab0f2 100644 --- a/gdb/arch/ppc-linux-tdesc.h +++ b/gdb/arch/ppc-linux-tdesc.h @@ -33,6 +33,7 @@ extern const_target_desc_up tdesc_powerpc_isa205_vsx32l; extern const_target_desc_up tdesc_powerpc_isa205_ppr_dscr_vsx32l; extern const_target_desc_up tdesc_powerpc_isa207_vsx32l; extern const_target_desc_up tdesc_powerpc_isa207_htm_vsx32l; +extern const_target_desc_up tdesc_powerpc_isa32_vsx32l; extern const_target_desc_up tdesc_powerpc_e500l; extern const_target_desc_up tdesc_powerpc_64l; @@ -44,5 +45,6 @@ extern const_target_desc_up tdesc_powerpc_isa205_vsx64l; extern const_target_desc_up tdesc_powerpc_isa205_ppr_dscr_vsx64l; extern const_target_desc_up tdesc_powerpc_isa207_vsx64l; extern const_target_desc_up tdesc_powerpc_isa207_htm_vsx64l; +extern const_target_desc_up tdesc_powerpc_isa32_vsx64l; #endif /* GDB_ARCH_PPC_LINUX_TDESC_H */ diff --git a/gdb/features/Makefile b/gdb/features/Makefile index 161a7453d66..d1e96401418 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -60,6 +60,8 @@ WHICH = mips-linux mips-dsp-linux \ rs6000/powerpc-isa207-vsx32l rs6000/powerpc-isa207-vsx64l \ rs6000/powerpc-isa207-htm-vsx32l \ rs6000/powerpc-isa207-htm-vsx64l \ + rs6000/powerpc-isa32-vsx32l \ + rs6000/powerpc-isa32-vsx64l \ s390-linux32 s390-linux64 s390x-linux64 \ s390-linux32v1 s390-linux64v1 s390x-linux64v1 \ s390-linux32v2 s390-linux64v2 s390x-linux64v2 \ @@ -144,6 +146,8 @@ XMLTOC = \ rs6000/powerpc-isa207-vsx64l.xml \ rs6000/powerpc-isa207-htm-vsx32l.xml \ rs6000/powerpc-isa207-htm-vsx64l.xml \ + rs6000/powerpc-isa32-vsx32l.xml \ + rs6000/powerpc-isa32-vsx64l.xml \ rs6000/powerpc-vsx32.xml \ rs6000/powerpc-vsx32l.xml \ rs6000/powerpc-vsx64.xml \ diff --git a/gdb/features/rs6000/power-dmr.xml b/gdb/features/rs6000/power-dmr.xml new file mode 100644 index 00000000000..9a249b4fa7c --- /dev/null +++ b/gdb/features/rs6000/power-dmr.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/gdb/features/rs6000/powerpc-isa32-vsx32l.c b/gdb/features/rs6000/powerpc-isa32-vsx32l.c new file mode 100644 index 00000000000..e291b73c219 --- /dev/null +++ b/gdb/features/rs6000/powerpc-isa32-vsx32l.c @@ -0,0 +1,227 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: powerpc-isa32-vsx32l.xml */ + +#include "osabi.h" +#include "target-descriptions.h" + +const_target_desc_up tdesc_powerpc_isa32_vsx32l; +static void +initialize_tdesc_powerpc_isa32_vsx32l (void) +{ + target_desc_up result = allocate_target_description (); + set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common")); + + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core"); + tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu"); + tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "fpscr", 70, 1, "float", 32, "int"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux"); + tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec"); + tdesc_type *element_type; + element_type = tdesc_named_type (feature, "ieee_single"); + tdesc_create_vector (feature, "v4f", element_type, 4); + + element_type = tdesc_named_type (feature, "int32"); + tdesc_create_vector (feature, "v4i32", element_type, 4); + + element_type = tdesc_named_type (feature, "int16"); + tdesc_create_vector (feature, "v8i16", element_type, 8); + + element_type = tdesc_named_type (feature, "int8"); + tdesc_create_vector (feature, "v16i8", element_type, 16); + + tdesc_type_with_fields *type_with_fields; + type_with_fields = tdesc_create_union (feature, "vec128"); + tdesc_type *field_type; + field_type = tdesc_named_type (feature, "uint128"); + tdesc_add_field (type_with_fields, "uint128", field_type); + field_type = tdesc_named_type (feature, "v4f"); + tdesc_add_field (type_with_fields, "v4_float", field_type); + field_type = tdesc_named_type (feature, "v4i32"); + tdesc_add_field (type_with_fields, "v4_int32", field_type); + field_type = tdesc_named_type (feature, "v8i16"); + tdesc_add_field (type_with_fields, "v8_int16", field_type); + field_type = tdesc_named_type (feature, "v16i8"); + tdesc_add_field (type_with_fields, "v16_int8", field_type); + + tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int"); + tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx"); + tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ppr"); + tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dscr"); + tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.tar"); + tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ebb"); + tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux.pmu"); + tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dmr"); + element_type = tdesc_named_type (feature, "uint128"); + tdesc_create_vector (feature, "v8uint128", element_type, 8); + + tdesc_create_reg (feature, "dmr0", 150, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr1", 151, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr2", 152, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr3", 153, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr4", 154, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr5", 155, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr6", 156, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr7", 157, 1, NULL, 1024, "v8uint128"); + + tdesc_powerpc_isa32_vsx32l = std::move (result); +} diff --git a/gdb/features/rs6000/powerpc-isa32-vsx32l.xml b/gdb/features/rs6000/powerpc-isa32-vsx32l.xml new file mode 100644 index 00000000000..e1109f18865 --- /dev/null +++ b/gdb/features/rs6000/powerpc-isa32-vsx32l.xml @@ -0,0 +1,20 @@ + + + + + powerpc:common + + + + + + + + + + + + diff --git a/gdb/features/rs6000/powerpc-isa32-vsx64l.c b/gdb/features/rs6000/powerpc-isa32-vsx64l.c new file mode 100644 index 00000000000..79a042a99b6 --- /dev/null +++ b/gdb/features/rs6000/powerpc-isa32-vsx64l.c @@ -0,0 +1,227 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: powerpc-isa32-vsx64l.xml */ + +#include "osabi.h" +#include "target-descriptions.h" + +const_target_desc_up tdesc_powerpc_isa32_vsx64l; +static void +initialize_tdesc_powerpc_isa32_vsx64l (void) +{ + target_desc_up result = allocate_target_description (); + set_tdesc_architecture (result.get (), bfd_scan_arch ("powerpc:common64")); + + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.core"); + tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr"); + tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr"); + tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.fpu"); + tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double"); + tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux"); + tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int"); + tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.altivec"); + tdesc_type *element_type; + element_type = tdesc_named_type (feature, "ieee_single"); + tdesc_create_vector (feature, "v4f", element_type, 4); + + element_type = tdesc_named_type (feature, "int32"); + tdesc_create_vector (feature, "v4i32", element_type, 4); + + element_type = tdesc_named_type (feature, "int16"); + tdesc_create_vector (feature, "v8i16", element_type, 8); + + element_type = tdesc_named_type (feature, "int8"); + tdesc_create_vector (feature, "v16i8", element_type, 16); + + tdesc_type_with_fields *type_with_fields; + type_with_fields = tdesc_create_union (feature, "vec128"); + tdesc_type *field_type; + field_type = tdesc_named_type (feature, "uint128"); + tdesc_add_field (type_with_fields, "uint128", field_type); + field_type = tdesc_named_type (feature, "v4f"); + tdesc_add_field (type_with_fields, "v4_float", field_type); + field_type = tdesc_named_type (feature, "v4i32"); + tdesc_add_field (type_with_fields, "v4_int32", field_type); + field_type = tdesc_named_type (feature, "v8i16"); + tdesc_add_field (type_with_fields, "v8_int16", field_type); + field_type = tdesc_named_type (feature, "v16i8"); + tdesc_add_field (type_with_fields, "v16_int8", field_type); + + tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int"); + tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.vsx"); + tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ppr"); + tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dscr"); + tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.tar"); + tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.ebb"); + tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.linux.pmu"); + tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64"); + tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64"); + + feature = tdesc_create_feature (result.get (), "org.gnu.gdb.power.dmr"); + element_type = tdesc_named_type (feature, "uint128"); + tdesc_create_vector (feature, "v8uint128", element_type, 8); + + tdesc_create_reg (feature, "dmr0", 150, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr1", 151, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr2", 152, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr3", 153, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr4", 154, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr5", 155, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr6", 156, 1, NULL, 1024, "v8uint128"); + tdesc_create_reg (feature, "dmr7", 157, 1, NULL, 1024, "v8uint128"); + + tdesc_powerpc_isa32_vsx64l = std::move (result); +} diff --git a/gdb/features/rs6000/powerpc-isa32-vsx64l.xml b/gdb/features/rs6000/powerpc-isa32-vsx64l.xml new file mode 100644 index 00000000000..f3a88b7180b --- /dev/null +++ b/gdb/features/rs6000/powerpc-isa32-vsx64l.xml @@ -0,0 +1,20 @@ + + + + + powerpc:common64 + + + + + + + + + + + + diff --git a/gdb/nat/ppc-linux.h b/gdb/nat/ppc-linux.h index 26b9af4e298..28739fabc9d 100644 --- a/gdb/nat/ppc-linux.h +++ b/gdb/nat/ppc-linux.h @@ -63,6 +63,9 @@ #ifndef PPC_FEATURE2_HTM #define PPC_FEATURE2_HTM 0x40000000 #endif +#ifndef PPC_FEATURE2_DMF +#define PPC_FEATURE2_DMF 0x00008000 +#endif /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a configure time check. Some older glibc's (for instance 2.2.1) diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c index 413e0e0ab97..0eea4993fb4 100644 --- a/gdb/ppc-linux-nat.c +++ b/gdb/ppc-linux-nat.c @@ -1064,6 +1064,15 @@ fetch_register (struct regcache *regcache, int tid, int regno) &ppc32_linux_ctarregset); return; } + else if (PPC_IS_DMR_REGNUM (regno)) + { + gdb_assert (tdep->ppc_dmr0_regnum != -1); + + fetch_regset (regcache, tid, NT_PPC_DMR, + PPC_LINUX_SIZEOF_DMRREGSET, + &ppc32_linux_dmrregset); + return; + } if (regaddr == -1) { @@ -1304,6 +1313,10 @@ fetch_ppc_registers (struct regcache *regcache, int tid) fetch_regset (regcache, tid, NT_PPC_TM_CVSX, PPC_LINUX_SIZEOF_CVSXREGSET, &ppc32_linux_cvsxregset); + if (tdep->ppc_dmr0_regnum != -1) + fetch_regset (regcache, tid, NT_PPC_DMR, + PPC_LINUX_SIZEOF_DMRREGSET, + &ppc32_linux_dmrregset); if (tdep->ppc_cppr_regnum != -1) fetch_regset (regcache, tid, NT_PPC_TM_CPPR, PPC_LINUX_SIZEOF_CPPRREGSET, @@ -1617,6 +1630,15 @@ store_register (const struct regcache *regcache, int tid, int regno) &ppc32_linux_ctarregset); return; } + else if (PPC_IS_DMR_REGNUM (regno)) + { + gdb_assert (tdep->ppc_dmr0_regnum != -1); + + store_regset (regcache, tid, regno, NT_PPC_DMR, + PPC_LINUX_SIZEOF_DMRREGSET, + &ppc32_linux_dmrregset); + return; + } if (regaddr == -1) return; @@ -1851,6 +1873,11 @@ store_ppc_registers (const struct regcache *regcache, int tid) PPC_LINUX_SIZEOF_TM_SPRREGSET, &ppc32_linux_tm_sprregset); + if (tdep->ppc_dmr0_regnum != -1) + store_regset (regcache, tid, -1, NT_PPC_DMR, + PPC_LINUX_SIZEOF_DMRREGSET, + &ppc32_linux_dmrregset); + /* Because the EBB and checkpointed HTM registers can be unavailable, attempts to store them here would cause this function to fail most of the time, so we ignore them. */ @@ -2020,6 +2047,10 @@ ppc_linux_nat_target::read_description () } } + if ((hwcap2 & PPC_FEATURE2_DMF) + && check_regset (tid, NT_PPC_DMR, PPC_LINUX_SIZEOF_DMRREGSET)) + features.isa32 = true; + return ppc_linux_match_description (features); } diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index b468dbcb62c..8a03b5fbb40 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -83,6 +83,8 @@ #include "features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c" #include "features/rs6000/powerpc-isa207-vsx64l.c" #include "features/rs6000/powerpc-isa207-htm-vsx64l.c" +#include "features/rs6000/powerpc-isa32-vsx32l.c" +#include "features/rs6000/powerpc-isa32-vsx64l.c" #include "features/rs6000/powerpc-e500l.c" #include "dwarf2/frame.h" @@ -660,6 +662,30 @@ const struct regset ppc32_linux_pmuregset = { regcache_collect_regset }; +/* Dense Math Register map. */ + +static const struct regcache_map_entry ppc32_regmap_dmr[] = + { + /* Each DMR register is 128 bytes (1024 bits). */ + { 1, PPC_DMR0_REGNUM, 128 }, + { 1, PPC_DMR1_REGNUM, 128 }, + { 1, PPC_DMR2_REGNUM, 128 }, + { 1, PPC_DMR3_REGNUM, 128 }, + { 1, PPC_DMR4_REGNUM, 128 }, + { 1, PPC_DMR5_REGNUM, 128 }, + { 1, PPC_DMR6_REGNUM, 128 }, + { 1, PPC_DMR7_REGNUM, 128 }, + { 0 } + }; + +/* Dense Math Register set. */ + +const struct regset ppc32_linux_dmrregset = { + ppc32_regmap_dmr, + regcache_supply_regset, + regcache_collect_regset +}; + /* Hardware Transactional Memory special-purpose register regmap. */ static const struct regcache_map_entry ppc32_regmap_tm_spr[] = @@ -1074,6 +1100,11 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, "Hardware Transactional Memory Special Purpose Registers", cb_data); + if (tdep->ppc_dmr0_regnum != -1) + cb (".reg-ppc-dmr", PPC_LINUX_SIZEOF_DMRREGSET, + PPC_LINUX_SIZEOF_DMRREGSET, + &ppc32_linux_dmrregset, "Dense Math Registers", cb_data); + /* Checkpointed registers can be unavailable, don't call back if we are generating a core file. */ @@ -2414,6 +2445,7 @@ INIT_GDB_FILE (ppc_linux_tdep) initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (); initialize_tdesc_powerpc_isa207_vsx32l (); initialize_tdesc_powerpc_isa207_htm_vsx32l (); + initialize_tdesc_powerpc_isa32_vsx32l (); initialize_tdesc_powerpc_64l (); initialize_tdesc_powerpc_altivec64l (); initialize_tdesc_powerpc_vsx64l (); @@ -2423,5 +2455,6 @@ INIT_GDB_FILE (ppc_linux_tdep) initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (); initialize_tdesc_powerpc_isa207_vsx64l (); initialize_tdesc_powerpc_isa207_htm_vsx64l (); + initialize_tdesc_powerpc_isa32_vsx64l (); initialize_tdesc_powerpc_e500l (); } diff --git a/gdb/ppc-linux-tdep.h b/gdb/ppc-linux-tdep.h index 2f99d7dc404..4f91caa2afd 100644 --- a/gdb/ppc-linux-tdep.h +++ b/gdb/ppc-linux-tdep.h @@ -64,5 +64,6 @@ extern const struct regset ppc32_linux_cvsxregset; extern const struct regset ppc32_linux_cpprregset; extern const struct regset ppc32_linux_cdscrregset; extern const struct regset ppc32_linux_ctarregset; +extern const struct regset ppc32_linux_dmrregset; #endif /* GDB_PPC_LINUX_TDEP_H */ diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h index 4dd20413125..78238ff8f58 100644 --- a/gdb/ppc-tdep.h +++ b/gdb/ppc-tdep.h @@ -282,6 +282,10 @@ struct ppc_gdbarch_tdep : gdbarch_tdep_base int ppc_sdar_regnum = 0; int ppc_sier_regnum = 0; + /* Register number of dmr0, or -1 if Dense Math registers are not + available. */ + int ppc_dmr0_regnum = 0; + /* Hardware Transactional Memory registers. */ int have_htm_spr = 0; int have_htm_core = 0; @@ -389,6 +393,16 @@ enum { PPC_CPPR_REGNUM = 321, PPC_CDSCR_REGNUM = 322, PPC_CTAR_REGNUM = 323, + + /* Dense Math Registers (DMR). */ + PPC_DMR0_REGNUM = 324, + PPC_DMR1_REGNUM, + PPC_DMR2_REGNUM, + PPC_DMR3_REGNUM, + PPC_DMR4_REGNUM, + PPC_DMR5_REGNUM, + PPC_DMR6_REGNUM, + PPC_DMR7_REGNUM, PPC_NUM_REGS }; @@ -416,6 +430,8 @@ enum { #define PPC_IS_CKPTVSX_REGNUM(i) \ ((i) >= PPC_CVSR0_UPPER_REGNUM && (i) < (PPC_CVSR0_UPPER_REGNUM + 32)) +#define PPC_IS_DMR_REGNUM(i) ((i) >= PPC_DMR0_REGNUM && (i) <= PPC_DMR7_REGNUM) + /* An instruction to match. */ struct ppc_insn_pattern diff --git a/gdb/regformats/rs6000/powerpc-isa32-vsx32l.dat b/gdb/regformats/rs6000/powerpc-isa32-vsx32l.dat new file mode 100644 index 00000000000..bc9d1c511e1 --- /dev/null +++ b/gdb/regformats/rs6000/powerpc-isa32-vsx32l.dat @@ -0,0 +1,164 @@ +# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: +# Generated from: rs6000/powerpc-isa32-vsx32l.xml +name:powerpc_isa32_vsx32l +xmltarget:powerpc-isa32-vsx32l.xml +expedite:r1,pc +osabi:unknown +32:r0 +32:r1 +32:r2 +32:r3 +32:r4 +32:r5 +32:r6 +32:r7 +32:r8 +32:r9 +32:r10 +32:r11 +32:r12 +32:r13 +32:r14 +32:r15 +32:r16 +32:r17 +32:r18 +32:r19 +32:r20 +32:r21 +32:r22 +32:r23 +32:r24 +32:r25 +32:r26 +32:r27 +32:r28 +32:r29 +32:r30 +32:r31 +64:f0 +64:f1 +64:f2 +64:f3 +64:f4 +64:f5 +64:f6 +64:f7 +64:f8 +64:f9 +64:f10 +64:f11 +64:f12 +64:f13 +64:f14 +64:f15 +64:f16 +64:f17 +64:f18 +64:f19 +64:f20 +64:f21 +64:f22 +64:f23 +64:f24 +64:f25 +64:f26 +64:f27 +64:f28 +64:f29 +64:f30 +64:f31 +32:pc +32:msr +32:cr +32:lr +32:ctr +32:xer +32:fpscr +32:orig_r3 +32:trap +128:vr0 +128:vr1 +128:vr2 +128:vr3 +128:vr4 +128:vr5 +128:vr6 +128:vr7 +128:vr8 +128:vr9 +128:vr10 +128:vr11 +128:vr12 +128:vr13 +128:vr14 +128:vr15 +128:vr16 +128:vr17 +128:vr18 +128:vr19 +128:vr20 +128:vr21 +128:vr22 +128:vr23 +128:vr24 +128:vr25 +128:vr26 +128:vr27 +128:vr28 +128:vr29 +128:vr30 +128:vr31 +32:vscr +32:vrsave +64:vs0h +64:vs1h +64:vs2h +64:vs3h +64:vs4h +64:vs5h +64:vs6h +64:vs7h +64:vs8h +64:vs9h +64:vs10h +64:vs11h +64:vs12h +64:vs13h +64:vs14h +64:vs15h +64:vs16h +64:vs17h +64:vs18h +64:vs19h +64:vs20h +64:vs21h +64:vs22h +64:vs23h +64:vs24h +64:vs25h +64:vs26h +64:vs27h +64:vs28h +64:vs29h +64:vs30h +64:vs31h +64:ppr +64:dscr +64:tar +64:bescr +64:ebbhr +64:ebbrr +64:mmcr0 +64:mmcr2 +64:siar +64:sdar +64:sier +1024:dmr0 +1024:dmr1 +1024:dmr2 +1024:dmr3 +1024:dmr4 +1024:dmr5 +1024:dmr6 +1024:dmr7 diff --git a/gdb/regformats/rs6000/powerpc-isa32-vsx64l.dat b/gdb/regformats/rs6000/powerpc-isa32-vsx64l.dat new file mode 100644 index 00000000000..fb1e4756cb7 --- /dev/null +++ b/gdb/regformats/rs6000/powerpc-isa32-vsx64l.dat @@ -0,0 +1,164 @@ +# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: +# Generated from: rs6000/powerpc-isa32-vsx64l.xml +name:powerpc_isa32_vsx64l +xmltarget:powerpc-isa32-vsx64l.xml +expedite:r1,pc +osabi:unknown +64:r0 +64:r1 +64:r2 +64:r3 +64:r4 +64:r5 +64:r6 +64:r7 +64:r8 +64:r9 +64:r10 +64:r11 +64:r12 +64:r13 +64:r14 +64:r15 +64:r16 +64:r17 +64:r18 +64:r19 +64:r20 +64:r21 +64:r22 +64:r23 +64:r24 +64:r25 +64:r26 +64:r27 +64:r28 +64:r29 +64:r30 +64:r31 +64:f0 +64:f1 +64:f2 +64:f3 +64:f4 +64:f5 +64:f6 +64:f7 +64:f8 +64:f9 +64:f10 +64:f11 +64:f12 +64:f13 +64:f14 +64:f15 +64:f16 +64:f17 +64:f18 +64:f19 +64:f20 +64:f21 +64:f22 +64:f23 +64:f24 +64:f25 +64:f26 +64:f27 +64:f28 +64:f29 +64:f30 +64:f31 +64:pc +64:msr +32:cr +64:lr +64:ctr +32:xer +64:fpscr +64:orig_r3 +64:trap +128:vr0 +128:vr1 +128:vr2 +128:vr3 +128:vr4 +128:vr5 +128:vr6 +128:vr7 +128:vr8 +128:vr9 +128:vr10 +128:vr11 +128:vr12 +128:vr13 +128:vr14 +128:vr15 +128:vr16 +128:vr17 +128:vr18 +128:vr19 +128:vr20 +128:vr21 +128:vr22 +128:vr23 +128:vr24 +128:vr25 +128:vr26 +128:vr27 +128:vr28 +128:vr29 +128:vr30 +128:vr31 +32:vscr +32:vrsave +64:vs0h +64:vs1h +64:vs2h +64:vs3h +64:vs4h +64:vs5h +64:vs6h +64:vs7h +64:vs8h +64:vs9h +64:vs10h +64:vs11h +64:vs12h +64:vs13h +64:vs14h +64:vs15h +64:vs16h +64:vs17h +64:vs18h +64:vs19h +64:vs20h +64:vs21h +64:vs22h +64:vs23h +64:vs24h +64:vs25h +64:vs26h +64:vs27h +64:vs28h +64:vs29h +64:vs30h +64:vs31h +64:ppr +64:dscr +64:tar +64:bescr +64:ebbhr +64:ebbrr +64:mmcr0 +64:mmcr2 +64:siar +64:sdar +64:sier +1024:dmr0 +1024:dmr1 +1024:dmr2 +1024:dmr3 +1024:dmr4 +1024:dmr5 +1024:dmr6 +1024:dmr7 diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 05a4f1a371c..dbaf836d0e7 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -7553,7 +7553,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) int have_tar = 0, have_ebb = 0, have_pmu = 0, have_htm_spr = 0; int have_htm_core = 0, have_htm_fpu = 0, have_htm_altivec = 0; int have_htm_vsx = 0, have_htm_ppr = 0, have_htm_dscr = 0; - int have_htm_tar = 0; + int have_htm_tar = 0, have_dmr = 0; int tdesc_wordsize = -1; const struct target_desc *tdesc = info.target_desc; tdesc_arch_data_up tdesc_data; @@ -7883,6 +7883,27 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) else have_ebb = 0; + /* Dense Math Registers (DMR). */ + feature = tdesc_find_feature (tdesc, "org.gnu.gdb.power.dmr"); + if (feature != NULL) + { + static const char *const dmr_regs[] = { + "dmr0", "dmr1", "dmr2", "dmr3", "dmr4", "dmr5", + "dmr6", "dmr7" + }; + + valid_p = 1; + for (i = 0; i < ARRAY_SIZE (dmr_regs); i++) + valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), + PPC_DMR0_REGNUM + i, + dmr_regs[i]); + if (!valid_p) + return NULL; + have_dmr = 1; + } + else + have_dmr = 0; + /* Subset of the ISA 2.07 Performance Monitor Registers provided by Linux. */ feature = tdesc_find_feature (tdesc, @@ -8290,6 +8311,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->ppc_siar_regnum = have_pmu ? PPC_SIAR_REGNUM : -1; tdep->ppc_sdar_regnum = have_pmu ? PPC_SDAR_REGNUM : -1; tdep->ppc_sier_regnum = have_pmu ? PPC_SIER_REGNUM : -1; + tdep->ppc_dmr0_regnum = have_dmr ? PPC_DMR0_REGNUM : -1; tdep->have_htm_spr = have_htm_spr; tdep->have_htm_core = have_htm_core; diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv index 7bdd92e3f82..5dfdcd7d999 100644 --- a/gdbserver/configure.srv +++ b/gdbserver/configure.srv @@ -22,7 +22,7 @@ # srv_linux_usrregs Set to "yes" if we can get at registers via # PTRACE_PEEKUSR / PTRACE_POKEUSR. -ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-isa207-vsx32l-ipa.o powerpc-isa207-htm-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o powerpc-isa207-vsx64l-ipa.o powerpc-isa207-htm-vsx64l-ipa.o" +ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-isa207-vsx32l-ipa.o powerpc-isa207-htm-vsx32l-ipa.o powerpc-isa32-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o powerpc-isa207-vsx64l-ipa.o powerpc-isa207-htm-vsx64l-ipa.o powerpc-isa32-vsx64l-ipa.o" # Linux object files. This is so we don't have to repeat # these files over and over again. @@ -221,6 +221,7 @@ case "${gdbserver_host}" in srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx32l.o" srv_regobj="${srv_regobj} powerpc-isa207-vsx32l.o" srv_regobj="${srv_regobj} powerpc-isa207-htm-vsx32l.o" + srv_regobj="${srv_regobj} powerpc-isa32-vsx32l.o" srv_regobj="${srv_regobj} powerpc-e500l.o" srv_regobj="${srv_regobj} powerpc-64l.o" srv_regobj="${srv_regobj} powerpc-altivec64l.o" @@ -231,6 +232,7 @@ case "${gdbserver_host}" in srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx64l.o" srv_regobj="${srv_regobj} powerpc-isa207-vsx64l.o" srv_regobj="${srv_regobj} powerpc-isa207-htm-vsx64l.o" + srv_regobj="${srv_regobj} powerpc-isa32-vsx64l.o" srv_tgtobj="$srv_linux_obj linux-ppc-low.o" srv_tgtobj="${srv_tgtobj} nat/ppc-linux.o" srv_tgtobj="${srv_tgtobj} arch/ppc-linux-common.o" @@ -243,6 +245,7 @@ case "${gdbserver_host}" in srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx32l.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-htm-vsx32l.xml" + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa32-vsx32l.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-vsx.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml" @@ -253,6 +256,7 @@ case "${gdbserver_host}" in srv_xmlfiles="${srv_xmlfiles} rs6000/power-ppr.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-tar.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-ebb.xml" + srv_xmlfiles="${srv_xmlfiles} rs6000/power-dmr.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux-pmu.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-spr.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-core.xml" @@ -273,6 +277,7 @@ case "${gdbserver_host}" in srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx64l.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-htm-vsx64l.xml" + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa32-vsx64l.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power64-linux.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/power64-htm-core.xml" diff --git a/gdbserver/linux-ppc-ipa.cc b/gdbserver/linux-ppc-ipa.cc index 6e815d52434..4123ded52ec 100644 --- a/gdbserver/linux-ppc-ipa.cc +++ b/gdbserver/linux-ppc-ipa.cc @@ -194,6 +194,8 @@ get_ipa_tdesc (int idx) return tdesc_powerpc_isa207_vsx64l.get (); case PPC_TDESC_ISA207_HTM_VSX: return tdesc_powerpc_isa207_htm_vsx64l.get (); + case PPC_TDESC_ISA32_VSX: + return tdesc_powerpc_isa32_vsx64l.get (); #else case PPC_TDESC_BASE: return tdesc_powerpc_32l.get (); @@ -213,6 +215,8 @@ get_ipa_tdesc (int idx) return tdesc_powerpc_isa207_vsx32l.get (); case PPC_TDESC_ISA207_HTM_VSX: return tdesc_powerpc_isa207_htm_vsx32l.get (); + case PPC_TDESC_ISA32_VSX: + return tdesc_powerpc_isa32_vsx32l.get (); case PPC_TDESC_E500: return tdesc_powerpc_e500l.get (); #endif diff --git a/gdbserver/linux-ppc-low.cc b/gdbserver/linux-ppc-low.cc index 6a2c4136041..67f27bf8fed 100644 --- a/gdbserver/linux-ppc-low.cc +++ b/gdbserver/linux-ppc-low.cc @@ -558,6 +558,34 @@ ppc_store_pmuregset (struct regcache *regcache, const void *buf) supply_register_by_name (regcache, "mmcr0", ®set[32]); } +/* Dense Math Registers (DMR). */ +static const char *const dmr_names[] = { + "dmr0", "dmr1", "dmr2", "dmr3", + "dmr4", "dmr5", "dmr6", "dmr7" +}; + +/* Dense Math Register regset fill function. */ + +static void +ppc_fill_dmrregset (struct regcache *regcache, void *buf) +{ + char *regset = (char *) buf; + + for (int i = 0; i < 8; i++) + collect_register_by_name (regcache, dmr_names[i], ®set[i * 128]); +} + +/* Dense Math Register regset store function. */ + +static void +ppc_store_dmrregset (struct regcache *regcache, const void *buf) +{ + const char *regset = (const char *) buf; + + for (int i = 0; i < 8; i++) + supply_register_by_name (regcache, dmr_names[i], ®set[i * 128]); +} + /* Hardware Transactional Memory special-purpose register regset fill function. */ @@ -831,6 +859,8 @@ static struct regset_info ppc_regsets[] = { NULL, ppc_store_ebbregset }, { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PMU, 0, EXTENDED_REGS, ppc_fill_pmuregset, ppc_store_pmuregset }, + { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_DMR, 0, EXTENDED_REGS, + ppc_fill_dmrregset, ppc_store_dmrregset }, { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TAR, 0, EXTENDED_REGS, ppc_fill_tarregset, ppc_store_tarregset }, { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PPR, 0, EXTENDED_REGS, @@ -926,6 +956,9 @@ ppc_target::low_arch_setup () } } + if (ppc_hwcap2 & PPC_FEATURE2_DMF) + features.isa32 = true; + tdesc = ppc_linux_match_description (features); /* On 32-bit machines, check for SPE registers. @@ -990,6 +1023,10 @@ ppc_target::low_arch_setup () regset->size = (features.isa207 ? PPC_LINUX_SIZEOF_PMUREGSET : 0); break; + case NT_PPC_DMR: + regset->size = (features.isa32 ? + PPC_LINUX_SIZEOF_DMRREGSET : 0); + break; case NT_PPC_TM_SPR: regset->size = (features.htm ? PPC_LINUX_SIZEOF_TM_SPRREGSET : 0); @@ -3415,6 +3452,8 @@ ppc_target::get_ipa_tdesc_idx () return PPC_TDESC_ISA207_VSX; if (tdesc == tdesc_powerpc_isa207_htm_vsx64l.get ()) return PPC_TDESC_ISA207_HTM_VSX; + if (tdesc == tdesc_powerpc_isa32_vsx64l.get ()) + return PPC_TDESC_ISA32_VSX; #endif if (tdesc == tdesc_powerpc_32l.get ()) @@ -3435,6 +3474,8 @@ ppc_target::get_ipa_tdesc_idx () return PPC_TDESC_ISA207_VSX; if (tdesc == tdesc_powerpc_isa207_htm_vsx32l.get ()) return PPC_TDESC_ISA207_HTM_VSX; + if (tdesc == tdesc_powerpc_isa32_vsx32l.get ()) + return PPC_TDESC_ISA32_VSX; if (tdesc == tdesc_powerpc_e500l.get ()) return PPC_TDESC_E500; @@ -3459,6 +3500,7 @@ initialize_low_arch (void) init_registers_powerpc_isa205_ppr_dscr_vsx32l (); init_registers_powerpc_isa207_vsx32l (); init_registers_powerpc_isa207_htm_vsx32l (); + init_registers_powerpc_isa32_vsx32l (); init_registers_powerpc_e500l (); #if __powerpc64__ init_registers_powerpc_64l (); @@ -3470,6 +3512,7 @@ initialize_low_arch (void) init_registers_powerpc_isa205_ppr_dscr_vsx64l (); init_registers_powerpc_isa207_vsx64l (); init_registers_powerpc_isa207_htm_vsx64l (); + init_registers_powerpc_isa32_vsx64l (); #endif initialize_regsets_info (&ppc_regsets_info); diff --git a/gdbserver/linux-ppc-tdesc-init.h b/gdbserver/linux-ppc-tdesc-init.h index f7d220e88ad..5163c373902 100644 --- a/gdbserver/linux-ppc-tdesc-init.h +++ b/gdbserver/linux-ppc-tdesc-init.h @@ -35,6 +35,7 @@ enum ppc_linux_tdesc { PPC_TDESC_ISA205_PPR_DSCR_VSX, PPC_TDESC_ISA207_VSX, PPC_TDESC_ISA207_HTM_VSX, + PPC_TDESC_ISA32_VSX, PPC_TDESC_E500, }; @@ -67,6 +68,9 @@ void init_registers_powerpc_isa207_vsx32l (void); /* Defined in auto-generated file powerpc-isa207-htm-vsx32l.c. */ void init_registers_powerpc_isa207_htm_vsx32l (void); +/* Defined in auto-generated file powerpc-isa32-vsx32l.c. */ +void init_registers_powerpc_isa32_vsx32l (void); + /* Defined in auto-generated file powerpc-e500l.c. */ void init_registers_powerpc_e500l (void); @@ -101,6 +105,9 @@ void init_registers_powerpc_isa207_vsx64l (void); /* Defined in auto-generated file powerpc-isa207-htm-vsx64l.c. */ void init_registers_powerpc_isa207_htm_vsx64l (void); +/* Defined in auto-generated file powerpc-isa32-vsx64l.c. */ +void init_registers_powerpc_isa32_vsx64l (void); + #endif #endif /* GDBSERVER_LINUX_PPC_TDESC_INIT_H */ -- 2.51.1