From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id 26AAE3856091 for ; Tue, 2 Aug 2022 08:07:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 26AAE3856091 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 2726Mn1h012309; Tue, 2 Aug 2022 08:07:40 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3hmv8s61d2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 02 Aug 2022 08:07:40 +0000 Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 2726G57C014237; Tue, 2 Aug 2022 08:07:39 GMT Received: from nam02-bn1-obe.outbound.protection.outlook.com (mail-bn1nam07lp2041.outbound.protection.outlook.com [104.47.51.41]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3hmu3235w3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 02 Aug 2022 08:07:39 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=h/IJP/8oMalPJq96HjYXUOGad6hz3c+st8yeE8UXivGMPzcXLPZz7GAt/lYfDmygCL+kp2u0JaVLWKukkg6JGCUS+4nhntMWPjt8oo74FZoINl7GpI9FIAP2lUmhI0rg2p/cI1OLSSGi2vZsX8J4j9pn/hUgnUfE9hEYdR6UWrCz9Rag4xcuEOlK8xJMb+logUaJJv5CyLmaTjyXIC4Gb7joZT3r9XHUBdDShEv7yQhSqfqMjrshcxQVBc86iqSy5QxntEuWX+btnMQcHnpbVSLQ4SzVstj1SwhyQtAX6Uj3IZr9KEj6vHAL3m8tbLcL2AnAB0SsCj73rdyjRyp9ag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ww7B1Spg4L5GQJKvi2Cl2xDBz7zWwgMkZAcCU7r3T8Q=; b=ADDuJlBqDlNS4+vSfjxGdKGuYaqektd4N24+Zhk7iaVFqZ6BjknW9HeNBxufEKwhj2lZcYFvLlvuZItushw+ayZdB5nKFPvrXyoI9Oi3hNUf21B8DP5wbzz8v3PmEbGCFm3ZGWASZtJ/e5hR947afkja96TO2R3BTqt8NKrfg6MeoZvifbRJR/b8mbgmj+TOxhHGOTSu4DtGU3go54TBkDq616CMO5dFycyszt7m/6Z+I4gEq+pUVEFqJx2SauFC0Gm4YfImW4hj7wWd4sLM7spPX5jHLSnlKiJ+nYD6xrSEeGXGjPHgo6q4HC508SPabgwAnNH1pK8vTxpMQOF/1A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none Received: from MWHPR1001MB2158.namprd10.prod.outlook.com (2603:10b6:301:2d::17) by CH2PR10MB4184.namprd10.prod.outlook.com (2603:10b6:610:7f::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5482.11; Tue, 2 Aug 2022 08:07:38 +0000 Received: from MWHPR1001MB2158.namprd10.prod.outlook.com ([fe80::65fb:fa92:9a15:f89b]) by MWHPR1001MB2158.namprd10.prod.outlook.com ([fe80::65fb:fa92:9a15:f89b%6]) with mapi id 15.20.5482.016; Tue, 2 Aug 2022 08:07:38 +0000 From: Indu Bhagat To: binutils@sourceware.org Cc: amodra@gmail.com, weimin.pan@oracle.com, Indu Bhagat Subject: [PATCH,V6 05/10] libctfframe: add GNU poke pickles for CTF Frame Date: Tue, 2 Aug 2022 01:04:47 -0700 Message-Id: <20220802080452.1143351-6-indu.bhagat@oracle.com> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220802080452.1143351-1-indu.bhagat@oracle.com> References: <20220802080452.1143351-1-indu.bhagat@oracle.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: MW4PR04CA0074.namprd04.prod.outlook.com (2603:10b6:303:6b::19) To MWHPR1001MB2158.namprd10.prod.outlook.com (2603:10b6:301:2d::17) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0675a9bd-809f-4cce-e495-08da745e1070 X-MS-TrafficTypeDiagnostic: CH2PR10MB4184:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CUHtH28kczIEdnrlcHNhNqNGiJbKbIiln1JCUr8E43Yvy7KwYL67Uess6qs5APKiIotm5STEOOq3/+YneCPHmpYTW7oj+dICT25JGCRg5xWohcEemCgLl0Vxwztch9zhdovyJKuvMoTON9youkOc3H/EzIuvJ8cAJJvDML+3yT8v3uh0oW5KfglntEUeP+9YvYEk66euA43zZGmgW/zErRts4GKmaOG4ZJH0zhmwBY73YE8rZSWUz11i1Z4a90K3t3304A6BFbWGnV+fwbAHmzoPxfDdCXtjFuHsHSUHlpbvewNEuOEEnDOLRt9b0eV3yGZBbaTp1lh4huzWWcU2L3FhO/JOm6qd3AVenqs4YF8KNue8qHqOhNiwF6mWbrs5eTJo6WUAnMNkpl0yqe/y9342XuvMX+5Y4IXwlRitVgbMXOF7FR9WHi9lNgH0//j1RQcQsGkNj7plXm/zHQRBnnY7rKEsqZdH9t3JWI0hwAN2DiW3kLB1AP6kLQgzmCcwZYk8YOSsIoUwa8fZ/BZKM4eBroJBSsOtg4CeNVNznl/0HErwP6lQxBx/mzZcqSmNNYN97v5RPt8s1BAWBsw7P7OtR+otDY8ZEBz1FSVdH0m5HAGnEGHjamTyuTFAOIu3Thq8QXMbaCs39sJ66DHcpdrsv11MfPnIixb48PzxocP3FFahJuqn3AZ+DgcaFj59P8zZDTDHA7TbL9C3YFMb7pgZ786CZuVoXb/fzfCzdJf/pro6UcYxbVeEa6YPeXfn5myrJ03MTTTVU4sswnyeRnYNvuG4tyLtIds85zBuJCwApvWEMhVxPVzmqPrVDbhuFKGby9HssGRhR1MWnbjjiBk/YePO3EMJ1Ghpe++Oqgw= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MWHPR1001MB2158.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(376002)(366004)(136003)(346002)(396003)(39860400002)(4326008)(2616005)(1076003)(107886003)(186003)(66476007)(8936002)(66556008)(44832011)(8676002)(5660300002)(66946007)(2906002)(36756003)(316002)(86362001)(478600001)(6916009)(6506007)(52116002)(6666004)(41300700001)(6512007)(26005)(38350700002)(38100700002)(6486002)(2004002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?TqKDP1pMHoqo8s/6qAphTtS4kwJ1UlvKFaQqDoV+hD817NnPThBDb1wR8ydV?= =?us-ascii?Q?i3wQ8x3/8W6IBU4lFLUPABF3+8zGu2jUTwDYHOubJvVQgQ828QbzzR3goPRk?= =?us-ascii?Q?XC6WQjdyAl0I3YOU6/zcbdO6s89Y9x+Aq027TkRIrGa5rPvn7yNG4IbhK7Am?= =?us-ascii?Q?5zSCAWzezzTeSlpQrBoqfLx6acmqIN3fyRTDdun4KPEKVSHrd/RBmZuGtFUP?= =?us-ascii?Q?cNP8LzAcsbEtiRPi/OvTrccR9mnUHJ5WwNRGdXZRjbqf4NufK/jDllgiZ5Tn?= =?us-ascii?Q?9bSIUhzX15xnQRvl5eC7NFEwtHDNEYgOQSyg7iEOpFaQlVbVimTfWmUTGduW?= =?us-ascii?Q?TRI4pOh3PqAK4A/8iycHAeD/fRzXv92nH+qsHCqfgCla1wqujzeCmsMZckn8?= =?us-ascii?Q?oSW0PKbjl8UfN8AAmu2HAlaegamSncVZrORE5yXD+WW1xQeFPkHLoDxjLo1k?= =?us-ascii?Q?njxd0E9WH3OotNAWvyHKEkIcdyAheY6f2Bl7wz+Gs03jC7GmNEbbVimSXcr2?= =?us-ascii?Q?HsNInxUjJY/zNJsnPz+QHPdANoSKzHU5XT6rAzte6zXR5A+zK2o4ZZGqHnCE?= =?us-ascii?Q?PbGT5gI9OEagZRJUcjSy3kY87N+EczMgIXvg6Dm9s4gYQrhqpRKJNUgRWjFj?= =?us-ascii?Q?Yl4Y64NgXhD1ONs0ZfkhfqHLOscL5N6Hxdx9ReM4j0CIU2Zi2fGGH8gpratO?= =?us-ascii?Q?rzpjAlEiqBSx7477frUxbYjlew9PeeD/iVtTJ8f4QYwOSvqDuZ7oVlgWqcE3?= =?us-ascii?Q?Qa0Odm8FRVwN4VzPfzn9lw4fZvSvY76yzVZOlf3hcBzV+HCLYmtnedOrVPNy?= =?us-ascii?Q?MBv0j1S5N0lZosVVdCDoTz1MMGisEhfg1slEkJ+UU0JcwRuevtpzYxJfJZ5d?= =?us-ascii?Q?AkQ97/x1iyIMlZlPBpepmnIczQFhYAMAJcLr3QzVH8eTikjzx+Hr5F1ltQP2?= =?us-ascii?Q?oEQsa7Q3RYNARtNfe5ryPe2n1jiK6dMroipzfvGAqXiusjcHx7DH89KGEUGl?= =?us-ascii?Q?TDV07zKAUsQVgcvT/p6s4Xu6E5bUNvm4wzHIYOxIdSaRjnzIDhsoEc+eh8dm?= =?us-ascii?Q?l0n70gTch+PBXDdVbwqQC6gsiLLL/0dmqtnZShHCMl/FhtoVBmlNeZF4s7KR?= =?us-ascii?Q?VeRsjDrhfXFgUiKDmUeF1grZtjEhesqdFVADXhXI+VPf4ZXIKqzpEbK41XP5?= =?us-ascii?Q?eqKCz9XtSNB3WMTjer6ZRtnNcU6ADuQV60Z37ygyFm8MvoHZR1HaEkRAQzWG?= =?us-ascii?Q?Ll6wBox1fc8J/jFx5kK9qmY1RPKKYJ02aKR0+n0KPhnkjs2c4qmzcQ1+GyYH?= =?us-ascii?Q?9TtpiTHmR6Dvldrn7Rukz1P6jJRhOYSAcljTHz+nRn0w01aVNLaAG0rHrYDA?= =?us-ascii?Q?ZWtt92RCAya5za6/5LgypmjXTNQwA4Uh3//va3kUNsHJb8KFqTVySa0mKIgS?= =?us-ascii?Q?OD1zMQBlx8WM9kiCdzIjkBmwnUxXedtTQI4Y9ar4Yn7nrvnw4SZMrR8SmQSC?= =?us-ascii?Q?iZ0MH2+9vmXUlKx+YbS7gclwhr/pBrrQPOk/iHb/2xDyycywil+78AwMloed?= =?us-ascii?Q?zSMpKQ1IPsWamGgoQtgIxiLkL97RFASBDAGdD6Vl?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0675a9bd-809f-4cce-e495-08da745e1070 X-MS-Exchange-CrossTenant-AuthSource: MWHPR1001MB2158.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Aug 2022 08:07:38.0271 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: e+B0BSnIquNf+qF0yY5m6PSUSQlEdPeIwNrixVPAqMmtZfpfUd5bW4aknqRaKv1GEXX76AriYWwcNtpoUxUydg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR10MB4184 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-08-02_04,2022-08-01_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 mlxlogscore=999 phishscore=0 malwarescore=0 suspectscore=0 spamscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2208020038 X-Proofpoint-GUID: L4sYqEAWl4MY2p8R-b2rb0tsEfJxJNsV X-Proofpoint-ORIG-GUID: L4sYqEAWl4MY2p8R-b2rb0tsEfJxJNsV X-Spam-Status: No, score=-13.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Aug 2022 08:07:44 -0000 [No changes from V5] [Added in V4] If you want to use these pickles in GNU poke, following is one way to use the pickles. $ objcopy --dump-section .ctf_frame=output_ctf_frame binary $ poke output_ctf_frame In the GNU poke program: (poke) .load libctfframe/ctf-frame-dump.pk (poke) .set omode tree (poke) var ctf_frame = CTF_Frame_section @ 0#B ChangeLog: * libctfframe/ctf-frame-dump.pk: New file. * libctfframe/ctf-frame.pk: Likewise. --- libctfframe/ctf-frame-dump.pk | 68 ++++++++++++ libctfframe/ctf-frame.pk | 200 ++++++++++++++++++++++++++++++++++ 2 files changed, 268 insertions(+) create mode 100644 libctfframe/ctf-frame-dump.pk create mode 100644 libctfframe/ctf-frame.pk diff --git a/libctfframe/ctf-frame-dump.pk b/libctfframe/ctf-frame-dump.pk new file mode 100644 index 00000000000..ad90d423e61 --- /dev/null +++ b/libctfframe/ctf-frame-dump.pk @@ -0,0 +1,68 @@ +/* ctf-frame-dump.pk - Utilities for dumping CTF Frame information. */ + +/* Copyright (C) 2022 Free Software Foundation. */ + +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* This file contains routines for dumping out CTF Frame information. */ + +load "ctf-frame.pk"; + +/* Dump each FDE in the CTF Frame section. */ + +fun ctf_frame_dump_fdes = (CTF_Frame_section ctf_frame_arg) void: +{ + var i = 0; + for (index in ctf_frame_arg.funcidx) + printf ("%u32d: %v \n", i++, index); +} + +/* Dump CTF Frame FREs. */ + +fun ctf_frame_dump_fres = (CTF_Frame_section ctf_frame_arg) void: +{ + var i = 0; + + for (func in ctf_frame_arg.funcidx) + { + /* Get the FRE type. */ + var fre_type = func.func_info.fre_type; + var num_fres = func.func_num_fres; + var fre_off = ctf_frame_arg.header'size + ctf_frame_arg.header.cth_freoff; + + if (fre_type == CTF_FRAME_ROW_ENTRY_TYPE_ADDR1) + { + var fres = func.get_fres_addr1s (fre_off); + /* print fres. */ + for (fre in fres) + printf ("%u32d: %v \n", i++, fre); + } + else if (fre_type == CTF_FRAME_ROW_ENTRY_TYPE_ADDR2) + { + var fres = func.get_fres_addr2s (fre_off); + /* print fres. */ + for (fre in fres) + printf ("%u32d: %v \n", i++, fre); + } + else if (fre_type == CTF_FRAME_ROW_ENTRY_TYPE_ADDR4) + { + var fres = func.get_fres_addr4s (fre_off); + /* print fres. */ + for (fre in fres) + printf ("%u32d: %v \n", i++, fre); + } + + } +} diff --git a/libctfframe/ctf-frame.pk b/libctfframe/ctf-frame.pk new file mode 100644 index 00000000000..059c20c72cf --- /dev/null +++ b/libctfframe/ctf-frame.pk @@ -0,0 +1,200 @@ +/* ctf-frame.pk - CTF Frame implementation for GNU poke. */ + +/* Copyright (C) 2022 Free Software Foundation. */ + +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +load elf; + +/* Constants for CTF Preamble. */ +var CTF_FRAME_VERSION_1 = 1; +var CTF_FRAME_MAGIC = 0xdee2; +/* Various flags for CTF Frame section. */ +var CTF_FRAME_F_FDE_SORTED = 0x1; +var CTF_FRAME_F_FRAME_POINTER = 0x2; + +type CTF_Frame_Preamble = + struct + { + uint<16> ctfp_magic : ((ctfp_magic == CTF_FRAME_MAGIC) + || (ctfp_magic == 0xe2de && set_endian (!get_endian))) + = CTF_FRAME_MAGIC; + + byte ctfp_version = CTF_FRAME_VERSION_1; + byte ctfp_flags; + }; + +var CTF_FRAME_ROW_ENTRY_TYPE_ADDR1 = 1; +var CTF_FRAME_ROW_ENTRY_TYPE_ADDR2 = 2; +var CTF_FRAME_ROW_ENTRY_TYPE_ADDR4 = 3; + +/* CTF Frame FDE types. + The CTF Frame format has two possible representations for functions. The + choice of which type to use is made according to the instruction patterns + in the relevant program stub. */ + +/* Unwinders perform a (PC >= FRE_START_ADDR) to look up a matching FRE. */ +var CTF_FRAME_FUNC_DESC_ENTRY_TYPE_PCINC = 0; +/* Unwinders perform a (PC & FRE_START_ADDR_AS_MASK >= FRE_START_ADDR_AS_MASK) + to look up a matching FRE. */ +var CTF_FRAME_FUNC_DESC_ENTRY_TYPE_PCMASK = 1; + +/* CTF Frame FDE Function Info. */ +type CTF_Frame_Func_Info = + struct +{ + uint<3> unused; + uint<1> fde_type : fde_type in [CTF_FRAME_FUNC_DESC_ENTRY_TYPE_PCINC, + CTF_FRAME_FUNC_DESC_ENTRY_TYPE_PCMASK]; + uint<4> fre_type : fre_type in [CTF_FRAME_ROW_ENTRY_TYPE_ADDR1, + CTF_FRAME_ROW_ENTRY_TYPE_ADDR2, + CTF_FRAME_ROW_ENTRY_TYPE_ADDR4]; +}; + +/* Supported ABIs/Arch. */ +var CTF_FRAME_ABI_AARCH64_ENDIAN_BIG = 1; /* AARCH64 little endian. */ +var CTF_FRAME_ABI_AARCH64_ENDIAN_LITTLE = 2; /* AARCH64 big endian. */ +var CTF_FRAME_ABI_AMD64_ENDIAN_LITTLE = 3; /* AMD64 little endian. */ + +var CTF_FRAME_FRE_TYPE_BASIC = 0x0; + +type CTF_Frame_Header = + struct + { + CTF_Frame_Preamble cth_frame_preamble; + byte cth_frame_abi_arch : cth_frame_abi_arch in [CTF_FRAME_ABI_AARCH64_ENDIAN_BIG, + CTF_FRAME_ABI_AARCH64_ENDIAN_LITTLE, + CTF_FRAME_ABI_AMD64_ENDIAN_LITTLE]; + int<8> cth_cfa_fixed_bp_offset; + int<8> cth_cfa_fixed_ra_offset; + uint<32> cth_num_fdes; + uint<32> cth_num_fres; + offset cth_frelen; + + offset cth_fdeoff; + offset cth_freoff; + }; + +var CTF_FRAME_FRE_OFFSET_1B = 0; +var CTF_FRAME_FRE_OFFSET_2B = 1; +var CTF_FRAME_FRE_OFFSET_4B = 2; +/* At this time, a max of 3 distinct offsets are supported. */ +var CTF_FRAME_FRE_OFFSET_NUM = 3; + +/* A CTF FRE can be SP or BP based. */ +var CTF_FRAME_BASE_REG_BP = 0; +var CTF_FRAME_BASE_REG_SP = 1; + +type CTF_Frame_FRE_Info = + struct byte + { + uint<1> unused; + uint<2> offset_size : offset_size in [CTF_FRAME_FRE_OFFSET_1B, + CTF_FRAME_FRE_OFFSET_2B, + CTF_FRAME_FRE_OFFSET_4B]; + uint<4> offset_num : offset_num <= CTF_FRAME_FRE_OFFSET_NUM; + uint<1> base_reg_id : base_reg_id in [CTF_FRAME_BASE_REG_BP, + CTF_FRAME_BASE_REG_SP]; + }; + +/* CTF FRE. */ +type CTF_FRE_addr1 = + struct + { + uint<8> fre_start_address; + CTF_Frame_FRE_Info fre_info; + union + { + int<8>[fre_info.offset_num] offsets_1B + : fre_info.offset_size == CTF_FRAME_FRE_OFFSET_1B; + int<16>[fre_info.offset_num] offsets_2B + : fre_info.offset_size == CTF_FRAME_FRE_OFFSET_2B; + int<32>[fre_info.offset_num] offsets_4B + : fre_info.offset_size == CTF_FRAME_FRE_OFFSET_4B; + } offsets; + }; + +type CTF_FRE_addr2 = + struct + { + uint<16> fre_start_address; + CTF_Frame_FRE_Info fre_info; + union + { + int<8>[fre_info.offset_num] offsets_1B + : fre_info.offset_size == CTF_FRAME_FRE_OFFSET_1B; + int<16>[fre_info.offset_num] offsets_2B + : fre_info.offset_size == CTF_FRAME_FRE_OFFSET_2B; + int<32>[fre_info.offset_num] offsets_4B + : fre_info.offset_size == CTF_FRAME_FRE_OFFSET_4B; + } offsets; + }; + +type CTF_FRE_addr4= + struct + { + uint<32> fre_start_address; + CTF_Frame_FRE_Info fre_info; + union + { + int<8>[fre_info.offset_num] offsets_1B + : fre_info.offset_size == CTF_FRAME_FRE_OFFSET_1B; + int<16>[fre_info.offset_num] offsets_2B + : fre_info.offset_size == CTF_FRAME_FRE_OFFSET_2B; + int<32>[fre_info.offset_num] offsets_4B + : fre_info.offset_size == CTF_FRAME_FRE_OFFSET_4B; + } offsets; + }; + + +type CTF_Frame_Func_Desc_Entry = + struct + { + uint<32> func_start_address; + uint<32> func_size; + offset func_freoff; + uint<32> func_num_fres; + CTF_Frame_Func_Info func_info; + + method get_fres_addr1s = (offset hdr_freoff) CTF_FRE_addr1[]: + { + var off = hdr_freoff + func_freoff; + return CTF_FRE_addr1[func_num_fres] @ off; + } + method get_fres_addr2s = (offset hdr_freoff) CTF_FRE_addr2[]: + { + var off = hdr_freoff + func_freoff; + return CTF_FRE_addr2[func_num_fres] @ off; + } + method get_fres_addr4s = (offset hdr_freoff) CTF_FRE_addr4[]: + { + var off = hdr_freoff + func_freoff; + return CTF_FRE_addr4[func_num_fres] @ off; + } + }; + +type CTF_Frame_section = + struct + { + CTF_Frame_Header header; + + var func_index_off = OFFSET + header.cth_fdeoff; + var func_index_size = header.cth_freoff - header.cth_fdeoff; + var fre_off = OFFSET + header.cth_freoff; + var fre_size = header.cth_frelen; + + CTF_Frame_Func_Desc_Entry[func_index_size] funcidx @ func_index_off; + byte[fre_size] fres_data_bytes @ fre_off; + }; -- 2.37.1