From nobody Thu Jan 8 13:17:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1767034143; cv=none; d=zohomail.com; s=zohoarc; b=JlGkfNljaea0O21/J0mX0dO+1Dgpor9VPibYENTW5M5dRJivsiHmfzFFuZf+GtzFAN8B4OhuuzSuQM9Usx9Wjik+9UexCKDkcxJ/bIX9BFRIMFCzL1uQSYTcCeTrMReGF4LmWIB07WdTgf/LTsOY41BOFhWRJ+cXbieetmX/hAI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767034143; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=M6VOV1+WA0NFLt3+OOv0t50IdwgHUgxMFm+1IFeKges=; b=lS5XfsWJlxVnJhQMcfcbe9iz2IDhtiQIaEvj1WEfjFUOtDpNt+B8j5VxHjGoCBycBFXx3tDtcXErdjvYlvvWpIEutiKosv/rWf34uEzIvQn3s+apFGGH9OfInQmgGhPLHkVuEKNv8Yu1kaqoJrNABlB8BWE7q6KG6rOYRbCkevE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 176703414354046.496220035764395; Mon, 29 Dec 2025 10:49:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vaIIS-0003ta-Sk; Mon, 29 Dec 2025 13:48:48 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vaIH7-0003eT-Tc for qemu-devel@nongnu.org; Mon, 29 Dec 2025 13:47:28 -0500 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vaIH5-0008CO-Eo for qemu-devel@nongnu.org; Mon, 29 Dec 2025 13:47:25 -0500 Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BTA2gWY3289552 for ; Mon, 29 Dec 2025 18:47:20 GMT Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ba4tnwbq5-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 29 Dec 2025 18:47:20 +0000 (GMT) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2a0d43fcb2fso312893595ad.3 for ; Mon, 29 Dec 2025 10:47:19 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([187.101.184.177]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a2f3c82aa8sm282198705ad.31.2025.12.29.10.47.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Dec 2025 10:47:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=M6VOV1+WA0N FLt3+OOv0t50IdwgHUgxMFm+1IFeKges=; b=kN5feR1A6XGNY+3wk1wsjvS+eD5 7dS8cqX+fltJNMks2f5pTyEYfynKwGhz8D4fMAwmnMaFLO1fVWMr8QkhIWKqdNbb qM/rvt+Yhxo+nNMvWYBdBMec6jviXS9Xg+fTf7/0ARCszuNA8Y3qIxnTNW3SDg1g 7ABXb3VwWP+XJYwvDVjNgT9anddbG5vL5oI2lXIE7IXabeVWwrGq21VP6waeptyd XuKqGqewrkqa2ONuStQzNKMMiWfdG0UBm0iPKlxkII8iFAh+TohvFG+lQa8HJnPH oY02gzx/uGZWcU0dRYVXcCCyph59nKerRkKXwJLCxFlDN2+Xr5mhJ8p9DlQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767034039; x=1767638839; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=M6VOV1+WA0NFLt3+OOv0t50IdwgHUgxMFm+1IFeKges=; b=gDnqhUR6OO6nXGl+UsUvLh7xjVqYod/if1qxteIsr6KPZb7xqIyPZEaLRmRNhVmLnd 5oJiWVt2gAYP9838i/T0RBVu+eZYKa3JUs64BZP7vuOOiyg6A82yA4wYftevFMYk4oH0 BJfBbxhrNXvTIXc4QRLGGX+tP05BmW1SGkKHoYszFMhixV07aH3Kottj7r0pMUHlvjNM hJxqCA39MFPYeylSkpknU4EheuxCISLIeVKyJeppRGqTEH2bb474TEnQZNG9CegWzcrH is2dcOa5I0/gt2RIKahvFLRX5ciH3ftnvXO5Nx6gQfptsz3CnJOGYSnjdsg0cmLUwYbo bEig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767034039; x=1767638839; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=M6VOV1+WA0NFLt3+OOv0t50IdwgHUgxMFm+1IFeKges=; b=mPvQxxEpjTSGBudrOyhsQh2gvc1cfePIboFF6sgZLzuNRinhrqYzbUOxjUzH1USnlc 4Rf9+H3GySups8isXmA11mb4qgnte4GpPrK7a7ZBjt5ULs8SVZ0RBSqMzAZZqdzvRz7R znhRWZD7nHjDO/5m/rql06Yof9CLBxl9GeJF56U/IV8eXONOyo81GJE0hHOr5rFTzqgI oq5glYHZ87Pq84OhUERo5ZQGzlYFaGN0aoDN4A44dUi3xozbpMGSK6EycV/kcudctI2g nJ1HHiH4rYjLm06HQ8ZmjtCKVTq2CRMrxTFTGu82y9iswFev3C+VHL7HZB5juNudJEw7 NFgA== X-Gm-Message-State: AOJu0YwQPp4QYLaP6HopD54E8qURz70frGsMnGOAO5XsSQx5hD7jIOen 2KnPntqOZ5arsRoyPdJLTcEwFheHQd0mYSPGKrBMcYL4kohMi7eRkySZ4x2d2jLh6KY7DzSHcRm 7CnxdUtYV1x/fRUzyIMrmgI4TPsV68L43cf08ummind5tsQvh2w5pMyVjZkX2OMlmYQ== X-Gm-Gg: AY/fxX5ePYQpe5KL6UhZkSybKMGfShvGMGH7QXiEnjcyvVNpCyB2xqXRdjAATNYmm8V 9RC5HpzaYyJTzkxWo6J3mEw8kKROIL02kTlxNsimdqLqQGfosPaGePdlN55konftCGWHep8j9tQ UG7/j9T6h2Trx3gFueRYIdCPgvvjT3bltwntLfnLWoXl5rEsL4nM8VaJKUiQemcLIpWpL/3PO6C bPagON8cyEsOwatWrK+xIdTHqKKMAscvnhei0s0iCqlqrvO/lhD+MB3HByY5O3ysNxyMFRI2WHb 3RKlzx/TrKApE5Y2ZO42ReqyH0yWYZOWeh0mpgkpWIVvb+q7PGDCxSoX7J/qz4kIOc84HS/7LLz oFAvS9ertjm8GjGCWN9E1Jy4pyLJyl4NqLLiKlNPiESQdRrQ= X-Received: by 2002:a17:902:e5d1:b0:264:70da:7a3b with SMTP id d9443c01a7336-2a2f293d10bmr348023325ad.49.1767034038520; Mon, 29 Dec 2025 10:47:18 -0800 (PST) X-Google-Smtp-Source: AGHT+IGRSWvnJiC8SxdKqVSBSbWIT1QcuLPj0pPz9N/8jzC/oTVvXdzkglN3CX/9g8gJPqSfBjo4hg== X-Received: by 2002:a17:902:e5d1:b0:264:70da:7a3b with SMTP id d9443c01a7336-2a2f293d10bmr348023015ad.49.1767034037950; Mon, 29 Dec 2025 10:47:17 -0800 (PST) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, liwei1518@gmail.com, zhiwei_liu@linux.alibaba.com, palmer@dabbelt.com, Daniel Henrique Barboza Subject: [PATCH v3 01/17] hw/riscv: Trace Encoder initial impl Date: Mon, 29 Dec 2025 15:46:40 -0300 Message-ID: <20251229184656.2224369-2-daniel.barboza@oss.qualcomm.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251229184656.2224369-1-daniel.barboza@oss.qualcomm.com> References: <20251229184656.2224369-1-daniel.barboza@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=G+YR0tk5 c=1 sm=1 tr=0 ts=6952ccb8 cx=c_pps a=JL+w9abYAAE89/QcEU+0QA==:117 a=cW5wcbexNO3A0Ml9TiDm9w==:17 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=NEAV23lmAAAA:8 a=EUspDBNiAAAA:8 a=G-s4_XRuKYtQtBmkiawA:9 a=324X-CrmTo6CU4MGRt3R:22 X-Proofpoint-GUID: e2vHro2mX607mEV-Tp6VOHNVOvCJamKC X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI5MDE3MiBTYWx0ZWRfXzC+g0TdIQtrZ Uvk220NzkQxwY7lzwoqlAYI8IQEZsCIQVEISwKpVVuWNH6c+4mb12KRxyBN3E6s3Bg9jIIWo5I2 KBvVRulHy8kr0uSxD0LZNCbSW+9809Kw00ufBTclLoWgbofZQ11395NkOWhCOEuOtOg7NXNKxA0 /BCM3lkhUTfnfTJ92tSy8ujm7cwA3WBWFTdNMiJYv91m+3bOtkiDon05pZXDIVNNXxjRMzpbbG/ PSIKUX4gnPi6obCzvQNixduZDGUiyHJhOZHGSpOXgtpiunhwP07wUXrPo64XeCtrYGA1BfPMVSL pvUCObpEGv6IVm5l0TwWaHq+djy1EMTLj8LH4jiqSU+kqDamEJECK1y5QgVWGFbxPrByKRi7MLJ 2ZiORHugYSujl+MyxTSvg0UfGd/d/mxTuRguEagVHadrT14hwD9mZ863I1MY9EK7UE7moQGs15z cGDdfrhE3A8+wUARIgw== X-Proofpoint-ORIG-GUID: e2vHro2mX607mEV-Tp6VOHNVOvCJamKC X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-29_06,2025-12-29_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 bulkscore=0 adultscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512290172 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=daniel.barboza@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1767034146252158500 Content-Type: text/plain; charset="utf-8" The Trace Encoder is a hardware module that interacts with a CPU, gathering execution information (a.k.a instruction delta trace), and send it downstream to other storage components such as a RAM Sink (a RAM storage). This trace info can then be read via software (e.g. perf) to reproduce the behavior of a given binary that ran in the CPU. This implementation is based on the Efficient Trace for RISC-V [1] and RISC-V Trace Control Interface Specification [2]. It's not intended to implement all spec features: the idea is to provide a base where we can add extra features on demand. We'll get back to the instruction delta trace and how we'll instrument TCG to produce it later. For now we'll set the minimal components to get the basic framework running. This Trace Encoder impl has just the minimal bits specified in [2], section "Minimal Implementation". RO and RSVP bits are taken verbatim from [2] without considering what we're actually going to support. The base impl is heavily inspired by the XLNZ-ZDMA device w.r.t the usage of the RegisterInfo and register.h framework. Discovery of the Trace Encoder will be made via fdt, a single entry per CPU. We'll connect each Trace Encoder to its CPU in the 'virt' board later. [1] https://github.com/riscv-non-isa/riscv-trace-spec/releases/download/v2.= 0-20250616/riscv-trace-spec-asciidoc.pdf [2] https://github.com/riscv-non-isa/tg-nexus-trace/releases/download/1.0_R= atified/RISC-V-Trace-Control-Interface.pdf Signed-off-by: Daniel Henrique Barboza --- hw/riscv/Kconfig | 5 + hw/riscv/meson.build | 1 + hw/riscv/trace-encoder.c | 216 +++++++++++++++++++++++++++++++++++++++ hw/riscv/trace-encoder.h | 42 ++++++++ hw/riscv/trace-events | 4 + 5 files changed, 268 insertions(+) create mode 100644 hw/riscv/trace-encoder.c create mode 100644 hw/riscv/trace-encoder.h diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index fc9c35bd98..2de0892496 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -7,6 +7,10 @@ config RISCV_NUMA config IBEX bool =20 +config RISCV_TRACE + bool + select REGISTER + # RISC-V machines in alphabetical order =20 config MICROCHIP_PFSOC @@ -68,6 +72,7 @@ config RISCV_VIRT select PLATFORM_BUS select ACPI select ACPI_PCI + select RISCV_TRACE =20 config SHAKTI_C bool diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index 2a8d5b136c..b4a9988a62 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -14,5 +14,6 @@ riscv_ss.add(when: 'CONFIG_RISCV_IOMMU', if_true: files( 'riscv-iommu.c', 'riscv-iommu-pci.c', 'riscv-iommu-sys.c', 'riscv-iommu-h= pm.c')) riscv_ss.add(when: 'CONFIG_MICROBLAZE_V', if_true: files('microblaze-v-gen= eric.c')) riscv_ss.add(when: 'CONFIG_XIANGSHAN_KUNMINGHU', if_true: files('xiangshan= _kmh.c')) +riscv_ss.add(when: 'CONFIG_RISCV_TRACE', if_true: files('trace-encoder.c')) =20 hw_arch +=3D {'riscv': riscv_ss} diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c new file mode 100644 index 0000000000..6df8ba8e84 --- /dev/null +++ b/hw/riscv/trace-encoder.c @@ -0,0 +1,216 @@ +/* + * Emulation of a RISC-V Trace Encoder + * + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" + +#include "trace-encoder.h" +#include "hw/irq.h" +#include "hw/qdev-properties.h" +#include "migration/vmstate.h" +#include "qemu/bitops.h" +#include "qemu/log.h" +#include "qemu/module.h" +#include "qapi/error.h" +#include "trace.h" +#include "system/device_tree.h" +#include "hw/register.h" +#include "cpu.h" + +/* + * trTeControl register fields + */ +REG32(TR_TE_CONTROL, 0x0) + FIELD(TR_TE_CONTROL, ACTIVE, 0, 1) + FIELD(TR_TE_CONTROL, ENABLE, 1, 1) + FIELD(TR_TE_CONTROL, INST_TRACING, 2, 1) + FIELD(TR_TE_CONTROL, EMPTY, 3, 1) + FIELD(TR_TE_CONTROL, INST_MODE, 4, 3) + FIELD(TR_TE_CONTROL, INST_SYNC_MODE, 16, 2) + FIELD(TR_TE_CONTROL, FORMAT, 24, 3) + /* reserved bits */ + FIELD(TR_TE_CONTROL, RSVP1, 7, 2) + FIELD(TR_TE_CONTROL, RSVP2, 10, 1) + FIELD(TR_TE_CONTROL, RSVP3, 14, 1) + FIELD(TR_TE_CONTROL, RSVP4, 18, 2) + FIELD(TR_TE_CONTROL, RSVP5, 27, 5) + +#define R_TR_TE_CONTROL_RSVP_BITS (MAKE_64BIT_MASK(32, 32) | \ + R_TR_TE_CONTROL_RSVP1_MASK | \ + R_TR_TE_CONTROL_RSVP2_MASK | \ + R_TR_TE_CONTROL_RSVP3_MASK | \ + R_TR_TE_CONTROL_RSVP4_MASK | \ + R_TR_TE_CONTROL_RSVP5_MASK) + +/* trTeControlEmpty is the only RO field and reset value */ +#define R_TR_TE_CONTROL_RESET R_TR_TE_CONTROL_EMPTY_MASK +#define R_TR_TE_CONTROL_RO_BITS R_TR_TE_CONTROL_EMPTY_MASK + +/* + * trTeImpl register fields + */ +REG32(TR_TE_IMPL, 0x4) + FIELD(TR_TE_IMPL, VER_MAJOR, 0, 4) + FIELD(TR_TE_IMPL, VER_MINOR, 4, 4) + FIELD(TR_TE_IMPL, COMP_TYPE, 8, 4) + FIELD(TR_TE_IMPL, PROTOCOL_MAJOR, 16, 4) + FIELD(TR_TE_IMPL, PROTOCOL_MINOR, 20, 4) + /* reserved bits */ + FIELD(TR_TE_IMPL, RSVP1, 12, 4) + FIELD(TR_TE_IMPL, RSVP2, 24, 8) + +#define R_TR_TE_IMPL_RSVP_BITS (MAKE_64BIT_MASK(32, 32) | \ + R_TR_TE_IMPL_RSVP1_MASK | \ + R_TR_TE_IMPL_RSVP2_MASK) + +#define R_TR_TE_IMPL_RO_BITS (R_TR_TE_IMPL_VER_MAJOR_MASK | \ + R_TR_TE_IMPL_VER_MINOR_MASK | \ + R_TR_TE_IMPL_COMP_TYPE_MASK | \ + R_TR_TE_IMPL_PROTOCOL_MAJOR_MASK | \ + R_TR_TE_IMPL_PROTOCOL_MINOR_MASK) + +#define R_TR_TE_IMPL_RESET (BIT(0) | BIT(8)) + +static RegisterAccessInfo trencoder_regs_info[] =3D { + { .name =3D "TR_TE_CONTROL", .addr =3D A_TR_TE_CONTROL, + .rsvd =3D R_TR_TE_CONTROL_RSVP_BITS, + .reset =3D R_TR_TE_CONTROL_RESET, + .ro =3D R_TR_TE_CONTROL_RO_BITS, + }, + { .name =3D "TR_TE_IMPL", .addr =3D A_TR_TE_IMPL, + .rsvd =3D R_TR_TE_IMPL_RSVP_BITS, + .reset =3D R_TR_TE_IMPL_RESET, + .ro =3D R_TR_TE_IMPL_RO_BITS, + }, +}; + +static uint64_t trencoder_read(void *opaque, hwaddr addr, unsigned size) +{ + TraceEncoder *te =3D TRACE_ENCODER(opaque); + RegisterInfo *r =3D &te->regs_info[addr / 4]; + + if (!r->data) { + trace_trencoder_read_error(addr); + return 0; + } + + return register_read(r, ~0, NULL, false); +} + +static void trencoder_write(void *opaque, hwaddr addr, + uint64_t value, unsigned size) +{ + TraceEncoder *te =3D TRACE_ENCODER(opaque); + RegisterInfo *r =3D &te->regs_info[addr / 4]; + + if (!r->data) { + trace_trencoder_write_error(addr, value); + return; + } + + register_write(r, value, ~0, NULL, false); +} + +static const MemoryRegionOps trencoder_ops =3D { + .read =3D trencoder_read, + .write =3D trencoder_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, +}; + +static void trencoder_reset(DeviceState *dev) +{ + TraceEncoder *te =3D TRACE_ENCODER(dev); + + for (int i =3D 0; i < ARRAY_SIZE(te->regs_info); i++) { + register_reset(&te->regs_info[i]); + } +} + +static void trencoder_realize(DeviceState *dev, Error **errp) +{ + TraceEncoder *te =3D TRACE_ENCODER(dev); + + memory_region_init_io(&te->reg_mem, OBJECT(dev), + &trencoder_ops, te, + TYPE_TRACE_ENCODER, + te->reg_mem_size); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &te->reg_mem); + sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, te->baseaddr); + + /* RegisterInfo init taken from hw/dma/xlnx-zdma.c */ + for (int i =3D 0; i < ARRAY_SIZE(trencoder_regs_info); i++) { + uint32_t reg_idx =3D trencoder_regs_info[i].addr / 4; + RegisterInfo *r =3D &te->regs_info[reg_idx]; + + *r =3D (RegisterInfo) { + .data =3D (uint8_t *)&te->regs[reg_idx], + .data_size =3D sizeof(uint32_t), + .access =3D &trencoder_regs_info[i], + .opaque =3D te, + }; + } +} + +static const Property trencoder_props[] =3D { + /* + * We need a link to the associated CPU to + * enable/disable tracing. + */ + DEFINE_PROP_LINK("cpu", TraceEncoder, cpu, TYPE_RISCV_CPU, RISCVCPU *), + DEFINE_PROP_UINT64("baseaddr", TraceEncoder, baseaddr, 0), + DEFINE_PROP_UINT64("dest-baseaddr", TraceEncoder, dest_baseaddr, 0), + DEFINE_PROP_UINT64("ramsink-ramstart", TraceEncoder, + ramsink_ramstart, 0), + DEFINE_PROP_UINT64("ramsink-ramlimit", TraceEncoder, + ramsink_ramlimit, 0), + DEFINE_PROP_UINT32("reg-mem-size", TraceEncoder, + reg_mem_size, TRACE_R_MAX * 4), + DEFINE_PROP_INT32("cpu-id", TraceEncoder, cpu_id, 0), +}; + +static const VMStateDescription vmstate_trencoder =3D { + .name =3D TYPE_TRACE_ENCODER, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32_ARRAY(regs, TraceEncoder, TRACE_R_MAX), + VMSTATE_UINT64(baseaddr, TraceEncoder), + VMSTATE_UINT64(dest_baseaddr, TraceEncoder), + VMSTATE_UINT64(ramsink_ramstart, TraceEncoder), + VMSTATE_UINT64(ramsink_ramlimit, TraceEncoder), + VMSTATE_INT32(cpu_id, TraceEncoder), + VMSTATE_END_OF_LIST(), + } +}; + +static void trencoder_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + device_class_set_legacy_reset(dc, trencoder_reset); + device_class_set_props(dc, trencoder_props); + dc->realize =3D trencoder_realize; + dc->vmsd =3D &vmstate_trencoder; +} + +static const TypeInfo trencoder_info =3D { + .name =3D TYPE_TRACE_ENCODER, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(TraceEncoder), + .class_init =3D trencoder_class_init, +}; + +static void trencoder_register_types(void) +{ + type_register_static(&trencoder_info); +} + +type_init(trencoder_register_types) diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h new file mode 100644 index 0000000000..8f2b9ceb04 --- /dev/null +++ b/hw/riscv/trace-encoder.h @@ -0,0 +1,42 @@ +/* + * Emulation of a RISC-V Trace Encoder + * + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef RISCV_TRACE_ENCODER_H +#define RISCV_TRACE_ENCODER_H + +#include "hw/sysbus.h" +#include "hw/register.h" +#include "system/dma.h" +#include "qom/object.h" +#include "cpu.h" + +#define TRACE_R_MAX (0xFFF / 4) + +struct TraceEncoder { + /*< private >*/ + SysBusDevice parent_obj; + + RISCVCPU *cpu; + int cpu_id; + + MemoryRegion reg_mem; + uint32_t reg_mem_size; + + hwaddr baseaddr; + hwaddr dest_baseaddr; + hwaddr ramsink_ramstart; + hwaddr ramsink_ramlimit; + uint32_t regs[TRACE_R_MAX]; + RegisterInfo regs_info[TRACE_R_MAX]; +}; + +#define TYPE_TRACE_ENCODER "trace-encoder" + +OBJECT_DECLARE_SIMPLE_TYPE(TraceEncoder, TRACE_ENCODER) + +#endif diff --git a/hw/riscv/trace-events b/hw/riscv/trace-events index b50b14a654..0cbf6ffcb6 100644 --- a/hw/riscv/trace-events +++ b/hw/riscv/trace-events @@ -24,3 +24,7 @@ riscv_iommu_hpm_incr_ctr(uint64_t cntr_val) "cntr_val 0x%= "PRIx64 riscv_iommu_hpm_iocntinh_cy(bool prev_cy_inh) "prev_cy_inh %d" riscv_iommu_hpm_cycle_write(uint32_t ovf, uint64_t val) "ovf 0x%x val 0x%"= PRIx64 riscv_iommu_hpm_evt_write(uint32_t ctr_idx, uint32_t ovf, uint64_t val) "c= tr_idx 0x%x ovf 0x%x val 0x%"PRIx64 + +# trace-encoder.c +trencoder_read_error(uint64_t addr) "addr 0x%" PRIx64 +trencoder_write_error(uint64_t addr, uint64_t value) "addr 0x%" PRIx64 " v= alue 0x%" PRIx64 --=20 2.51.1