From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861822; cv=none; d=zohomail.com; s=zohoarc; b=QjMwnjhHgYYitmQqo99vggOmB5Rddhcz3AWSnsseLHninL6fnJcEULSnsk8+fPzKRHtPrE58Kxm7VrWibT+Fq+mpi4YzQWpqqamS5p+5/AeEkQddT9IBuptcSffV2k3VzyrVLdEXBL2Ry24E1Sh6cq6qK7hsly7sBER082qji+0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861822; 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=+h/wrFXrgdh3yfXTJ2th26fdXN3XUAkCGxZ+AoI8dZY=; b=MVXCn1X42Vv5pytpoLCDPQKdT8h4EyVv66CPgPa8Y/9xlAVDMt0IrGOJMYGrK/H0kkdri75eZ1EgldPYGSI98jyW/R3lfpYSwOTY+DKFoiAUfMero7xCvTFrUGPYhMkQ3mrvhASuAJ1W73DDUhVIYpuXP5OdVWcpjpu3pqWZzU8= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861822765790.8153747330314; Tue, 11 Nov 2025 03:50:22 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrI-0006cN-2W; Tue, 11 Nov 2025 06:48:24 -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 1vImqI-0004eK-AY for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:22 -0500 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImqD-0004Nd-Uw for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:21 -0500 Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-2964d616df7so52845245ad.3 for ; Tue, 11 Nov 2025 03:47:16 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.47.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:47:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861635; x=1763466435; 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=+h/wrFXrgdh3yfXTJ2th26fdXN3XUAkCGxZ+AoI8dZY=; b=U3dA+B8R/3Czm1XspImNm7cjB5qbMALlBA4NbVi0WnKQ5nM+daEsbbtJ5MZ+Fo91+u 2VOmdanD8biGk/+GP6A73hDbQZlqyLV9c1GpAYCLR7tbUnkCK/4I3L5W7txawNYxeedV KjNDy20ySACAXYwA3/Vr2AU92cg3cNglagnvMit1O2YH8VD9UPLj/gf3rGeqquonsil4 HBYHz/rFilA4cNhk7R2OFmGjs9koREt19KH1Y7rum55gSHriP5JDuvcPkSdaZj9mHklI UQGK4RPfwd0FSeMowr2Ja1J4pyqwGaQl+xxV4zUEza1qqEE2PY0c/jTmBBT4LZy7T+Qc i1tA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861635; x=1763466435; 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=+h/wrFXrgdh3yfXTJ2th26fdXN3XUAkCGxZ+AoI8dZY=; b=JHJ7D/1CdVL+ETdnNbsu4KYCXKf9LTnMdWjcxg7oaQZMGYEJWyN4Docc1rSphfzgE5 F1d9LoeoYBcth7weqeCEkf17n20gtPsSdTCYRZfridPD9D/oerfFbg8pGoqy+WaDsink 3GYfiGJNBC59ssnv1rLln9kaSS3RlMh6KWcoRtivdguOot90b8WD4qsXvUnpWSg2teRa j+zXA4S6KsoGqvDh5lyRdpbSrlK1LY4QWS6hImJf4dSsBHdSHC8Lo/Kqm8ORlIhZk2Li QTphQrpEgDsU/xe9UzWvE06dwN1GNKHeD4nzjUe+O/aooa9sjy0sOagcXDNUCkmkT60p 4f7Q== X-Gm-Message-State: AOJu0Yx58v059Crj2BmM6N95wHiE/rhAAmngoQ8E99vVASXToVQhGuYX HCZ96hmNmfcPL7zy7QTiOIRDjcJVk+6Lwt7SPK+OdGAS1IIYe1FyrYqMPQsiWKS9q3Bwi2f3uNB uFH7e9QQ= X-Gm-Gg: ASbGncu+osi6DAp9mEo+Xi120cl6eNYXUO0rxDfPZFRKkxh0lzz4Ed/SkaMx6nrwSnU qHRn2iunZ/Tg4IXcBaCcCPFqvni/EALfbGgjz24Gc23ulKsIEU8ZnBhe0YmNi68vts2SSaZf7/p 6yFj2PWT84qFxrAwuXOFcItBXJUx30oVzlReG4oAz7VxOzBz9TXiwsPoGhQO30Uf18E80lVsOLX bTTlbOwWFXFvCya76eGuJ1wSmaZ7bxt0R9h08N1BfTE4BUOHdpO0fJcKtVFVRm5SoBgGiG9Xv+e CeoZdYpKycSSAozMbjqMdqXw9XtOuba8xUl0FHxkgBibb7wH4Qfs/CLVb4IuST7saiISmSLAj2b fYydRH3JKfcE5E1+v5RuVBeGTN0EaQjICz8CG/zlUu/hwKMX1A+diptCxvaIRqrHKbxjpXa5gFn UkEwJUfpvg3kX0zyg5Y0l9FNadWuL/3MAG/HBeK3Iz5P8OGLn7 X-Google-Smtp-Source: AGHT+IF2es4gnZHnRMgmkYOgOa0e8ZikM2omPy5yzdBaUaGHP3rrc54D2ZYlbwk70RkEIwt2mbrZxQ== X-Received: by 2002:a17:902:f791:b0:295:30d4:23c2 with SMTP id d9443c01a7336-297e571247cmr151032365ad.50.1762861635220; Tue, 11 Nov 2025 03:47:15 -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 v2 01/17] hw/riscv: Trace Encoder initial impl Date: Tue, 11 Nov 2025 08:46:40 -0300 Message-ID: <20251111114656.2285048-2-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::62a; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x62a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861823327158500 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..21bf650a6a --- /dev/null +++ b/hw/riscv/trace-encoder.c @@ -0,0 +1,216 @@ +/* + * Emulation of a RISC-V Trace Encoder + * + * Copyright (C) 2025 Ventana Micro Systems Inc. + * + * 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, 4) + +#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..71002f58a4 --- /dev/null +++ b/hw/riscv/trace-encoder.h @@ -0,0 +1,42 @@ +/* + * Emulation of a RISC-V Trace Encoder + * + * Copyright (C) 2025 Ventana Micro Systems Inc. + * + * 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 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861732; cv=none; d=zohomail.com; s=zohoarc; b=S/JkKc+3uMCSnTHLA5H+CmsuCQxDBGJ8l/TXl6N4kWhKByv6VZP+bTs5GkgWU93Q0okxOVcGGMXHjwyiD+8BayAEZBfyOlQlVXptT5w6Xvy1tyRdKG1Se1d84gUitDR/j992A5zgC1IrDrlchwjYP340NI/sUWXwFYTH32QEKLI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861732; 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=OnNgxDvECjfofIwXpwzJzkhqPD4xUi0O1E23cP4lx4s=; b=RWiz4P8ViFT3JJI1P/2lwisE4rtbLggMR7gHA7eSwgCbf0FPQ2KXF678Y4akmd4VoaQ2Tvki7Xas8kmxcrI7gLYUtVnSIXxlTd+pHlr8Zwni1KKND8JVC1ZTMgF7ssKsHLlCFns2sy9nCzTmWz+7UPBetyfwNvn7YH1h3RMCl9Q= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861732183329.64635396463734; Tue, 11 Nov 2025 03:48:52 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrI-0006gW-TI; Tue, 11 Nov 2025 06:48:25 -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 1vImqL-0004jn-VK for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:26 -0500 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImqJ-0004OZ-IL for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:25 -0500 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-29808a9a96aso23117085ad.1 for ; Tue, 11 Nov 2025 03:47:23 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.47.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:47:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861641; x=1763466441; 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=OnNgxDvECjfofIwXpwzJzkhqPD4xUi0O1E23cP4lx4s=; b=hBkxuIP4H4jPIytE6XWUzUGzdRbyJNnFSAksFcAe/RNlyIU4G0e2qbfbBAcq2jHErU 1G9iz2eyZrh0+PunzXzIiehTYSVdoKD/e7ml5RSSAzcH+wLqQZZYV/NZLRNYkMKGc3XU nqSczV7BT+GcYlZmOjGXtYDIByi6uab2PRYqVhL4vkJai7C0gMHNyY698WXFT10kGGIB EyBXUk4wvunNuQj7uRgw0PoWhdOM4hnOgyNdXLyHfVINIjIyKTNYp0bwUC0WX3J2vL2L pRUQczoxVCJh8wjmhzu8iOpx50JsL3uZ06r5ItwZJsEHO1Vg7MgKkIH8bAXjJV18gtU+ mnTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861641; x=1763466441; 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=OnNgxDvECjfofIwXpwzJzkhqPD4xUi0O1E23cP4lx4s=; b=b0IzV8zr8XqOKdQCxOkYezvWwwQ5RWP/44BleVDe/ztnX8Y3mszozzav+QEWV0gwFi iNNS32dIyIEq/v1j1nNK4WSLKXoqpTcxbXTQluDPCGdeVEYghipO4eO6ZXyFiMe9s4Iz 1uyTWkrPtkAUIgO2A3C/VJoAgLzngyZWPALXmt9JqjZ2Vl05BZ1lnyg0Btbw73EdQMn9 Py3tsHSqr0PO0s3WxWYKXoE7ENaeGB2wdOLBORimH6VDvCwCYoPZOdJtIAw6QXeJuJ7o bfMEblpy6DHXuxl6kJ6ZW4WpOXPrjV/gE6IbmUHwqFu88aUvmmWP8zdXi5Kl+E+CFvTG 8vSQ== X-Gm-Message-State: AOJu0Yxxo9aaraAGlJY1CYZmTRotT9/yv0MrZJReP6ruCRHCCjVHmUDp ofVGk4SACh1arqeLbSnJ6BdfpGS8QpBda+nbMsnlUfp6zlbzgkfelhzMMC3mC7P5A21kmTIOZ7G ZGsqFERo= X-Gm-Gg: ASbGncsKghfXJG/9Aq+bUhcQC1Bjoer6gj969aaIjDZvA+LyhxkkIp21JxDyh2IV5vP naIE/2as5h7YO4dCbrc7uByb6kgnVRi/zDl4+yYyZd/bz4G5lyVgSA5HfvaHAEEcMGyM0A7fcKr GLsWYwb3aplB56adXcg0dDmqnb+t57jFWtdhyNPPwHgi50pku5wuHhsM8QjFBOrUNGlkNsbpgRU B68r7gzHVjR60OiM4C5LevuVF2ysD7wNDFuOh11UWHECNUDYRgThoX1+Kr3gLh+WiqAHbAGhzQs GVo2KyeFjLFs04hJ9+DSLxrKrBslFnn92+Fbi30C3xh8dCbP6USytvF3h+qit0TzbJgHDFl2ylR 8eVu9gLTqOhWpHnGo5mnZL1IcmDPKzeLqe0O9dGu3bCub0R8B6u3TAa9I/45HvAW7jlnV/t89BP 0mZXB/iH6xdDpXfgvHEvwKswQ1n8w= X-Google-Smtp-Source: AGHT+IHVuK/yIbMSqMmgxWCK07cYDcrrA7apki/JNfMucSN5RSsb6RoYrXE4uwvfJiblkhmsa+g/kA== X-Received: by 2002:a17:903:244a:b0:295:59ef:809e with SMTP id d9443c01a7336-297e564e380mr154915745ad.24.1762861641429; Tue, 11 Nov 2025 03:47:21 -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 v2 02/17] hw/riscv: Trace RAM Sink initial impl Date: Tue, 11 Nov 2025 08:46:41 -0300 Message-ID: <20251111114656.2285048-3-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::633; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x633.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861734065153000 Content-Type: text/plain; charset="utf-8" Following the effort to implement the basic support for Efficient Trace (e-trace) in QEMU we'll add a Trace RAM Sink implementation. Similar to the Trace Encoder, this is inspired in both the Efficient Trace for RISC-V [1] and RISC-V Trace Control Interface Specification [2] specs. It implements a minimal set of features to get started - only SMEM will be supported for now. We'll implement the RAM sink logic in the next patches, although most of the work will be done by the trace encoder. [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/meson.build | 2 +- hw/riscv/trace-events | 4 + hw/riscv/trace-ram-sink.c | 263 ++++++++++++++++++++++++++++++++++++++ hw/riscv/trace-ram-sink.h | 83 ++++++++++++ 4 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 hw/riscv/trace-ram-sink.c create mode 100644 hw/riscv/trace-ram-sink.h diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index b4a9988a62..2aadbe1e50 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -14,6 +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')) +riscv_ss.add(when: 'CONFIG_RISCV_TRACE', if_true: files('trace-encoder.c',= 'trace-ram-sink.c')) =20 hw_arch +=3D {'riscv': riscv_ss} diff --git a/hw/riscv/trace-events b/hw/riscv/trace-events index 0cbf6ffcb6..14e333fd9e 100644 --- a/hw/riscv/trace-events +++ b/hw/riscv/trace-events @@ -28,3 +28,7 @@ riscv_iommu_hpm_evt_write(uint32_t ctr_idx, uint32_t ovf,= uint64_t val) "ctr_idx # 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 + +# trace-ram-sink.c +tr_ramsink_read_error(uint64_t addr) "addr 0x%" PRIx64 +tr_ramsink_write_error(uint64_t addr, uint64_t value) "addr 0x%" PRIx64 " = value 0x%" PRIx64 diff --git a/hw/riscv/trace-ram-sink.c b/hw/riscv/trace-ram-sink.c new file mode 100644 index 0000000000..e00de80c04 --- /dev/null +++ b/hw/riscv/trace-ram-sink.c @@ -0,0 +1,263 @@ +/* + * Emulation of a RISC-V Trace RAM Sink + * + * Copyright (C) 2025 Ventana Micro Systems Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" + +#include "trace-ram-sink.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/sysbus.h" +#include "hw/register.h" + +#define R_TR_RAM_CONTROL_RSVP_BITS (MAKE_64BIT_MASK(32, 32) | \ + R_TR_RAM_CONTROL_RSVP1_MASK | \ + R_TR_RAM_CONTROL_RSVP2_MASK | \ + R_TR_RAM_CONTROL_RSVP3_MASK | \ + R_TR_RAM_CONTROL_RSVP4_MASK) + +/* trRamEmpty is the only RO field and reset value */ +#define R_TR_RAM_CONTROL_RESET R_TR_RAM_CONTROL_EMPTY_MASK +#define R_TR_RAM_CONTROL_RO_BITS R_TR_RAM_CONTROL_EMPTY_MASK + +#define R_TR_RAM_IMPL_RSVP_BITS (MAKE_64BIT_MASK(32, 32) | \ + R_TR_RAM_IMPL_RSVP1_MASK) + +#define R_TR_RAM_IMPL_RO_BITS (R_TR_RAM_IMPL_VER_MAJOR_MASK | \ + R_TR_RAM_IMPL_VER_MINOR_MASK | \ + R_TR_RAM_IMPL_COMP_TYPE_MASK | \ + R_TR_RAM_IMPL_HAS_SRAM_MASK | \ + R_TR_RAM_IMPL_HAS_SMEM_MASK) + +#define R_TR_RAM_IMPL_RESET (BIT(0) | 0x9 << 8) + +static RegisterAccessInfo tr_ramsink_regs_info[] =3D { + { .name =3D "TR_RAM_CONTROL", .addr =3D A_TR_RAM_CONTROL, + .rsvd =3D R_TR_RAM_CONTROL_RSVP_BITS, + .reset =3D R_TR_RAM_CONTROL_RESET, + .ro =3D R_TR_RAM_CONTROL_RO_BITS, + }, + { .name =3D "TR_RAM_IMPL", .addr =3D A_TR_RAM_IMPL, + .rsvd =3D R_TR_RAM_IMPL_RSVP_BITS, + .reset =3D R_TR_RAM_IMPL_RESET, + .ro =3D R_TR_RAM_IMPL_RO_BITS, + }, + { .name =3D "TR_RAM_START_LOW", .addr =3D A_TR_RAM_START_LOW, + }, + { .name =3D "TR_RAM_START_HIGH", .addr =3D A_TR_RAM_START_HIGH, + }, + { .name =3D "TR_RAM_LIMIT_LOW", .addr =3D A_TR_RAM_LIMIT_LOW, + }, + { .name =3D "TR_RAM_LIMIT_HIGH", .addr =3D A_TR_RAM_LIMIT_HIGH, + }, + { .name =3D "TR_RAM_WP_LOW", .addr =3D A_TR_RAM_WP_LOW, + }, + { .name =3D "TR_RAM_WP_HIGH", .addr =3D A_TR_RAM_WP_HIGH, + }, +}; + +static uint64_t tr_ramsink_regread(void *opaque, hwaddr addr, unsigned siz= e) +{ + TraceRamSink *tram =3D TRACE_RAM_SINK(opaque); + RegisterInfo *r =3D &tram->regs_info[addr / 4]; + + if (!r->data) { + trace_tr_ramsink_read_error(addr); + return 0; + } + + return register_read(r, ~0, NULL, false); +} + +static void tr_ramsink_regwrite(void *opaque, hwaddr addr, + uint64_t value, unsigned size) +{ + TraceRamSink *tram =3D TRACE_RAM_SINK(opaque); + RegisterInfo *r =3D &tram->regs_info[addr / 4]; + + if (!r->data) { + trace_tr_ramsink_write_error(addr, value); + return; + } + + register_write(r, value, ~0, NULL, false); +} + +static const MemoryRegionOps tr_ramsink_regops =3D { + .read =3D tr_ramsink_regread, + .write =3D tr_ramsink_regwrite, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, +}; + +static uint64_t tr_ramsink_msgread(void *opaque, hwaddr addr, unsigned siz= e) +{ + TraceRamSink *tram =3D TRACE_RAM_SINK(opaque); + + switch (size) { + case 1: + return tram->msgs[addr]; + case 2: + return (uint16_t)tram->msgs[addr]; + case 4: + return (uint32_t)tram->msgs[addr]; + default: + g_assert_not_reached(); + } +} + +static void tr_ramsink_msgwrite(void *opaque, hwaddr addr, + uint64_t value, unsigned size) +{ + TraceRamSink *tram =3D TRACE_RAM_SINK(opaque); + + switch (size) { + case 1: + tram->msgs[addr] =3D value; + break; + case 2: + tram->msgs[addr] =3D extract16(value, 0, 8); + tram->msgs[addr + 1] =3D extract16(value, 8, 8); + break; + case 4: + tram->msgs[addr] =3D extract32(value, 0, 8); + tram->msgs[addr + 1] =3D extract32(value, 8, 8); + tram->msgs[addr + 2] =3D extract32(value, 16, 8); + tram->msgs[addr + 3] =3D extract32(value, 24, 8); + break; + default: + g_assert_not_reached(); + } +} + +static const MemoryRegionOps tr_ramsink_smemops =3D { + .read =3D tr_ramsink_msgread, + .write =3D tr_ramsink_msgwrite, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid =3D { + .min_access_size =3D 1, + .max_access_size =3D 4, + }, +}; + +static void tr_ramsink_setup_regs(TraceRamSink *tram) +{ + hwaddr ramlimit =3D tram->smemaddr + tram->smemsize; + + ARRAY_FIELD_DP32(tram->regs, TR_RAM_START_LOW, ADDR, + extract64(tram->smemaddr, 2, 30)); + ARRAY_FIELD_DP32(tram->regs, TR_RAM_START_HIGH, ADDR, + extract64(tram->smemaddr, 32, 32)); + + ARRAY_FIELD_DP32(tram->regs, TR_RAM_WP_LOW, ADDR, + extract64(tram->smemaddr, 2, 30)); + ARRAY_FIELD_DP32(tram->regs, TR_RAM_WP_HIGH, ADDR, + extract64(tram->smemaddr, 32, 32)); + + ARRAY_FIELD_DP32(tram->regs, TR_RAM_LIMIT_LOW, ADDR, + extract64(ramlimit, 2, 30)); + ARRAY_FIELD_DP32(tram->regs, TR_RAM_LIMIT_HIGH, ADDR, + extract64(ramlimit, 32, 32)); +} + +static void tr_ramsink_reset(DeviceState *dev) +{ + TraceRamSink *tram =3D TRACE_RAM_SINK(dev); + + for (int i =3D 0; i < ARRAY_SIZE(tram->regs_info); i++) { + register_reset(&tram->regs_info[i]); + } + + tr_ramsink_setup_regs(tram); +} + +static void tr_ramsink_realize(DeviceState *dev, Error **errp) +{ + TraceRamSink *tram =3D TRACE_RAM_SINK(dev); + + memory_region_init_io(&tram->reg_mem, OBJECT(dev), + &tr_ramsink_regops, tram, + "trace-ram-sink-regs", + tram->reg_mem_size); + sysbus_init_mmio(SYS_BUS_DEVICE(tram), &tram->reg_mem); + sysbus_mmio_map(SYS_BUS_DEVICE(tram), 0, tram->baseaddr); + + g_assert(tram->smemsize > 0); + tram->msgs =3D g_malloc0(tram->smemsize); + + memory_region_init_io(&tram->smem, OBJECT(dev), + &tr_ramsink_smemops, tram, + "trace-ram-sink-smem", + tram->smemsize); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &tram->smem); + sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, tram->smemaddr); + + /* RegisterInfo init taken from hw/dma/xlnx-zdma.c */ + for (int i =3D 0; i < ARRAY_SIZE(tr_ramsink_regs_info); i++) { + uint32_t reg_idx =3D tr_ramsink_regs_info[i].addr / 4; + RegisterInfo *r =3D &tram->regs_info[reg_idx]; + + *r =3D (RegisterInfo) { + .data =3D (uint8_t *)&tram->regs[reg_idx], + .data_size =3D sizeof(uint32_t), + .access =3D &tr_ramsink_regs_info[i], + .opaque =3D tram, + }; + } +} + +static const Property tr_ramsink_props[] =3D { + DEFINE_PROP_UINT64("baseaddr", TraceRamSink, baseaddr, 0), + DEFINE_PROP_UINT64("smemaddr", TraceRamSink, smemaddr, 0), + DEFINE_PROP_UINT32("smemsize", TraceRamSink, smemsize, 0), + DEFINE_PROP_UINT32("reg-mem-size", TraceRamSink, + reg_mem_size, TR_DEV_REGMAP_SIZE), +}; + +static const VMStateDescription vmstate_tr_ramsink =3D { + .name =3D TYPE_TRACE_RAM_SINK, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32_ARRAY(regs, TraceRamSink, TRACE_R_MAX), + VMSTATE_END_OF_LIST(), + } +}; + +static void tr_ramsink_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + device_class_set_legacy_reset(dc, tr_ramsink_reset); + device_class_set_props(dc, tr_ramsink_props); + dc->realize =3D tr_ramsink_realize; + dc->vmsd =3D &vmstate_tr_ramsink; +} + +static const TypeInfo tr_ramsink_info =3D { + .name =3D TYPE_TRACE_RAM_SINK, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(TraceRamSink), + .class_init =3D tr_ramsink_class_init, +}; + +static void tr_ramsink_register_types(void) +{ + type_register_static(&tr_ramsink_info); +} + +type_init(tr_ramsink_register_types) diff --git a/hw/riscv/trace-ram-sink.h b/hw/riscv/trace-ram-sink.h new file mode 100644 index 0000000000..cd55145669 --- /dev/null +++ b/hw/riscv/trace-ram-sink.h @@ -0,0 +1,83 @@ +/* + * Emulation of a RISC-V Trace RAM Sink + * + * Copyright (C) 2025 Ventana Micro Systems Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef RISCV_TRACE_RAM_SINK_H +#define RISCV_TRACE_RAM_SINK_H + +#include "hw/register.h" +#include "hw/sysbus.h" +#include "system/dma.h" +#include "qom/object.h" + +#define TRACE_R_MAX (0xFFF / 4) +#define TR_DEV_REGMAP_SIZE 0x1000 + +/* + * The Trace Encoder will read/write those regs so put their + * declaration in this header. + */ +REG32(TR_RAM_CONTROL, 0x0) + FIELD(TR_RAM_CONTROL, ACTIVE, 0, 1) + FIELD(TR_RAM_CONTROL, ENABLE, 1, 1) + FIELD(TR_RAM_CONTROL, EMPTY, 3, 1) + FIELD(TR_RAM_CONTROL, MODE, 4, 1) + FIELD(TR_RAM_CONTROL, STOP_ON_WRAP, 8, 1) + FIELD(TR_RAM_CONTROL, MEM_FORMAT, 9, 2) + /* reserved bits */ + FIELD(TR_RAM_CONTROL, RSVP1, 2, 1) + FIELD(TR_RAM_CONTROL, RSVP2, 5, 2) + FIELD(TR_RAM_CONTROL, RSVP3, 11, 1) + FIELD(TR_RAM_CONTROL, RSVP4, 15, 16) + +REG32(TR_RAM_IMPL, 0x4) + FIELD(TR_RAM_IMPL, VER_MAJOR, 0, 4) + FIELD(TR_RAM_IMPL, VER_MINOR, 4, 4) + FIELD(TR_RAM_IMPL, COMP_TYPE, 8, 4) + FIELD(TR_RAM_IMPL, HAS_SRAM, 12, 1) + FIELD(TR_RAM_IMPL, HAS_SMEM, 13, 1) + /* reserved bits */ + FIELD(TR_RAM_IMPL, RSVP1, 14, 18) + +REG32(TR_RAM_START_LOW, 0x010) + FIELD(TR_RAM_START_LOW, ADDR, 2, 30) +REG32(TR_RAM_START_HIGH, 0x014) + FIELD(TR_RAM_START_HIGH, ADDR, 0, 32) + +REG32(TR_RAM_LIMIT_LOW, 0x018) + FIELD(TR_RAM_LIMIT_LOW, ADDR, 2, 30) +REG32(TR_RAM_LIMIT_HIGH, 0x01C) + FIELD(TR_RAM_LIMIT_HIGH, ADDR, 0, 32) + +REG32(TR_RAM_WP_LOW, 0x020) + FIELD(TR_RAM_WP_LOW, WRAP, 0, 1) + FIELD(TR_RAM_WP_LOW, ADDR, 2, 30) +REG32(TR_RAM_WP_HIGH, 0x024) + FIELD(TR_RAM_WP_HIGH, ADDR, 0, 32) + +struct TraceRamSink { + /*< private >*/ + SysBusDevice parent_obj; + + MemoryRegion reg_mem; + uint32_t reg_mem_size; + + hwaddr baseaddr; + uint32_t regs[TRACE_R_MAX]; + RegisterInfo regs_info[TRACE_R_MAX]; + + hwaddr smemaddr; + MemoryRegion smem; + uint32_t smemsize; + uint8_t *msgs; +}; + +#define TYPE_TRACE_RAM_SINK "trace-ram-sink" + +OBJECT_DECLARE_SIMPLE_TYPE(TraceRamSink, TRACE_RAM_SINK) + +#endif --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861981; cv=none; d=zohomail.com; s=zohoarc; b=iRvft0srecewHK7+Es0iL/XsYoGx7Lu8PhwpXcfUeca7fyB1jNMrNRCVd2hiZjSg0LzRwgklQL9SKVKQlaWMMFlXAF2khPhnMExlxi/mINwN+zcpxU6dtzjaxDMX4SEJ8XCk2CAgpq6i6KOwUay9PkLVM7JdRCCj7wrFCeHlwWc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861981; 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=RDZqy9Ycf62vW9VzFoH94rD5vUs2gHUCx1e+AQMwd78=; b=Cu5Q05CKKKmb9kIfRommMgLITe8GoShayaToUpdAJ0mSEJmG23fDYvzSiwKbh3BtpojDBlc7wBUV9c0FHba2p316wv02fiqwtumSP4B7QbUuZVun5NN8bStOjf62QVifU17ySxxYsEyatexJ+E0R0veIrfcwBDMNLbgTLPV/Yb0= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861981342759.7682946945442; Tue, 11 Nov 2025 03:53:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrO-0006yD-6j; Tue, 11 Nov 2025 06:48:30 -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 1vImqf-0004y2-S5 for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:46 -0500 Received: from mail-pg1-x529.google.com ([2607:f8b0:4864:20::529]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImqZ-0004PU-FZ for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:45 -0500 Received: by mail-pg1-x529.google.com with SMTP id 41be03b00d2f7-b996c8db896so3412553a12.3 for ; Tue, 11 Nov 2025 03:47:29 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.47.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:47:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861648; x=1763466448; 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=RDZqy9Ycf62vW9VzFoH94rD5vUs2gHUCx1e+AQMwd78=; b=fCp9yXDIpmuQM7H5s/zlpPQPOxWjOk+1jWn/O3wXWHAS4MXWtuH/C4pCgJBZsO7O8d skZXLQfKKU7luMsZJb/lLWCS2T3I3WSGCWvPgrQghxEGjKTtnON2PHyhMTAudxxybTAC 5K2b5BKHLKBzfS+f0mzPpgsvA89/ObhA9t2tdgo/DLYVCjZP89ji3Gh6za/EwXVmnoJE xBpTz9fWdljhbpZwby06cj6y++VtYCxat9dN7phwl283FQi3bEmFxz/4GikWXETYbbpX mRKZe5lRKjgqa5r3SqtTsd9obmXPhe10jl0w1UufzQG/lpxnZAedPeRPJmLKZHMiX/mf Xxow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861648; x=1763466448; 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=RDZqy9Ycf62vW9VzFoH94rD5vUs2gHUCx1e+AQMwd78=; b=t7QSgCDNDopzDm1j0X3WfJHrU4mCyJRcGOoD0i1j0ps6txXtfnslq1r7ebfoRtaUU6 Ky9/Y9BBjo7Z/1qlwstmk7qNyakB6GqWp60XbtfildJyXO8IeWyU2TUY2IQHVrnIIsV7 vPbA9ZF6tTJN9tVSVDGdhfSA3rYHa/RH/C1pSfeEYlP414WnsfM7ivRMCGXWIsG9j2Sl QXb5IBEHsJ8+sg1dcyRTHxaicDCdS/FNt0FFmoh0xcwP3FgV8I9617r3YktesAltOo6D wcTd3A8r9QaTBcPmAcmpBbE8u6yLqGa2RdHNag4+pOpVWjlsyDc9tyI0+6jYMp1CjTIz dqtg== X-Gm-Message-State: AOJu0YxW96gsTsTa3eyuWVKIsrJF3D6+p8GeNZWBQTwylCHOtZdAOplM 7QH7ZeNmWVtQML2tnEiZlhHpNiICHsDM6cvLQBIVMDXaYosz2/NGDQTRP99VyXZA+Iwjp/2guXm +3ijaPnE= X-Gm-Gg: ASbGnctojq0hYCCpSblJP9MzXgQm7RWXS7nhBRY7FeOSYGmblggvkQZqm7F1Qin2Vxw qpOHnLTF+cv+I7FsQoSkRDLPPuSPaniO/25RWgHiWMCltaKQdZOfhFBG2L5WoHE78TK42elQA2T WYnrbf9pbfbGVPGRiBkK9Ya2n2AZf0lGQm3xMVzm9JiJkPmE4wHTiiaqBRlcrNDsPPaXx6csM9H SjqylgVt+0vGvvpvGiChr0N/0aeGhzrnHWFmc4eySS13pT2+czCuykKmUIgmRz4zVjHKcY/iEK6 of0lLkgyoyXzuqvMHbwu/i9NuPCtBkuBnaA0NhSpOhh3/8qjdhdfdCgw7On+ypr25ElEJ1uG//c ei3DZzpHjm9uLavIPtz8dNmItgIW4w0KOKYzSMJwArf7Jjk+oWxsmt29Y9CV6Vt3NNQUqdkYYl8 0n+uhdcfivDGz1A54lySJ0ZPICo8E= X-Google-Smtp-Source: AGHT+IFygTL/Ro2/76nj3R+cdpt5yfcIgJlHk/sc3lXC2Rc0388+Dj65gZb4pvibzEmPoCHZ5Q+TnA== X-Received: by 2002:a17:903:350d:b0:298:8ec:9991 with SMTP id d9443c01a7336-29808ec9a10mr112272315ad.37.1762861647568; Tue, 11 Nov 2025 03:47:27 -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 v2 03/17] hw/riscv/trace-encoder: add trace start/stop logic Date: Tue, 11 Nov 2025 08:46:42 -0300 Message-ID: <20251111114656.2285048-4-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::529; envelope-from=dbarboza@ventanamicro.com; helo=mail-pg1-x529.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861981763158500 Content-Type: text/plain; charset="utf-8" Starting/stopping a trace session will rely on two flags: - trace_next_insn: this flag will be used to signal the translation that the encoder wants to know the PC of the current insn. The translation helper (to be added) will clear this flag after sending the current insn to the encoder; - trace_running: shows that we're running a trace session and certain insns classes (traps, certain jumps and branches) need to report to the trace encoder. These flags are controlled by the trTeInstTracing bit. This bit requires other two bits to be set beforehand (ACTIVE and ENABLE). We'll revisit these bits in the future as more features are implemented. While we're at it, add hardwire bits to indicate which features we're (not) implementing at this time. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/trace-encoder.c | 107 +++++++++++++++++++++++++++++++++++++++ hw/riscv/trace-encoder.h | 4 ++ 2 files changed, 111 insertions(+) diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 21bf650a6a..d45e45d17e 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -30,7 +30,11 @@ REG32(TR_TE_CONTROL, 0x0) 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, CONTEXT, 9, 1) + FIELD(TR_TE_CONTROL, INST_STALL_ENA, 13, 1) + FIELD(TR_TE_CONTROL, INHIBIT_SRC, 15, 1) FIELD(TR_TE_CONTROL, INST_SYNC_MODE, 16, 2) + FIELD(TR_TE_CONTROL, INST_SYNC_MAX, 20, 4) FIELD(TR_TE_CONTROL, FORMAT, 24, 3) /* reserved bits */ FIELD(TR_TE_CONTROL, RSVP1, 7, 2) @@ -75,17 +79,116 @@ REG32(TR_TE_IMPL, 0x4) =20 #define R_TR_TE_IMPL_RESET (BIT(0) | BIT(8)) =20 +REG32(TR_TE_INST_FEATURES, 0x8) + FIELD(TR_TE_INST_FEATURES, NO_ADDR_DIFF, 0, 1) + +static uint64_t trencoder_te_ctrl_set_hardwire_vals(uint64_t input) +{ + input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_MODE, 0x6); + input =3D FIELD_DP32(input, TR_TE_CONTROL, CONTEXT, 0); + input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_STALL_ENA, 0); + input =3D FIELD_DP32(input, TR_TE_CONTROL, INHIBIT_SRC, 1); + input =3D FIELD_DP32(input, TR_TE_CONTROL, FORMAT, 0); + + /* SYNC_MODE and SYNC_MAX will be revisited */ + input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_SYNC_MODE, 0); + input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_SYNC_MAX, 0); + + return input; +} + +static uint64_t trencoder_te_ctrl_prew(RegisterInfo *reg, uint64_t val) +{ + TraceEncoder *te =3D TRACE_ENCODER(reg->opaque); + uint32_t trTeActive =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, ACTI= VE); + uint32_t trTeInstTracing =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, + INST_TRACING); + uint32_t temp; + + val =3D trencoder_te_ctrl_set_hardwire_vals(val); + + if (!trTeActive) { + /* + * 11.2 Reset and discovery, table 58, trTeControl =3D 0x1 + * means "Release from reset and set all defaults." Do + * that only if trTeActive is 0. + */ + if (val =3D=3D 0x1) { + val =3D FIELD_DP32(val, TR_TE_CONTROL, EMPTY, 1); + + return val; + } + + /* + * 11.3 Enabling and Disabling hints that the device must + * be activated first (trTeActive =3D 1), then enabled. + * Do not enable the device if it's not active + * beforehand. + */ + temp =3D FIELD_EX32(val, TR_TE_CONTROL, ENABLE); + if (temp) { + val =3D FIELD_DP32(val, TR_TE_CONTROL, ENABLE, 0); + } + } + + /* + * Do not allow inst tracing to start if the device isn't + * already enabled. Do not allow enabling the devince and + * and enable tracing at the same time. + */ + if (!te->enabled && trTeInstTracing) { + val =3D FIELD_DP32(val, TR_TE_CONTROL, INST_TRACING, 0); + } + + return val; +} + +static void trencoder_te_ctrl_postw(RegisterInfo *reg, uint64_t val) +{ + TraceEncoder *te =3D TRACE_ENCODER(reg->opaque); + uint32_t trTeActive =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, ACTI= VE); + uint32_t trTeEnable =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, ENAB= LE); + uint32_t trTeInstTracing =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, + INST_TRACING); + + if (!trTeActive) { + te->enabled =3D false; + te->trace_running =3D false; + te->trace_next_insn =3D false; + return; + } + + if (te->enabled && !trTeEnable) { + /* TODO: this should cause a pending trace data flush. */ + } + + te->enabled =3D trTeEnable ? true : false; + + if (!te->trace_running && trTeInstTracing) { + /* Starting trace. Ask the CPU for the first trace insn */ + te->trace_next_insn =3D true; + } + + te->trace_running =3D trTeInstTracing ? true : false; +} + 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, + .pre_write =3D &trencoder_te_ctrl_prew, + .post_write =3D &trencoder_te_ctrl_postw, }, { .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, }, + { .name =3D "TR_TE_INST_FEATURES", .addr =3D A_TR_TE_INST_FEATURES, + .reset =3D R_TR_TE_INST_FEATURES_NO_ADDR_DIFF_MASK, + .ro =3D ~0, + }, }; =20 static uint64_t trencoder_read(void *opaque, hwaddr addr, unsigned size) @@ -132,6 +235,10 @@ static void trencoder_reset(DeviceState *dev) for (int i =3D 0; i < ARRAY_SIZE(te->regs_info); i++) { register_reset(&te->regs_info[i]); } + + te->enabled =3D false; + te->trace_running =3D false; + te->trace_next_insn =3D false; } =20 static void trencoder_realize(DeviceState *dev, Error **errp) diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h index 71002f58a4..001d872514 100644 --- a/hw/riscv/trace-encoder.h +++ b/hw/riscv/trace-encoder.h @@ -33,6 +33,10 @@ struct TraceEncoder { hwaddr ramsink_ramlimit; uint32_t regs[TRACE_R_MAX]; RegisterInfo regs_info[TRACE_R_MAX]; + + bool enabled; + bool trace_running; + bool trace_next_insn; }; =20 #define TYPE_TRACE_ENCODER "trace-encoder" --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861956; cv=none; d=zohomail.com; s=zohoarc; b=EA+yyLP20r/fZrX104LfCGmVqgRE1nOgmORqS3wx6G00Elt/+g3q2CRlTfY7+49j4M+kKsDUMlGEryDk71C3qvjwvjXDJX2OA9la+Wr+lUyagCQj49TB1VMVEX3x9P2T3kyDwoAtvmQJhaAUYQ9h3iKfbYc3p+C9Ka4mhOqtRds= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861956; 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=cw/EijlREtcvo2COVu/cVEEzmj7shDfjPN3cQQN1US0=; b=je013xqvF/o4gROWbONqUnVbOkOe2uaP8Wy180p+SxFgk9dyf6jafgorHMb3pqgn9r6kqWfWASfQ9Mm6vtwmOx+JJBVWjtCqL3WdAWvLv3/UNZIb7lxXDWbANNZRaPhp6Y8bVIySFK5fFiO/lb7uu5eSRxSY0vK9L4g3xhaeyBE= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861956375442.1285079837147; Tue, 11 Nov 2025 03:52:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrO-0006yN-7i; Tue, 11 Nov 2025 06:48:30 -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 1vImqh-000507-Br for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:47 -0500 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImqd-0004Pr-TG for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:47 -0500 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-2956d816c10so43959075ad.1 for ; Tue, 11 Nov 2025 03:47:34 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.47.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:47:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861654; x=1763466454; 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=cw/EijlREtcvo2COVu/cVEEzmj7shDfjPN3cQQN1US0=; b=H71RX2JzaT4QxBYckPDlh3yB1Zab37K2W/ayVFJun+e6m3aQmQKxBqtsSo0jKtzHmh ySgQ+bOrYEmmdBHfEkcPU9q/1l9HjG1YTkT5iikYivHAYhvAUMdRRhzuq3+pxD1+JlOX WHlfAzATY8V2cdR67AON4GNXOqZ0Ixf7TzKTebU7w2gL6VbRuTF0xkXau353TcZ4GC9R RlSTZ0cXjLhhM2D+Bq+r0dx31BR8g1ycQwwom8myhU0UaI42CLEhDAB2jVRrX1eifp/g TVq6w9YkH45D04jDoVrA7sM5MiIFbxhB9BWL1qENxiANahS0DILHEr+EI3LQEoORMG+f H02Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861654; x=1763466454; 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=cw/EijlREtcvo2COVu/cVEEzmj7shDfjPN3cQQN1US0=; b=FPUBoyYEY9+ParJ5m3OUC3fclRIgmdcwfWGfvczvPsm5zcQplmKmQU5N+MkLJ+sFZ/ rqj3KHQ0XLlmTPJsqZFy3UKQZ6baF3dbXBunwr+vf/n7D9QqHANlQoGMPcAUK0N6OSdg zN29+HXqsFH93ZKcWOdX47B+ZxAIALsFCYLTI0xdEe5AqZFL77ugJSpbiRK2QeI3VlZT wBf6a6BGVUcjQlYzPeiuBiXmF1FeHCwiPM5tIiThT9wNUG//EFDcBNEXpQsrLF1Fk3MY Cqa0dsDtH4UPKomGuiLeTnXPb3NEzu56da4vMpfQWwBA2RR3aXDyvZNn/l6DpfvtMTYo qd/w== X-Gm-Message-State: AOJu0YyDI6pKLJfgRBOXG0FwwqIScOPtVls9zinRKYYmj0YxY82/x3FF naC+24u7U5JDUiZNIWPLz6/P4AyL+HB3w+++yjDTn5H87JtFaADJjdpLNS6HyB42z2n08cEFxAZ +c71YrwI= X-Gm-Gg: ASbGncslyWDWvJd/ha9B+ZkUACEkBTJRQnH3kolDrSx7mZsj+RYCSKqll9o9g2efATB +ZHMFHpAvUFOkZhkJWodhtT97fVqg3kwKxTQ/1JwxuyJSh7jB7+eVHGi3gCKKwarRdwbGDbP9O+ vwu+5GSZAVhBr0SPNgOD+tJgfwq4xtknQ0uL45Z5AhnkI2Be3kgtfUSeqIwNZa62Ba0IlzOFn2V G2KjsZull4VphefCvv1qDj/lFauWsbvZwgQ6YNDfCQsjRZnYo8UwyxT0AgGcoe1C/KMkClkE+6o TqVY7N74AMZWmO0xzRkN1/6Hot64zUYqvyljt10AcLI84THCJJlKaF1ggWHce3h48ylLTTXD4mX 6DQvFXitNlKHMTXYxhi3ngxxzEjSMGze/e5ZqdZnRQrCg+sncMXhun3CldkK7KuZacgzO2WSW7/ LxpceuIEdKky3S4H4u2ozKWzlJcmfCf82x8nzydE0E4VQ93m/+ X-Google-Smtp-Source: AGHT+IFwNMoUz5KvnNPM6+6ii7vvM3Udw2/SPywoiErpFwScpbVJKcdBYcZ6Yn01E2/OLO5zwj9pSA== X-Received: by 2002:a17:903:4b43:b0:298:90f:5b01 with SMTP id d9443c01a7336-298090f5c89mr104999795ad.52.1762861653630; Tue, 11 Nov 2025 03:47:33 -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 v2 04/17] hw/riscv/virt.c: add trace encoders and trace ram sinks Date: Tue, 11 Nov 2025 08:46:43 -0300 Message-ID: <20251111114656.2285048-5-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::633; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x633.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861957991153000 Content-Type: text/plain; charset="utf-8" Add the minimal topology required for e-trace support in the virt machine, e.g. each CPU will have a single trace encoder, and each trace encoder will communicate to a single associated trace ram sink. At this moment we're not going to support more complex topologies with trace funnels and so on. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/virt.c | 77 ++++++++++++++++++++++++++++++++++++++ include/hw/riscv/virt.h | 2 + target/riscv/cpu.h | 9 +++++ target/riscv/tcg/tcg-cpu.c | 5 +++ 4 files changed, 93 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 17909206c7..b1a4d63efd 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -58,6 +58,8 @@ #include "qapi/qapi-visit-common.h" #include "hw/virtio/virtio-iommu.h" #include "hw/uefi/var-service-api.h" +#include "hw/riscv/trace-encoder.h" +#include "hw/riscv/trace-ram-sink.h" =20 /* KVM AIA only supports APLIC MSI. APLIC Wired is always emulated by QEMU= . */ static bool virt_use_kvm_aia_aplic_imsic(RISCVVirtAIAType aia_type) @@ -79,6 +81,17 @@ static bool virt_aclint_allowed(void) return tcg_enabled() || qtest_enabled(); } =20 +#define TR_DEV_REGMAP_SIZE 0x1000 +/* For VIRT_CPUS_MAX =3D 512: TRACE_DEV_REG_MAX =3D 0x200000 */ +#define TRACE_DEV_REG_MAX (TR_DEV_REGMAP_SIZE * VIRT_CPUS_MAX) + +/* + * 64k for the RAM Sink that includes the 4k (0x1000) + * for regs, for each possible CPU. For 512 max CPUs, + * total size =3D 0x2000000. + */ +#define TRACE_RAM_SINK_SIZE (1UL << 16) + static const MemMapEntry virt_memmap[] =3D { [VIRT_DEBUG] =3D { 0x0, 0x100 }, [VIRT_MROM] =3D { 0x1000, 0xf000 }, @@ -88,7 +101,9 @@ static const MemMapEntry virt_memmap[] =3D { [VIRT_ACLINT_SSWI] =3D { 0x2F00000, 0x4000 }, [VIRT_PCIE_PIO] =3D { 0x3000000, 0x10000 }, [VIRT_IOMMU_SYS] =3D { 0x3010000, 0x1000 }, + [VIRT_TR_ENCODERS] =3D { 0x3020000, TRACE_DEV_REG_MAX }, [VIRT_PLATFORM_BUS] =3D { 0x4000000, 0x2000000 }, + [VIRT_TR_RAM_SINKS] =3D { 0x6000000, TRACE_RAM_SINK_SIZE * VIRT_CPUS_= MAX }, [VIRT_PLIC] =3D { 0xc000000, VIRT_PLIC_SIZE(VIRT_CPUS_MAX * 2= ) }, [VIRT_APLIC_M] =3D { 0xc000000, APLIC_SIZE(VIRT_CPUS_MAX) }, [VIRT_APLIC_S] =3D { 0xd000000, APLIC_SIZE(VIRT_CPUS_MAX) }, @@ -1525,6 +1540,64 @@ static void virt_machine_done(Notifier *notifier, vo= id *data) } } =20 +/* + * Must be called after 'soc' realize since it + * uses CPU objs. + */ +static void virt_init_socket_trace_hw(RISCVVirtState *s, int socket_num) +{ + for (int cpu =3D 0; cpu < s->soc[socket_num].num_harts; cpu++) { + RISCVCPU *cpu_ptr =3D &s->soc[socket_num].harts[cpu]; + DeviceState *trencoder, *ram_sink; + uint64_t trencoder_addr, ram_sink_addr, smem_addr; + uint32_t smem_size =3D TRACE_RAM_SINK_SIZE - TR_DEV_REGMAP_SIZE; + + ram_sink =3D qdev_new(TYPE_TRACE_RAM_SINK); + + ram_sink_addr =3D virt_memmap[VIRT_TR_RAM_SINKS].base + + TRACE_RAM_SINK_SIZE * cpu; + /* smem is located right after ram sink base */ + smem_addr =3D ram_sink_addr + TR_DEV_REGMAP_SIZE; + + object_property_set_uint(OBJECT(ram_sink), "baseaddr", + ram_sink_addr, &error_fatal); + object_property_set_uint(OBJECT(ram_sink), "smemaddr", + smem_addr, &error_fatal); + object_property_set_uint(OBJECT(ram_sink), "smemsize", + smem_size, &error_fatal); + sysbus_realize_and_unref(SYS_BUS_DEVICE(ram_sink), &error_fatal); + + /* + * We can't do object_property_set_link() because we're + * coming after cpu.realize() (the riscv_hart obj creates + * the CPU objs in its realize() since it has no init). + * We need changes in how riscv_hart works to use + * set_link() and to not manually realize the trace + * encoder. + * + * For now do everything manually. + */ + trencoder =3D qdev_new(TYPE_TRACE_ENCODER); + cpu_ptr->trencoder =3D OBJECT(trencoder); + + trencoder_addr =3D virt_memmap[VIRT_TR_ENCODERS].base + + TR_DEV_REGMAP_SIZE * cpu; + + object_property_set_link(OBJECT(trencoder), "cpu", + OBJECT(cpu_ptr), &error_fatal); + object_property_set_int(OBJECT(trencoder), "cpu-id", cpu, &error_f= atal); + object_property_set_uint(OBJECT(trencoder), "baseaddr", + trencoder_addr, &error_fatal); + object_property_set_uint(OBJECT(trencoder), "dest-baseaddr", + ram_sink_addr, &error_fatal); + object_property_set_uint(OBJECT(trencoder), "ramsink-ramstart", + smem_addr, &error_fatal); + object_property_set_uint(OBJECT(trencoder), "ramsink-ramlimit", + smem_addr + smem_size, &error_fatal); + sysbus_realize_and_unref(SYS_BUS_DEVICE(trencoder), &error_fatal); + } +} + static void virt_machine_init(MachineState *machine) { RISCVVirtState *s =3D RISCV_VIRT_MACHINE(machine); @@ -1580,6 +1653,10 @@ static void virt_machine_init(MachineState *machine) hart_count, &error_abort); sysbus_realize(SYS_BUS_DEVICE(&s->soc[i]), &error_fatal); =20 + if (tcg_enabled()) { + virt_init_socket_trace_hw(s, i); + } + if (virt_aclint_allowed() && s->have_aclint) { if (s->aia_type =3D=3D VIRT_AIA_TYPE_APLIC_IMSIC) { /* Per-socket ACLINT MTIMER */ diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 7b4c2c8b7d..e2aa6fbbcd 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -88,6 +88,8 @@ enum { VIRT_PLATFORM_BUS, VIRT_PCIE_ECAM, VIRT_IOMMU_SYS, + VIRT_TR_ENCODERS, + VIRT_TR_RAM_SINKS, }; =20 enum { diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 36e7f10037..12251e4d94 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -553,6 +553,15 @@ struct ArchCPU { /* Mapping of events to counters */ GHashTable *pmu_event_ctr_map; const GPtrArray *decoders; + +#ifndef CONFIG_USER_ONLY + /* + * Associated Trace Encoder. It will not be NULL if + * we're running with TCG and initialized manually by + * the board. + */ + Object *trencoder; +#endif }; =20 typedef struct RISCVCSR RISCVCSR; diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c index d3968251fa..a381ee2840 100644 --- a/target/riscv/tcg/tcg-cpu.c +++ b/target/riscv/tcg/tcg-cpu.c @@ -37,6 +37,7 @@ #include "hw/boards.h" #include "system/tcg.h" #include "exec/icount.h" +#include "hw/riscv/trace-encoder.h" #endif =20 /* Hash that stores user set extensions */ @@ -1297,6 +1298,10 @@ static bool riscv_tcg_cpu_realize(CPUState *cs, Erro= r **errp) if (riscv_has_ext(env, RVH)) { env->mideleg =3D MIP_VSSIP | MIP_VSTIP | MIP_VSEIP | MIP_SGEIP; } + + if (cpu->trencoder) { + qdev_realize(DEVICE(cpu->trencoder), NULL, &error_fatal); + } #endif =20 return true; --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861768; cv=none; d=zohomail.com; s=zohoarc; b=EgK6v9mglW5dtTWE0tzbOF8IjruCOV1UQboM06CrW9wIBYytVe3KP2oAW9h9IdC28S+wmriQTZRqTIjIh6n2/zAaoDiRQAb7hG42pm4VITjaQsWdljvxW9wBYGRV/fbgrYtl9Zml2bxax8/LfrSoGv/7/C4ByZEQQgWtaPcw7W0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861768; 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=FVYI3uDYuiUnuBphImalv/xBwCe/21ga86oRo136tDE=; b=fa0pCwLWQ/Iw3XOZWOOn9plD3WpeXC0q6UONaJgMQvDLGDAy9bRLWOV9b9iCGx2+2PzF8ZXYBoPMMHU+BJLaZ27A8J+kFjM10TATs/YUhKyuJCFn99TgBkloRmPkCNgefBPdnFrHhXS5KO3itAXhe+dEOfDekOmv6lcXwBT4E9E= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861768051657.3316715083233; Tue, 11 Nov 2025 03:49:28 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrP-00071d-HM; Tue, 11 Nov 2025 06:48:31 -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 1vImqh-000502-7Q for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:47 -0500 Received: from mail-pg1-x532.google.com ([2607:f8b0:4864:20::532]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImqe-0004Q9-4u for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:46 -0500 Received: by mail-pg1-x532.google.com with SMTP id 41be03b00d2f7-b553412a19bso2381501a12.1 for ; Tue, 11 Nov 2025 03:47:41 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.47.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:47:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861660; x=1763466460; 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=FVYI3uDYuiUnuBphImalv/xBwCe/21ga86oRo136tDE=; b=ohkrdcSuj+flJaShRGoY9z471IdMV++XszvH9PL6/9UeQ2Nw87zejgSekGA2MNZ1B0 yEnHtoDTF2FplZDQQIsdIdU03SHI3aHKu+HowIoX83sFQlDvDz1VYoIGFkDWq8w8sBGU 4vxUCClADGB3sSOPL0i0X4+LHmf7O5WU+vDqmcpgI30WqmO5/SA1wahXG3L1MDoZou5z bGhGriXMDl9xhUW9cMgf4IiMTJDdiOdVg7D9W2S3H5fTwuHASfhQanNQRDCa5W0QU708 gOMrdJbxDkZrBNeYR2yjepqlWNCUq78hehZh05rNpqNUKel94F4iAwb3rP+pofbNZaqW 6TFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861660; x=1763466460; 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=FVYI3uDYuiUnuBphImalv/xBwCe/21ga86oRo136tDE=; b=CPCPNwKSiVDQxQ0jo7ddMsPrOTZbbIiDA4ffztRQY6fHihZeEc3jFyq07vVivLqF/G utCoM1FB1YBy707XsQkQfmV4zuwMXZmYN1n+2fF2RF55dWMqTdRbNcls0iBSFI/xZenK 5G17G5Fa/u6xbrZsavSBlqpKVZ0R6iFjHMByle0qP3WnCEvsSwUbEIcf6Au+SIE2ToPe chei+1qFCW4p7eWA/pBDqWQFTeRCWUa7yvqiGptMFGsFhfJzYEPOIsjKfSKqkBM4kRkC b7ZVmyI+zeAPLE93++vEW+kaZ31CtxInRMfIpZZhSfN8LeFRR8eBPNmEPIAmx3PumUwM EzEg== X-Gm-Message-State: AOJu0Yyp86nAeF0WQbBiW3Fzt6T74xNeHmeUPPnfsuVo9aqrBPNbFQ/1 6W+Q5Ff3YLCVAAlFCsN91LOTT3ryIjyZWbB+VbyMLF7xG0NJVi7026odEPTutkMWfeJ0mPi7VLo wAbc0L1Y= X-Gm-Gg: ASbGncsIpkMrMoeztncEPvaf2tEDjw1nbDrW0NiO8hbxKMsk0aBhZv5mj4eucOvFYie olM5eyW3bNzRWRV5oDP54ZBOAJynuzY9dKNNpGnwTdIfyaZFf3mifQHsBRFJeCjGtPFYe5E8IH+ MjZZXpYZ9aecniXP2c1z5boUwi5dc9Rqn6NIZHbEBKlMJSKZPu7BbgIT6Khr4gVzBqDf/lh0HbY 2EQgfQ6OlPnWtxgDN9p9+lDylvrDQpKxR1bWNM6piT33r27XDYs/q8qfMV9x1iLefZvmpzbCShH rSPc5aHkaeK/kuuOSgWPwqKL1Pk+/m23dXJFb5Om8T20rR6Ss+oMUlt4cvfWF67SMEck2Dl0dQs 81GmIEKlEtzKT2fot7RBNbNoUE/eOXOPntKC+iIX4cQWuMD0EiCPa53yPjiLqZxjpV8KCuDDAez OkK/hD/xk0S+4kkqbQnE0pdWPQ8xw= X-Google-Smtp-Source: AGHT+IG/JmIzL6MQOcq4afromovbKQ+ojOkf+fQTkALXHkrzQWcq5fyv9wHkfQQIeXKgw8ke2ICTWA== X-Received: by 2002:a17:903:3848:b0:294:def6:5961 with SMTP id d9443c01a7336-297e56d0868mr156485935ad.45.1762861660161; Tue, 11 Nov 2025 03:47:40 -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, Mayuresh Chitale , Daniel Henrique Barboza Subject: [PATCH v2 05/17] hw/riscv/virt.c add trace encoder and ramsink fdt nodes Date: Tue, 11 Nov 2025 08:46:44 -0300 Message-ID: <20251111114656.2285048-6-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::532; envelope-from=dbarboza@ventanamicro.com; helo=mail-pg1-x532.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861770694158500 Content-Type: text/plain; charset="utf-8" From: Mayuresh Chitale The trace encoder and trace ramsink nodes should confirm to the bindings described in "riscv,trace-component.yaml" in the Linux kernel. That way, encoder and ramsink devices get populated on the rvtrace bus and perf record is able to capture the trace data in the auxtrace section as expected. Signed-off-by: Mayuresh Chitale Signed-off-by: Daniel Henrique Barboza --- hw/riscv/virt.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index b1a4d63efd..30e89a6c5a 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1142,6 +1142,62 @@ static void create_fdt_iommu(RISCVVirtState *s, uint= 16_t bdf) s->pci_iommu_bdf =3D bdf; } =20 +static void create_fdt_rvtrace(RISCVVirtState *s) +{ + static const char * const tr_compat[2] =3D { "qemu,trace-component", + "riscv,trace-component" }; + g_autofree char *cpu_name =3D NULL, *ram_sink_name =3D NULL, + *trencoder_name =3D NULL, *ep =3D NULL; + MachineState *ms =3D MACHINE(s); + int socket_count =3D riscv_socket_count(ms), i; + uint64_t addr, size =3D 0x100; + uint32_t rs_phandle; + RISCVCPU *cpu_ptr; + + + for (i =3D 0; i < socket_count; i++) { + for (int cpu =3D 0; cpu < s->soc[i].num_harts; cpu++) { + cpu_ptr =3D &s->soc[i].harts[cpu]; + if (!cpu_ptr->trencoder) { + continue; + } + cpu_name =3D g_strdup_printf("/cpus/cpu@%d", + s->soc[i].hartid_base + cpu); + ram_sink_name =3D g_strdup_printf("/soc/ramsink@%d", + s->soc[i].hartid_base + cpu); + qemu_fdt_add_subnode(ms->fdt, ram_sink_name); + addr =3D object_property_get_uint(cpu_ptr->trencoder, "dest-ba= seaddr", + &error_abort); + qemu_fdt_setprop_sized_cells(ms->fdt, ram_sink_name, "reg", 2,= addr, + 2, size); + qemu_fdt_setprop_string_array(ms->fdt, ram_sink_name, "compati= ble", + (char **)&tr_compat, + ARRAY_SIZE(tr_compat)); + qemu_fdt_setprop_phandle(ms->fdt, ram_sink_name, "cpu", cpu_na= me); + ep =3D g_strdup_printf("%s/in-ports/port/endpoint", ram_sink_n= ame); + qemu_fdt_add_path(ms->fdt, ep); + rs_phandle =3D qemu_fdt_alloc_phandle(ms->fdt); + qemu_fdt_setprop_cell(ms->fdt, ep, "phandle", rs_phandle); + + + trencoder_name =3D g_strdup_printf("/soc/encoder@%d", + s->soc[i].hartid_base + cpu); + qemu_fdt_add_subnode(ms->fdt, trencoder_name); + addr =3D object_property_get_uint(cpu_ptr->trencoder, "baseadd= r", + &error_abort); + qemu_fdt_setprop_sized_cells(ms->fdt, trencoder_name, "reg", 2, + addr, 2, size); + qemu_fdt_setprop_string_array(ms->fdt, trencoder_name, "compat= ible", + (char **)&tr_compat, + ARRAY_SIZE(tr_compat)); + qemu_fdt_setprop_phandle(ms->fdt, trencoder_name, "cpus", cpu_= name); + ep =3D g_strdup_printf("%s/out-ports/port/endpoint", trencoder= _name); + qemu_fdt_add_path(ms->fdt, ep); + qemu_fdt_setprop_cell(ms->fdt, ep, "remote-endpoint", rs_phand= le); + } + } +} + static void finalize_fdt(RISCVVirtState *s) { uint32_t phandle =3D 1, irq_mmio_phandle =3D 1, msi_pcie_phandle =3D 1; @@ -1166,6 +1222,8 @@ static void finalize_fdt(RISCVVirtState *s) create_fdt_uart(s, irq_mmio_phandle); =20 create_fdt_rtc(s, irq_mmio_phandle); + + create_fdt_rvtrace(s); } =20 static void create_fdt(RISCVVirtState *s) --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861860; cv=none; d=zohomail.com; s=zohoarc; b=dg931ozj+J5idZhljprewlFDTAJdjjm4uevyvqfNfRrF4yBuHfYXGIjc8oP3nN3RwY6jmF4d8+rU+MBglSFNPQEifx18iAMUKSVja7dkQr1u+dUGAwfqt87Z+gGNBWCKXUwZq4ibtJXohmaUXsoWp495g0bJnTwvTeAkv6GJxy8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861860; 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=EiLpyGQ8iPmBHhAq4gzyV2rfadUDO5QoV6sue0EbPas=; b=GrkfYRGpGCVQilsth/BVTIF4tdAvVGT287WJMZ2PUE01Q6iRM34KbWTQqvtXtzmtdzvEWe4ISympUUbTPX0nzHboiQqoBh77u+x9aulb5e/ieb8YfPWeW/dMnn1CQd7tYNmDbftbfzSfDlfXITq6MLLLGNhQr4bw1Gil7hUt4JE= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861860514460.39388577674606; Tue, 11 Nov 2025 03:51:00 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrR-000759-F0; Tue, 11 Nov 2025 06:48:33 -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 1vImqn-0005GQ-6V for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:53 -0500 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImql-0004RU-4O for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:52 -0500 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-298144fb9bcso20462095ad.0 for ; Tue, 11 Nov 2025 03:47:48 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.47.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:47:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861667; x=1763466467; 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=EiLpyGQ8iPmBHhAq4gzyV2rfadUDO5QoV6sue0EbPas=; b=Ts/aQZP+aoeAvpdPWAuxRCb5azeZNvcBN/9Ag26H40O91iNxNRtI3aTqnI7pZwu5c8 1cPfM95A0q5v4uOfaDgvXeUJkSgg/RQ/NDIPfi/s/eVdXcidX4FpZcXiolTB4tL80z8f vByPAyYzJT6ux5tDvauuVrD1Le7qxpjRkBbOtug3wEfNRtDDkIwn8i4bqzDy11N9gCVH kcmbbm3epYgR36fXHj+/JfJB/4eVNAroHwZ8pQeE0b60OlazixO7XisUZv5vOKBYCHSs 1GdxHLWP2Bsjg1eSNzO2QAyuH85tgds3I9iTkCM0BOTz5fzR4yWD55M7Of5Q6NBJer7E E2Fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861667; x=1763466467; 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=EiLpyGQ8iPmBHhAq4gzyV2rfadUDO5QoV6sue0EbPas=; b=Gf6OPBtuPjndqyfBg07Nd1cAjlcY9PPwMr/XiA2L7V0YI+0SlL/+qsZiEx0qOIvJ9H /ucDemHATvF9h6Ch0ELmcpArb7ppkNuQHsz31ZVdYDGqChgqTESpa59Cg/NyIcl75ryI 5lIg2UcmAVT65W6/wB/YXKUvvOpDlRMOs4SKzFZc5nThwA11+letJIObglIq/oEnDaR2 +YIVB7Wy6EGodQku1H0tamelvs4gS4BJie9Zh2Vu48gHFWKvK0yxQB7W/1UVtHd8dpS4 98a4xCY93JpHLVH1p9nWZoutq1GCOrSyvqDKYRa4FIP3ULNJ8QeYdnLRk6Cf5rz9nHU1 HfHQ== X-Gm-Message-State: AOJu0YyIx9OBDvVunv942w/W8gwUp3ZKuX2bh06Ob/98e/TqF6nUbcFF Mdz1W2G5kwg4Pum2xN2e/53hMhJCckaHbP9Byc0x7wcAsmTidW7ZTXEC6KTXrAjEQ7houA24Nrc JubffFwQ= X-Gm-Gg: ASbGncvF6h5kipaPagqeeCj8GKjPKhyCfBm6L9Bh80DJJqrrCrFRIT9DW4AfTzzbz8v qf3MVrC/XS2fMVSznxI29ApEw1j4l/oAJ1DELmsrM9+CFkAyopQbPd1947dTvhZ0dBpAFhWedRz /JnQy2YbR2DVlO85n2dCgRwAhVYMy4mKOkl5nYeOpEP1AZ8zi4RCeeaipGriN0VhNAAlJg4LZfA 1zcpnrOV/ugl7DQsDHD7t1OYQ0dICSfFS35yFl0il/Fj8hDpwkQCHWwVU5E03eZFfn5VsI8mcC6 QAOnN82lHqPx/ZxwTnPCszO5vs5lLVjvLt6PoN4QyON6AVjie16Agie4MufQXYYeL3qc9MpbgYQ VzCmLdFdXuPu16+24eiE6NRSZeC4GipIGdEvPWLHn4JOSRhm1CvLy6+VoNnKVGRTPqkrdhxFm4K 8dDUwyiJO7TbawwvUXJ3BvySPGdya/mGxSfr0fVQ== X-Google-Smtp-Source: AGHT+IG5JHOXzrKL+0JXSIHFHeDam3JihVGouIEB10YaHN7vHqNZ2Ubuz2hxeOs7vvAJFE0Xbe8A/A== X-Received: by 2002:a17:903:3848:b0:276:76e1:2e84 with SMTP id d9443c01a7336-297e561aa62mr152798655ad.3.1762861666209; Tue, 11 Nov 2025 03:47:46 -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 v2 06/17] hw/riscv: add e-trace message helpers Date: Tue, 11 Nov 2025 08:46:45 -0300 Message-ID: <20251111114656.2285048-7-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::62f; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x62f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861861946158500 Content-Type: text/plain; charset="utf-8" Before making the trace encoder writing into the RAM sink we need a way to encode the messages/packets. The encoding is LSB (least significant bit) based. The doc "Efficient Trace for RISC-V", Chapter 7, mentions: "The remainder of this section describes the contents of the payload portion which should be independent of the infrastructure. In each table, the fields are listed in transmission order: first field in the table is transmitted first, and multi-bit fields are transmitted LSB first." The "RISC-V Trace Control Interface Specification" docs, Chapter 7, states when talking about the Trace RAM Sink: "Trace data is placed in memory in LSB order (first byte of trace packet/data is placed on LSB)." This means that the LSB encoding must be used to write into the RAM Sink memory, which is our goal. The design we're going for is to have all these encoder helpers, along with the message formats, in a separated file. The trace encoder will make use of these helpers to blindly write a byte array with the packet desired, and then write it as is in the RAM Sink. We'll start by modeling the synchronisation packet first, adding more formats as we increment the Trace Encoder capabilities. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/meson.build | 3 +- hw/riscv/rv-trace-messages.c | 94 ++++++++++++++++++++++++++++++++++++ hw/riscv/rv-trace-messages.h | 25 ++++++++++ 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 hw/riscv/rv-trace-messages.c create mode 100644 hw/riscv/rv-trace-messages.h diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index 2aadbe1e50..7d3576fcdf 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -14,6 +14,7 @@ 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',= 'trace-ram-sink.c')) +riscv_ss.add(when: 'CONFIG_RISCV_TRACE', if_true: files('trace-encoder.c', + 'trace-ram-sink.c', 'rv-trace-messages.c')) =20 hw_arch +=3D {'riscv': riscv_ss} diff --git a/hw/riscv/rv-trace-messages.c b/hw/riscv/rv-trace-messages.c new file mode 100644 index 0000000000..215135dd47 --- /dev/null +++ b/hw/riscv/rv-trace-messages.c @@ -0,0 +1,94 @@ +/* + * Helpers for RISC-V Trace Messages + * + * Copyright (C) 2025 Ventana Micro Systems Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" + +#include "rv-trace-messages.h" +#include "qemu/bitops.h" +#include "qemu/log.h" +#include "qemu/module.h" +#include "qapi/error.h" +#include "trace.h" + +typedef struct RVTraceMessageHeader { + uint8_t length:5; + uint8_t flow:2; + uint8_t extend:1; +} RVTraceMessageHeader; +#define HEADER_SIZE 1 + +/* + * Format 3 subformat 0 without 'time' and 'context' fields + */ +typedef struct RVTraceSyncPayload { + uint8_t format:2; + uint8_t subformat:2; + uint8_t branch:1; + uint8_t privilege:3; + uint32_t addressLow; + uint32_t addressHigh; +} RVTraceSyncPayload; +#define SYNC_PAYLOAD_SIZE_64BITS 9 + +static void rv_etrace_write_bits(uint8_t *bytes, uint32_t bit_pos, + uint32_t num_bits, uint32_t val) +{ + uint32_t pos, byte_index, byte_pos, byte_bits =3D 0; + + if (!num_bits || 32 < num_bits) { + return; + } + + for (pos =3D 0; pos < num_bits; pos +=3D byte_bits) { + byte_index =3D (bit_pos + pos) >> 3; + byte_pos =3D (bit_pos + pos) & 0x7; + byte_bits =3D (8 - byte_pos) < (num_bits - pos) ? + (8 - byte_pos) : (num_bits - pos); + bytes[byte_index] &=3D ~(((1U << byte_bits) - 1) << byte_pos); + bytes[byte_index] |=3D ((val >> pos) & ((1U << byte_bits) - 1)) <<= byte_pos; + } +} + +static void rv_etrace_write_header(uint8_t *buf, RVTraceMessageHeader head= er) +{ + /* flow and extend are always zero, i.e just write length */ + rv_etrace_write_bits(buf, 0, 5, header.length); +} + +size_t rv_etrace_gen_encoded_sync_msg(uint8_t *buf, uint64_t pc, + TracePrivLevel priv_level) +{ + RVTraceSyncPayload payload =3D {.format =3D 0b11, + .subformat =3D 0b00, + .branch =3D 1, + .privilege =3D priv_level}; + RVTraceMessageHeader header =3D {.flow =3D 0, .extend =3D 0, + .length =3D SYNC_PAYLOAD_SIZE_64BITS}; + uint8_t bit_pos; + + payload.addressLow =3D extract64(pc, 0, 32); + payload.addressHigh =3D extract64(pc, 32, 32); + + rv_etrace_write_header(buf, header); + bit_pos =3D 8; + + rv_etrace_write_bits(buf, bit_pos, 2, payload.format); + bit_pos +=3D 2; + rv_etrace_write_bits(buf, bit_pos, 2, payload.subformat); + bit_pos +=3D 2; + rv_etrace_write_bits(buf, bit_pos, 1, payload.branch); + bit_pos +=3D 1; + rv_etrace_write_bits(buf, bit_pos, 3, payload.privilege); + bit_pos +=3D 3; + + rv_etrace_write_bits(buf, bit_pos, 32, payload.addressLow); + bit_pos +=3D 32; + rv_etrace_write_bits(buf, bit_pos, 32, payload.addressHigh); + + return HEADER_SIZE + SYNC_PAYLOAD_SIZE_64BITS; +} diff --git a/hw/riscv/rv-trace-messages.h b/hw/riscv/rv-trace-messages.h new file mode 100644 index 0000000000..aeafea8849 --- /dev/null +++ b/hw/riscv/rv-trace-messages.h @@ -0,0 +1,25 @@ +/* + * Helpers for RISC-V Trace Messages + * + * Copyright (C) 2025 Ventana Micro Systems Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef RISCV_RV_TRACE_MESSAGES_H +#define RISCV_RV_TRACE_MESSAGES_H + +typedef enum { + U =3D 0, + S_HS =3D 1, + RESERVED =3D 2, + M =3D 3, + D =3D 4, + VU =3D 5, + VS =3D 6, +} TracePrivLevel; + +size_t rv_etrace_gen_encoded_sync_msg(uint8_t *buf, uint64_t pc, + TracePrivLevel priv_level); + +#endif --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861936; cv=none; d=zohomail.com; s=zohoarc; b=mtgYbrc0gV9O54aRkU/GonO0E5hqgrR5RulhfJ129JemiUscNSgHPZ/CrnaNlPZ2/X6SW9SqVM5eulM4VJhTKtrMRQ9Hv2Z1lbhfsJXsDeerrsla2gD8xbY/+lad8+n8s4V3uKkrabVVXcFBr0WbJHMO17HGCHVERAAJ8O1lMxs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861936; 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=F6peEc+cvY+9s8o6s1hl84CFHAQNCiQ60rb6SsD6LKk=; b=CuD+aNnkHqjPkQNQY51CN8JDR4aeCezRh2rUczbSd3i+Fiqos4XSsiZM3YLIbIqO7dZbtNNtP0cn3A8q07TB4atssS+uPR8tcET/jTwWVcHItxtTF9r0WK2zrKQFNafw0MkVJJINIkLxYd/fEKqAo6e6jWa79FhfL+rWOTMeJug= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17628619360211015.3749936450475; Tue, 11 Nov 2025 03:52:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrL-0006p9-H5; Tue, 11 Nov 2025 06:48:27 -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 1vImqq-0005QI-3h for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:56 -0500 Received: from mail-pg1-x52f.google.com ([2607:f8b0:4864:20::52f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImqo-0004SS-3X for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:47:55 -0500 Received: by mail-pg1-x52f.google.com with SMTP id 41be03b00d2f7-bb7799edea8so1420329a12.3 for ; Tue, 11 Nov 2025 03:47:53 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.47.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:47:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861672; x=1763466472; 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=F6peEc+cvY+9s8o6s1hl84CFHAQNCiQ60rb6SsD6LKk=; b=KGsGFez3zyF+BFn5RY1Doqxd9WiC63L2FuZQJDxvqfEN+A8YazvFCJoOvPrpeRDReA pzxnPphivFajB5WXgR3HI8I7I0ez4fxaO71QzqABlWjjFOAxPGDYKQjA0g1CMSg1NSI1 dxQAFDU7PHFQQXf9/ClCCkAkbLkXgv6pxY25NJXmge7bT1mT2cfkQcydpQ4majIoZBSd PIZw3P6h9tQ7Tt3zzr0T1ffxtO7MpDA/K2+nWuT2qedQuUhVVUJwfKT6SiyI+ewARo+1 lG8oEpn9rTkkx2YnXSPdfuaNf1WtCdgSjyNoHAyLWHcVJAbjuoCEyxzqLkxN84kmHZN7 /u7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861672; x=1763466472; 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=F6peEc+cvY+9s8o6s1hl84CFHAQNCiQ60rb6SsD6LKk=; b=B/mLXC98RFQP6XsbFONacX3GBd96v6bjqktrHXtkOnAY8z01Np7WQSyknYoXbDL7RM U0ndfduCCMnTNsK0Bs3C1EgVZ35nTpeDVqV3prWVC4cye4NJ2XUzkYbgmaQYsTWX4Bp6 /hFHaZZrci8BslujH+uFj/SufpLYlrPeTE2Dw7oG9Ffc58usDbzbjzkH4WS5qiiMv30V 79yMqOksKADF+y9w4HtCh4/UtNEiYgieGA98+dq+7oEgDlLCjhyj0n7Qj4pu03dZrWx5 EfRIL6PNXikTgVfZroAoJRLpyb5NaBWAZ2hlMKEXgQdspSyhb2YU1qVA5BFKC5lG6Uyo QvWg== X-Gm-Message-State: AOJu0YzENC3ad4wj8s+uTWFtXJ6k3coSNJWsRrDixwociFVVCuO7il6K ppUNJSU6aMkFwv/7/Se5KrO2SwG6AcltL7G8mLv3eh/6bI5/rq0nRsD3HIUuT8kIuebq0xMQIKT pLKb3cjE= X-Gm-Gg: ASbGncvJ5Uv4YgtW0/x9yVzgsYGcK+FOoAEAzyDDobvXw6SFHnRDrCl4v6j7Knfsjb1 XOj2CInGSpses8Qzv+HSGADWL0J67dLG/oB4MGTryTgotmBiTuOTMJCa1vWoX2Q2ZM50svpgLBt rM81VAOJbk/cM+rFHWRbW70Pi2Bq66//x/bi6FxCSLA1p/bNpoSzRDLr5sn/jXYgbLTU4Z8PNxC nAWaie1wITRwTTBlpioKe+guBo8nkxlC7pUYN4+5JoAADcm5JkUO5xL5k+d5FsuDqQA4zM7dZxI VfedFJHkKYH5/BGETYIwpOY6Noi69p8uADc5tw6wSFMX1qj2DCahtSD2WLoxwKz8MxKR95LJocK lZ8vgfNoH4YholhUjn8EA3Xr0r36gGQARFPI98q3dLFAgxbahkwG1E+zAV8YjkJsOhhqsBwsIqC 8Ryif6R4QyE1H68nL05xvaGM36cT4WPCthv3YbBA== X-Google-Smtp-Source: AGHT+IHWM85KBJdxBlBTt0IYWzDZZHKzXWTt6GLyaw6DcqI4HMB/wG5bkBsS8JWBvBl6Np4r1ubS0w== X-Received: by 2002:a17:903:38cd:b0:295:fdf2:d01e with SMTP id d9443c01a7336-297e53e7d10mr157776765ad.2.1762861672332; Tue, 11 Nov 2025 03:47:52 -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 v2 07/17] target/riscv: add initial trace instrumentation Date: Tue, 11 Nov 2025 08:46:46 -0300 Message-ID: <20251111114656.2285048-8-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::52f; envelope-from=dbarboza@ventanamicro.com; helo=mail-pg1-x52f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861937269158500 Content-Type: text/plain; charset="utf-8" We'll have to instrument some RISC-V translations, as well as the start of a translation block, communicating with the associated trace encoder in case we're running a trace session. The trace encoder needs to report the first insn of the session so we'll start with that. Unfortunately we've run out of bits in tb_flags, meaning we can't use riscv_tr_init_disas_context() and riscv_get_tb_cpu_state() to communicate whether we're running a trace session. One alternative would be to fold the "trace is running" logic in each trace helper. That would make all code paths, regardless of even having a trace encoder associated with the CPU, to check for trace encoder existence. Another alternative, which is implemented here, is to add an additional mirror flag 'trace_running' in CPURISCVState and turn it into a TCG global 'cpu_trace_running'. Each trace helper call is gated via this global, allowing us to skip calling trace helpers when we're not running a trace session. In case we end up increasing the size of tb_flags in the future we should revisit this code and use tb_flags instead. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/trace-encoder.c | 17 +++++++++++++++++ hw/riscv/trace-encoder.h | 4 ++++ hw/riscv/trace-events | 1 + target/riscv/cpu.h | 2 ++ target/riscv/helper.h | 4 ++++ target/riscv/meson.build | 3 ++- target/riscv/trace_helper.c | 36 ++++++++++++++++++++++++++++++++++++ target/riscv/translate.c | 10 ++++++++++ 8 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 target/riscv/trace_helper.c diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index d45e45d17e..9701ce43cf 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -150,11 +150,15 @@ static void trencoder_te_ctrl_postw(RegisterInfo *reg= , uint64_t val) uint32_t trTeEnable =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, ENAB= LE); uint32_t trTeInstTracing =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, INST_TRACING); + RISCVCPU *cpu =3D te->cpu; + CPURISCVState *env =3D &cpu->env; =20 if (!trTeActive) { te->enabled =3D false; te->trace_running =3D false; te->trace_next_insn =3D false; + + env->trace_running =3D false; return; } =20 @@ -170,6 +174,7 @@ static void trencoder_te_ctrl_postw(RegisterInfo *reg, = uint64_t val) } =20 te->trace_running =3D trTeInstTracing ? true : false; + env->trace_running =3D te->trace_running; } =20 static RegisterAccessInfo trencoder_regs_info[] =3D { @@ -231,6 +236,8 @@ static const MemoryRegionOps trencoder_ops =3D { static void trencoder_reset(DeviceState *dev) { TraceEncoder *te =3D TRACE_ENCODER(dev); + RISCVCPU *cpu =3D te->cpu; + CPURISCVState *env =3D &cpu->env; =20 for (int i =3D 0; i < ARRAY_SIZE(te->regs_info); i++) { register_reset(&te->regs_info[i]); @@ -239,6 +246,7 @@ static void trencoder_reset(DeviceState *dev) te->enabled =3D false; te->trace_running =3D false; te->trace_next_insn =3D false; + env->trace_running =3D false; } =20 static void trencoder_realize(DeviceState *dev, Error **errp) @@ -266,6 +274,14 @@ static void trencoder_realize(DeviceState *dev, Error = **errp) } } =20 +void trencoder_set_first_trace_insn(Object *trencoder_obj, uint64_t pc) +{ + TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); + + trencoder->first_pc =3D pc; + trace_trencoder_first_trace_insn(pc); +} + static const Property trencoder_props[] =3D { /* * We need a link to the associated CPU to @@ -294,6 +310,7 @@ static const VMStateDescription vmstate_trencoder =3D { VMSTATE_UINT64(ramsink_ramstart, TraceEncoder), VMSTATE_UINT64(ramsink_ramlimit, TraceEncoder), VMSTATE_INT32(cpu_id, TraceEncoder), + VMSTATE_UINT64(first_pc, TraceEncoder), VMSTATE_END_OF_LIST(), } }; diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h index 001d872514..cf3177aefe 100644 --- a/hw/riscv/trace-encoder.h +++ b/hw/riscv/trace-encoder.h @@ -27,6 +27,8 @@ struct TraceEncoder { MemoryRegion reg_mem; uint32_t reg_mem_size; =20 + uint64_t first_pc; + hwaddr baseaddr; hwaddr dest_baseaddr; hwaddr ramsink_ramstart; @@ -43,4 +45,6 @@ struct TraceEncoder { =20 OBJECT_DECLARE_SIMPLE_TYPE(TraceEncoder, TRACE_ENCODER) =20 +void trencoder_set_first_trace_insn(Object *trencoder_obj, uint64_t pc); + #endif diff --git a/hw/riscv/trace-events b/hw/riscv/trace-events index 14e333fd9e..dc25377acf 100644 --- a/hw/riscv/trace-events +++ b/hw/riscv/trace-events @@ -28,6 +28,7 @@ riscv_iommu_hpm_evt_write(uint32_t ctr_idx, uint32_t ovf,= uint64_t val) "ctr_idx # 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 +trencoder_first_trace_insn(uint64_t pc) "pc 0x%" PRIx64 =20 # trace-ram-sink.c tr_ramsink_read_error(uint64_t addr) "addr 0x%" PRIx64 diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 12251e4d94..16c6c280a8 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -514,6 +514,8 @@ struct CPUArchState { target_ulong rnmip; uint64_t rnmi_irqvec; uint64_t rnmi_excpvec; + + bool trace_running; }; =20 /* diff --git a/target/riscv/helper.h b/target/riscv/helper.h index b785456ee0..e80320ad16 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -128,6 +128,10 @@ DEF_HELPER_4(csrrw, tl, env, int, tl, tl) DEF_HELPER_2(csrr_i128, tl, env, int) DEF_HELPER_4(csrw_i128, void, env, int, tl, tl) DEF_HELPER_6(csrrw_i128, tl, env, int, tl, tl, tl, tl) + +/* Trace helpers (should be put inside ifdef) */ +DEF_HELPER_2(trace_insn, void, env, i64) + #ifndef CONFIG_USER_ONLY DEF_HELPER_1(sret, tl, env) DEF_HELPER_1(mret, tl, env) diff --git a/target/riscv/meson.build b/target/riscv/meson.build index fdefe88ccd..564e2da5f2 100644 --- a/target/riscv/meson.build +++ b/target/riscv/meson.build @@ -26,7 +26,8 @@ riscv_ss.add(files( 'm128_helper.c', 'crypto_helper.c', 'zce_helper.c', - 'vcrypto_helper.c' + 'vcrypto_helper.c', + 'trace_helper.c' )) =20 riscv_system_ss =3D ss.source_set() diff --git a/target/riscv/trace_helper.c b/target/riscv/trace_helper.c new file mode 100644 index 0000000000..ed84e6f79a --- /dev/null +++ b/target/riscv/trace_helper.c @@ -0,0 +1,36 @@ +/* + * RISC-V Trace Support TCG helpers + * + * Copyright (C) 2025 Ventana Micro Systems Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qapi/error.h" +#include "cpu.h" +#include "trace.h" +#include "exec/helper-proto.h" + +#ifndef CONFIG_USER_ONLY +#include "hw/riscv/trace-encoder.h" +#endif + +#ifndef CONFIG_USER_ONLY +void helper_trace_insn(CPURISCVState *env, uint64_t pc) +{ + RISCVCPU *cpu =3D env_archcpu(env); + TraceEncoder *te =3D TRACE_ENCODER(cpu->trencoder); + + if (te->trace_next_insn) { + trencoder_set_first_trace_insn(cpu->trencoder, pc); + te->trace_next_insn =3D false; + } +} +#else /* #ifndef CONFIG_USER_ONLY */ +void helper_trace_insn(CPURISCVState *env, uint64_t pc) +{ + return; +} +#endif /* #ifndef CONFIG_USER_ONLY*/ diff --git a/target/riscv/translate.c b/target/riscv/translate.c index e1f4dc5ffd..ff288051e3 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -43,6 +43,9 @@ static TCGv_i64 cpu_fpr[32]; /* assume F and D extensions= */ static TCGv load_res; static TCGv load_val; =20 +/* TODO: this should be a tb_flag instead of a global */ +static TCGv cpu_trace_running; + /* * If an operation is being performed on less than TARGET_LONG_BITS, * it may require the inputs to be sign- or zero-extended; which will @@ -1340,6 +1343,11 @@ static void riscv_tr_init_disas_context(DisasContext= Base *dcbase, CPUState *cs) =20 static void riscv_tr_tb_start(DisasContextBase *db, CPUState *cpu) { + TCGLabel *skip =3D gen_new_label(); + + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_trace_running, 0, skip); + gen_helper_trace_insn(tcg_env, tcg_constant_i64(db->pc_first)); + gen_set_label(skip); } =20 static void riscv_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu) @@ -1464,4 +1472,6 @@ void riscv_translate_init(void) "load_res"); load_val =3D tcg_global_mem_new(tcg_env, offsetof(CPURISCVState, load_= val), "load_val"); + cpu_trace_running =3D tcg_global_mem_new(tcg_env, + offsetof(CPURISCVState, trace_running), "trace_running"); } --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861818; cv=none; d=zohomail.com; s=zohoarc; b=i+M3XzSn9NhIUb6yIwTGSmrP2caJPpt5cDzKLHFFWD4tU2x4Tlw5Y+kiT6qCVcWVPFPtWQzszjE1jTHucuY8MOM2fEmmS6M7cvvS8BW3NF6H0ExAj1RhkqxVJNPgqvoSPrJbu+CUiPHAo/PQCZgq+Kej5T9JPn5aif4T94yegss= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861818; 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=Crky1vMWebfz9/HpBtY7DyZt1iGNX1EI7tQZJybiMs0=; b=C4NY7ZnuqCR4S19WyvzJn7CnNzV5AUsloge/9NFCj3uKzd2d1sSZpVXjohm+alfWpcx+SSVnjGoxdEec/AlQjtNquTZRLUhDaqMjjz7iAr3DLKVFw2ZXPyE84eikHNTvfP8uXatFB+2p0RP14i//2Mn9eRKaopSQrNhoEUADZo8= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861818293564.8991355832906; Tue, 11 Nov 2025 03:50:18 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrQ-00072W-5W; Tue, 11 Nov 2025 06:48:32 -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 1vImqx-0005qP-1G for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:03 -0500 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImqu-0004TQ-7u for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:02 -0500 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-297ef378069so27478865ad.3 for ; Tue, 11 Nov 2025 03:47:59 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.47.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:47:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861678; x=1763466478; 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=Crky1vMWebfz9/HpBtY7DyZt1iGNX1EI7tQZJybiMs0=; b=B1O7affPNw1IdH70yCFzKV98xKduweUnHhVjOfpoY92rt5hSm1jbiSlKHtSVrcJd13 hxB8tiaIhEhvHrhDk9O4DFN+UWEv5mgg8jGVpB+p0Mk+K7FeCvMRxcTXQixa0gA/eRwZ pls0IAmaP+nT4JJ+wtu5IwIeY4P403xLZmEVcTKOHgWJ6/az58izVjPtYHQ+87d/+58F 1Cl/FQAbqjQcXSiZnDXte3kIx34110lLSO09oAUM1sIc3g9j6RXuzh8rFeI8Dj6cUn7D Kn3f+2zaHG03yGdeIQ57UA7LHTHdLdHzY27MT39K0EkkkLfTjcoJ99C2K0oyfdVD/AyM meCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861678; x=1763466478; 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=Crky1vMWebfz9/HpBtY7DyZt1iGNX1EI7tQZJybiMs0=; b=K2ueGqNwIA2Vcryk/fGBtV5g2q1VWKpzq5aKv1IbZocdeGZIV8Te/5flprjDpCXkO+ +vjk/jsHrF1fHR/tO2gmPHM353dEokkZ9nND9V/WdDxRCpNLbPEJ0F+eyipyL3M2N682 9e6nQo6MqwnT5HNRbKA/YI2DtyUBGraPtG1vLxj3NH0knYsSjUJqd0KzBksR9Qm4nZG7 ErL57j5nC7Cia0WayrmxyqOrwPA30nQY/hF3lnMff6bA88119QTiSWoP+oWgZ1Eombrd 9EfQ0aBiqSPBb4dQjiuN1Gx5tULizDw0l53hITTZkJtnzZty3IkEsdD3EJambiargC5U oAcw== X-Gm-Message-State: AOJu0YzJFp0DKLf0CRCvCPP36J+KsJU4TC1ebomDsXdkMozpEgG/4Wjd NAQmHSZskDjgCkjvIf4ownbYHgOP086vSnz9AN5iM0LHshOBzMdD1xcm/4q3OQ/w2U+tKSZlbKH AF6GdmS8= X-Gm-Gg: ASbGnctIV9IqV8BCWPsdOKwLck5oDfxyW84g0PgbOHqHvDpwnj9gzerWuJ3Rfh5db0I BxYujELnkVojyC2iQQgp06QUFR1ADJRADOfmenw8viQ7S/De6yelr63XYGtwFitNWgLsv0yUut3 ZSZ0ilNB2MX2T3IlOvdFLSF5vEY7TutfmJLKH9iffmhEstGo8vpQ0w8UBn8iQcZQfnBHZzltNKy E0UrVuDGv+SARD6eoKYKLPayPZpFPcNiGSgMRARIHKH1drE37buMiDN8feY/xa3gx7k/odY5Vu0 HYTobE9e8W+RGhC6pjmoLBqf5zWoOms67bRdVqkldNj9S6WSMEKFNPwcJQzpulQWxv/R1+l86PD hnZGUIZIknbUnox2fiGje8Zs3lKTKt3zT/zM73DoyPDAjZgE+K9Lfn14MOkKZgzZK0UqBNVA/DV QqgRs/3c5YzD4c6ceHL4vQqA40FGbUadwtqFenVg== X-Google-Smtp-Source: AGHT+IGhdsaHcNXvikuXvh9SGUlxeZRWVCPepvZWhYs9PN9EOE3dVtqxPONvNZSA/C3T39DFN9YIrw== X-Received: by 2002:a17:903:ac6:b0:294:ccc6:cd30 with SMTP id d9443c01a7336-297e56223aemr158656905ad.17.1762861678443; Tue, 11 Nov 2025 03:47:58 -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 v2 08/17] hw/riscv/trace-encoder: write e-trace packets to RAM sink Date: Tue, 11 Nov 2025 08:46:47 -0300 Message-ID: <20251111114656.2285048-9-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::62b; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x62b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861819426158500 Content-Type: text/plain; charset="utf-8" We have the needed pieces to make the trace encoder write messages (or packets, in e-trace lingo) in its associated RAM sink. We'll start by writing a sync message that we're already able to fetch from the TCG instruction train. The trace encoder must be able to read/write TR_RAM_WP RAM sink regs to know where it is supposed to write packets, thus a handful of helpers are added to manipulate both the ram sink SMEM memory and relevant registers. The bulk of the work is done in trencoder_send_message_smem() where the trace encoder writes each trace packet. The 'wrap' mechanism is implemented to keep writing the RAM sink memory even after a SMEM workflow. If we can't fit a full packet in the end of the ring buffer we're filling with NULLs and writing a new packet back to ramstart. In an overflow event we'll wrap the TR_RAM_WP_LOW WRAP bit and userspace is supposed to clear it after the wrapping was handled (i.e. userspace read the whole ring buffer back to the start). We're also allowing userspace to freely set ramsink and ramstart before the trace session begins, allowing for more freedom w.r.t where the SMEM will be written by the encoder. Note that this also means that userspace is responsible for setting at least TR_RAM_WP_LOW and TR_RAM_WP_HIGH before starting a trace session. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/trace-encoder.c | 121 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 9701ce43cf..16c9475d46 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -20,6 +20,34 @@ #include "system/device_tree.h" #include "hw/register.h" #include "cpu.h" +#include "hw/riscv/trace-ram-sink.h" +#include "rv-trace-messages.h" + +/* + * Size of header + payload since we're not sending + * srcID and timestamp. + */ +#define TRACE_MSG_MAX_SIZE 32 + +static TracePrivLevel trencoder_get_curr_priv_level(TraceEncoder *te) +{ + CPURISCVState *env =3D &te->cpu->env; + + switch (env->priv) { + case PRV_U: + return env->virt_enabled ? VU : U; + case PRV_S: + return env->virt_enabled ? VS : S_HS; + case PRV_M: + return M; + } + + /* + * Return a reserved value to signal an error. + * TODO: handle Debug (D). + */ + return RESERVED; +} =20 /* * trTeControl register fields @@ -82,6 +110,41 @@ REG32(TR_TE_IMPL, 0x4) REG32(TR_TE_INST_FEATURES, 0x8) FIELD(TR_TE_INST_FEATURES, NO_ADDR_DIFF, 0, 1) =20 +static uint32_t trencoder_read_reg(TraceEncoder *te, uint32_t reg_addr) +{ + hwaddr addr =3D te->dest_baseaddr + reg_addr; + uint32_t val; + + cpu_physical_memory_read(addr, &val, sizeof(uint32_t)); + return val; +} + +static void trencoder_write_reg(TraceEncoder *te, uint32_t reg_addr, + uint32_t val) +{ + hwaddr addr =3D te->dest_baseaddr + reg_addr; + + cpu_physical_memory_write(addr, &val, sizeof(uint32_t)); +} + +static hwaddr trencoder_read_ramsink_writep(TraceEncoder *te) +{ + hwaddr ret =3D trencoder_read_reg(te, A_TR_RAM_WP_HIGH); + ret <<=3D 32; + ret +=3D trencoder_read_reg(te, A_TR_RAM_WP_LOW); + + return ret; +} + +static hwaddr trencoder_read_ramsink_ramlimit(TraceEncoder *te) +{ + hwaddr ret =3D trencoder_read_reg(te, A_TR_RAM_LIMIT_HIGH); + ret <<=3D 32; + ret +=3D trencoder_read_reg(te, A_TR_RAM_LIMIT_LOW); + + return ret; +} + static uint64_t trencoder_te_ctrl_set_hardwire_vals(uint64_t input) { input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_MODE, 0x6); @@ -171,6 +234,9 @@ static void trencoder_te_ctrl_postw(RegisterInfo *reg, = uint64_t val) if (!te->trace_running && trTeInstTracing) { /* Starting trace. Ask the CPU for the first trace insn */ te->trace_next_insn =3D true; + + te->ramsink_ramstart =3D trencoder_read_ramsink_writep(te); + te->ramsink_ramlimit =3D trencoder_read_ramsink_ramlimit(te); } =20 te->trace_running =3D trTeInstTracing ? true : false; @@ -274,12 +340,67 @@ static void trencoder_realize(DeviceState *dev, Error= **errp) } } =20 +static void trencoder_update_ramsink_writep(TraceEncoder *te, + hwaddr wp_val, + bool wrapped) +{ + uint32_t wp_low =3D trencoder_read_reg(te, A_TR_RAM_WP_LOW); + + wp_low =3D FIELD_DP32(wp_low, TR_RAM_WP_LOW, ADDR, + extract64(wp_val, 2, 30)); + + if (wrapped) { + wp_low =3D FIELD_DP32(wp_low, TR_RAM_WP_LOW, WRAP, 1); + } + + trencoder_write_reg(te, A_TR_RAM_WP_LOW, wp_low); + trencoder_write_reg(te, A_TR_RAM_WP_HIGH, extract64(wp_val, 32, 32)); +} + +static void trencoder_send_message_smem(TraceEncoder *trencoder, + uint8_t *msg, uint8_t msg_size) +{ + hwaddr dest =3D trencoder_read_ramsink_writep(trencoder); + bool wrapped =3D false; + + msg_size =3D QEMU_ALIGN_UP(msg_size, 4); + + /* clear trRamWrap before writing to SMEM */ + dest =3D FIELD_DP64(dest, TR_RAM_WP_LOW, WRAP, 0); + + /* + * Fill with null bytes if we can't fit the packet in + * ramlimit, set wrap and write the packet in ramstart. + */ + if (dest + msg_size > trencoder->ramsink_ramlimit) { + g_autofree uint8_t *null_packet =3D NULL; + uint8_t null_size =3D trencoder->ramsink_ramlimit - dest; + + null_packet =3D g_malloc0(null_size); + cpu_physical_memory_write(dest, null_packet, null_size); + + dest =3D trencoder->ramsink_ramstart; + wrapped =3D true; + } + + cpu_physical_memory_write(dest, msg, msg_size); + dest +=3D msg_size; + + trencoder_update_ramsink_writep(trencoder, dest, wrapped); +} + void trencoder_set_first_trace_insn(Object *trencoder_obj, uint64_t pc) { TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); + TracePrivLevel priv =3D trencoder_get_curr_priv_level(trencoder); + g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); + uint8_t msg_size; =20 trencoder->first_pc =3D pc; trace_trencoder_first_trace_insn(pc); + msg_size =3D rv_etrace_gen_encoded_sync_msg(msg, pc, priv); + + trencoder_send_message_smem(trencoder, msg, msg_size); } =20 static const Property trencoder_props[] =3D { --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861859; cv=none; d=zohomail.com; s=zohoarc; b=RXD3OsNksmd04zWRJNue14ymiE0pQTrUwuJ4nNkDNMPw3ZcbfSvY4nDAxikbqGQwR+8ehIHvEo2eG6jlbTpi6mqyW1e/IUleX5eTI605rsc7EQv3nJRdmtIe9pgGwWhMDws/+N3r5bs+E6E6Hli77cQ2u1CH/RkjUtPC7LymPq8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861859; 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=lGpZjE7tpDNSik0V3pZhxubMyG3kWmXqewOoOV3rCEU=; b=Ua7YRrVgqmJitwz+2w26R51hN3qTyUDwl6cfLBX5URMzsy8gc1yLuTebPA+bT7UL/jFc6wgkibRlSzIptdUIBPcqXpBfKCKJs4JEs0wrDrXwJ58Z4JimQt3/713TxoWT7+mngUpW7brTHqyJHlt/oktTQ4MfvWmTcvFyih7rRXw= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861859970269.90445961837804; Tue, 11 Nov 2025 03:50:59 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrO-0006ye-CY; Tue, 11 Nov 2025 06:48:30 -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 1vImr2-0006AX-76 for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:08 -0500 Received: from mail-pg1-x536.google.com ([2607:f8b0:4864:20::536]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImr0-0004UC-H9 for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:07 -0500 Received: by mail-pg1-x536.google.com with SMTP id 41be03b00d2f7-ba599137cf7so3193877a12.0 for ; Tue, 11 Nov 2025 03:48:06 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.47.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:48:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861684; x=1763466484; 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=lGpZjE7tpDNSik0V3pZhxubMyG3kWmXqewOoOV3rCEU=; b=IP/hMKKoIHfpVIwrX32BJfSApjm7kUo458imGn3q/XI4DdstDahEAxm4tE8AZvytGu 3VYMn+a1CN8bGNbPGQBHTezmemtjtee5L1ZU3Gf90Y1JuyBdMwQMhBULjh+EPb7zUCc3 DEihXOmudxTDbKYD4Td9PSCAIhOY/OE+4tYZNt2J+pMYF5qfLlmFs5U3wzF9HTP68JmH +GMu37Iy5l3nqP7utbGKB44e4zf8ztZdRSmKkBT3Qlf5aH2Wy02MDZrHTCUYyhjAoI9P Cv+6/aH8bJXI47bSk0MZnPs6/PYPZeN/HvqLWip5rhMQMQcX/SPgQs26IcWjcUxQ98ll kazg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861684; x=1763466484; 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=lGpZjE7tpDNSik0V3pZhxubMyG3kWmXqewOoOV3rCEU=; b=nkdwDFXZp/fiL5Qtcj8HJl9eZiVzSUHbSNk5zdaa1hQ9ie9pp/eXZbuxRNvo/fmA4f t8Q+p9dxmAdaXglz7MOlaXZQ/FHCVwH498GGr0OQZ49+6R5lkGvFWv0DMS3fOliUZpCY 61EOKFuvdUmLOrgY1PGmHn/eNry1LeMKDvUi4EiS8BsEc4kkMxcb4s2jKYLM/VaO3GQL mCG5i1QS1wE0c/jVBv228Y5xjSjZp85vMRU82McAWAbszsetlWOGlPCbW6yIraIab7lk KUQiwahnvZx3buoBAfwW3vYzGcHVLMuQ+HUEkDqLHOQLxzarIfeJSfJs3cNTrpRDeqv5 jx0Q== X-Gm-Message-State: AOJu0YzpTLNAz0tB84FDZlzt4jsvZ6I7ExWVYHCFyn+Ilk3pDjJ2YzHH BwR0RR+QZXHBpfcCQyroDm5VY20RDYBLr/9oHsmOwafNwF6LOwP5TJ6I79jRLqjlBzjd2Qt/xvM z5dETJZ4= X-Gm-Gg: ASbGncs5NM4g6stipLZ/ZqimssNwXM4wVuB49Bq8YNGth6W9mEjSQknNU/z0r3ObnvD l3SD4AncXew+LiTtrmsg1tae60iFUiIsYIWA1fs3Fp9YrA8pU6AFpzDtrYe0oj3ItDBFOT7bwh4 FB96qb5yt0xJTHBxXawlTizw8DlOamCR/kD0fMJDi+WZNEbogz00uMDj1rLGs9W/83HgqnhTEe+ WSOpVU7SyQa6PhQRn63/KbLtNILqv7Y6p5hUWxijQM+ToQGi3lSPlMG7NqBxDuoYX+FMnXy48V6 PQjGJTogL4x8vj6kZXtjBnnJ/7Y86D+swE+QqpzPoQLphgCDilDrs5AEhLjpUcy+kGu7NkOevkq JwxlEaBQ9ZbZ0fXDu8tWmJvrjdIeoZESOVImfe6ziloiL0ukzUaZnbOz1WqMT4fY03ygxAosi7Y r6EhhiK9QuRCau5OjmdkaP4CcBd7o1lVnkgffIaw== X-Google-Smtp-Source: AGHT+IFpJPgOH6VIuE7Icw/ZGRDew6iC/mNVa/DNRvRhDwelg+rp5tk9zGufpenYMAEg/x6a3DI+Og== X-Received: by 2002:a17:902:cf04:b0:296:5e6b:e1c8 with SMTP id d9443c01a7336-297e5606ec8mr154168655ad.13.1762861684544; Tue, 11 Nov 2025 03:48:04 -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 v2 09/17] test/qtest: add riscv-trace-test.c Date: Tue, 11 Nov 2025 08:46:48 -0300 Message-ID: <20251111114656.2285048-10-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::536; envelope-from=dbarboza@ventanamicro.com; helo=mail-pg1-x536.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861861932158501 Content-Type: text/plain; charset="utf-8" Add a simple smoke test for the trace encoder/trace ram sink integration with the RISC-V 'virt' machine. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/virt.c | 2 +- tests/qtest/meson.build | 2 +- tests/qtest/riscv-trace-test.c | 120 +++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 tests/qtest/riscv-trace-test.c diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 30e89a6c5a..fe49b1eda2 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1711,7 +1711,7 @@ static void virt_machine_init(MachineState *machine) hart_count, &error_abort); sysbus_realize(SYS_BUS_DEVICE(&s->soc[i]), &error_fatal); =20 - if (tcg_enabled()) { + if (tcg_enabled() || qtest_enabled()) { virt_init_socket_trace_hw(s, i); } =20 diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index 669d07c06b..07663c4836 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -281,7 +281,7 @@ qtests_s390x =3D \ qtests_riscv32 =3D \ (config_all_devices.has_key('CONFIG_SIFIVE_E_AON') ? ['sifive-e-aon-watc= hdog-test'] : []) =20 -qtests_riscv64 =3D ['riscv-csr-test'] + \ +qtests_riscv64 =3D ['riscv-csr-test', 'riscv-trace-test'] + \ (unpack_edk2_blobs ? ['bios-tables-test'] : []) =20 qos_test_ss =3D ss.source_set() diff --git a/tests/qtest/riscv-trace-test.c b/tests/qtest/riscv-trace-test.c new file mode 100644 index 0000000000..e442f69286 --- /dev/null +++ b/tests/qtest/riscv-trace-test.c @@ -0,0 +1,120 @@ +/* + * Testcase for RISC-V Trace framework + * + * Copyright (C) 2025 Ventana Micro Systems Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" + +#include "qemu/timer.h" +#include "qemu/bitops.h" +#include "libqtest.h" +#include "hw/registerfields.h" + +/* taken from virt machine memmap */ +#define TE_BASE 0x3020000 +#define TRAM_BASE 0x6000000 + +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) + +REG32(TR_RAM_START_LOW, 0x010) + FIELD(TR_RAM_START_LOW, ADDR, 0, 32) +REG32(TR_RAM_START_HIGH, 0x014) + FIELD(TR_RAM_START_HIGH, ADDR, 0, 32) + +REG32(TR_RAM_LIMIT_LOW, 0x018) + FIELD(TR_RAM_LIMIT_LOW, ADDR, 0, 32) +REG32(TR_RAM_LIMIT_HIGH, 0x01C) + FIELD(TR_RAM_LIMIT_HIGH, ADDR, 0, 32) + +REG32(TR_RAM_WP_LOW, 0x020) + FIELD(TR_RAM_WP_LOW, WRAP, 0, 1) + FIELD(TR_RAM_WP_LOW, ADDR, 0, 32) +REG32(TR_RAM_WP_HIGH, 0x024) + FIELD(TR_RAM_WP_HIGH, ADDR, 0, 32) + +static uint32_t test_read_te_control(QTestState *qts) +{ + return qtest_readl(qts, TE_BASE + A_TR_TE_CONTROL); +} + +static void test_write_te_control(QTestState *qts, uint32_t val) +{ + qtest_writel(qts, TE_BASE + A_TR_TE_CONTROL, val); +} + +static uint64_t test_read_tram_ramstart(QTestState *qts) +{ + uint64_t reg =3D qtest_readl(qts, TRAM_BASE + A_TR_RAM_START_HIGH); + + reg <<=3D 32; + reg +=3D qtest_readl(qts, TRAM_BASE + A_TR_RAM_START_LOW); + return reg; +} + +static uint64_t test_read_tram_writep(QTestState *qts) +{ + uint64_t reg =3D qtest_readl(qts, TRAM_BASE + A_TR_RAM_WP_HIGH); + + reg <<=3D 32; + reg +=3D qtest_readl(qts, TRAM_BASE + A_TR_RAM_WP_LOW); + return reg; +} + +static void test_trace_simple(void) +{ + QTestState *qts =3D qtest_init("-machine virt -accel tcg"); + double timeout_sec =3D 0.5; + uint64_t reg_tram_start, reg_tram_writep; + uint32_t reg; + + reg =3D test_read_te_control(qts); + reg =3D FIELD_DP32(reg, TR_TE_CONTROL, ACTIVE, 1); + test_write_te_control(qts, reg); + reg =3D test_read_te_control(qts); + g_assert(1 =3D=3D FIELD_EX32(reg, TR_TE_CONTROL, ACTIVE)); + + reg =3D FIELD_DP32(reg, TR_TE_CONTROL, ENABLE, 1); + test_write_te_control(qts, reg); + reg =3D test_read_te_control(qts); + g_assert(1 =3D=3D FIELD_EX32(reg, TR_TE_CONTROL, ENABLE)); + + /* + * Verify if RAM Sink write pointer is equal to + * ramstart before start tracing. + */ + reg_tram_start =3D test_read_tram_ramstart(qts); + g_assert(reg_tram_start > 0); + reg_tram_writep =3D test_read_tram_writep(qts); + g_assert(reg_tram_writep =3D=3D reg_tram_start); + + reg =3D FIELD_DP32(reg, TR_TE_CONTROL, INST_TRACING, 1); + test_write_te_control(qts, reg); + reg =3D test_read_te_control(qts); + g_assert(1 =3D=3D FIELD_EX32(reg, TR_TE_CONTROL, INST_TRACING)); + + g_test_timer_start(); + for (;;) { + reg_tram_writep =3D test_read_tram_writep(qts); + if (reg_tram_writep > reg_tram_start) { + break; + } + + g_assert(g_test_timer_elapsed() <=3D timeout_sec); + } + + qtest_quit(qts); +} + +int main(int argc, char *argv[]) +{ + g_test_init(&argc, &argv, NULL); + qtest_add_func("/riscv-trace-test/test-trace-simple", + test_trace_simple); + return g_test_run(); +} --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861733; cv=none; d=zohomail.com; s=zohoarc; b=EhKHVYeAiOhfVHfCtw4fSk3A/85OxctUbPrp2YCdr3+sPlb2VB3Iv7Trw9YrdoImPG0R6QzTrqrWPHn200UhvXKDr20/vb1uFSlz0D4yKFqn/XVSYVKrCYU9e6y6+gCvlmUKP8oFmVizSL37o+2KEIIITOUlkx7H434c5Vvw+dI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861733; 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=bXaEMY5hrHceg93Rc9uvQovZc6dicIgVI/u0fM+HVTE=; b=CuRrAMIODcWnSLBvRHjFto4fWtXirruVlNp+KoQA66OXbcOCPAhU4HI73klK3ZCmo3+TPGLO1JVJV0yL31ev2f4VuUoSIUWATWM4qzFLpxVPW0lxaiOLaYOehP+h1wB2UkxWgoBYaCCoGck364vp7nwqqKeVlf5Emqf8nluG1us= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861733496558.0311980159513; Tue, 11 Nov 2025 03:48:53 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrW-0007Hk-W8; Tue, 11 Nov 2025 06:48:39 -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 1vImr8-0006Lf-2y for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:14 -0500 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImr6-0004Ux-9E for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:13 -0500 Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-29806bd47b5so14736375ad.3 for ; Tue, 11 Nov 2025 03:48:11 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.48.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:48:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861691; x=1763466491; 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=bXaEMY5hrHceg93Rc9uvQovZc6dicIgVI/u0fM+HVTE=; b=SF+waTqO31Nt3UQCswda7R3S/tglTGg77Aa+tirCjaBDFYy8qKidRGy+fhX6kRQczi uJ9RwfL/Hesp86JUiGXAL/ADCz3XUSTpS83/8f1+UB+kAf83q6ZGdAgTCdeQfqZMRTr+ 6vzDn3Cf6aIbWYTJ5jW9yp0BEs48t8563LmHU9I78tmh093ybS3MEi3qycrpfz68V3bj BTcwbpAvpOYUrtNscaxjYnbHDOElLRDdXZFZI9bzLB4N46fUnyU3ejM1jGh16J0tDPXP uklsKG7s/udYqODU7LMHmmljZwUFArRzBwhjyxTCOv3mWgsB/vkvzLVIr307RB3+cZxN nH4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861691; x=1763466491; 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=bXaEMY5hrHceg93Rc9uvQovZc6dicIgVI/u0fM+HVTE=; b=A81A+btYXefZ9ZW40O7odbz/PYOuHjQRaDOm0I7+imB0ciACBt//HGmSaqw9k5PZ5I dBUOfQAgSuQ0uZsnHI1lYz/YZZQfPhfkRi6eARQfg2a1Dx2A2Hw1vzK22lCgzd3T+Gi0 E8un25BB+bYVx4K5AOpCGIdDCGTuE2k1BQzDbM4Bt/GYgLzo8OFyh/MDVvpn5n9KoqWF 918OoVK61rb5N9dsLlpGrQ1gvO5DYDfKLaJw7pRxPRHBFhcLOUaHcu4xi3El3UG6LH4x oIH6iRF3SIqM9rCsU98Ibd2qUyn65VdrJBkvvJEmSR2q/Sen7bd0D7/YHiQ+ai5dnWyS XSDg== X-Gm-Message-State: AOJu0YyTzzQFBqFdQG1q7RyLi5uZ3oj1+0Ak6pz5mUkrSysF1GvJE19E kn7EgPPZ4xIOphzwwIv0e8LlykI1s9WaAel6YPVVVamgGMuxf4+B0hbQGnx5Cqud0OgixNsh2ho NJf150cA= X-Gm-Gg: ASbGncseb3tziYiQh3kCBE1CVYsPr1XKHtluZ9u4nZR8cEcMAv+wPv3Xb/wZgUcQIrp OUiuQpL72W9QvLXGZvHg2hZL7u/vJiin1mvKuV9f1tKWT6D/CP9d5+sZ2D8JMVmjnEkeiILNCXL SqncGjSGvtrAwlawJ/6h6IIPiKNQ7J77YA9I6Wdjs6H5rqdnEr5r9InfWjR/Sywxfmhg4c/rMW7 UucEMwa8sz5/5rzjlRUoBSlPDeyt2jpeTHINKc6BBYMU2oAuJ1EOqgeCzGhl0FLEu0jTZtpxiAR Xq5xv42ZY5MbR4rYYPTns6cXHTknX6KMNRF2uC3tsaz2vkfwdtOpi1L3DhPKbL3zHShsl898kZr bXG+JR79irnDF4U3z23AFg99wCBbSDCOR+Oo4jVW/lIvoVX+CP8PTPvF9mvKiaafS9MknUMb4Lu E8eM7mwO3qBYWI+UPt56DVzGhful0vsc7GxZyM4A== X-Google-Smtp-Source: AGHT+IHITGaxe8inASeDgglUUDU9/81Iz0FO53n5bzol0sqrM0yySW/ASWe/w5q1O9KzXAOTN7XRgw== X-Received: by 2002:a17:902:e888:b0:295:96bc:868c with SMTP id d9443c01a7336-297e5412cc8mr139301365ad.5.1762861690685; Tue, 11 Nov 2025 03:48:10 -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 v2 10/17] hw/riscv/rv-trace-messages.c: add encoded trap message Date: Tue, 11 Nov 2025 08:46:49 -0300 Message-ID: <20251111114656.2285048-11-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::631; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x631.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861735875158501 Content-Type: text/plain; charset="utf-8" The trap message consists of a Format 3 Subformat 1 e-trace message. According to the Efficient Trace for RISC-V spec, section "Format 3 thaddr, address and privilege fields", the 'thaddr' will be zero if: - we can't infer the EPC after an uninferable PC discontinuity (like traps). This doesn't happen in our current TCG backend - we'll always know the trap EPC in riscv_cpu_do_interrupt(); - a second interrupt/exception happens while the handler of the first trap hasn't exited. This also doesn't happen in TCG given that we do not emulate a multi-insn pipeline model, i.e. we'll only retire one insns at a time. This means that we'll always send trap packets with 'thaddr' set to 1, thus we're hardcoding it in the message helper. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/rv-trace-messages.c | 94 ++++++++++++++++++++++++++++++++++++ hw/riscv/rv-trace-messages.h | 5 ++ 2 files changed, 99 insertions(+) diff --git a/hw/riscv/rv-trace-messages.c b/hw/riscv/rv-trace-messages.c index 215135dd47..3e9466633d 100644 --- a/hw/riscv/rv-trace-messages.c +++ b/hw/riscv/rv-trace-messages.c @@ -35,6 +35,24 @@ typedef struct RVTraceSyncPayload { } RVTraceSyncPayload; #define SYNC_PAYLOAD_SIZE_64BITS 9 =20 +/* + * Format 3 subformat 1 without 'time' and 'context' fields + */ +typedef struct RVTraceTrapPayload { + uint8_t format:2; + uint8_t subformat:2; + uint8_t branch:1; + uint8_t privilege:3; + uint8_t ecause:6; + uint8_t interrupt:1; + uint8_t thaddr:1; + uint32_t addressLow; + uint32_t addressHigh; + uint32_t tvalLow; + uint32_t tvalHigh; +} RVTraceTrapPayload; +#define TRAP_PAYLOAD_SIZE_64BITS 18 + static void rv_etrace_write_bits(uint8_t *bytes, uint32_t bit_pos, uint32_t num_bits, uint32_t val) { @@ -92,3 +110,79 @@ size_t rv_etrace_gen_encoded_sync_msg(uint8_t *buf, uin= t64_t pc, =20 return HEADER_SIZE + SYNC_PAYLOAD_SIZE_64BITS; } + +/* + * Note: this function assumes thaddr =3D 1. + */ +size_t rv_etrace_gen_encoded_trap_msg(uint8_t *buf, uint64_t trap_addr, + TracePrivLevel priv_level, + uint8_t ecause, + bool is_interrupt, + uint64_t tval) +{ + RVTraceTrapPayload payload =3D {.format =3D 0b11, + .subformat =3D 0b01, + .branch =3D 1, + .privilege =3D priv_level, + .ecause =3D ecause}; + RVTraceMessageHeader header =3D {.flow =3D 0, .extend =3D 0, + .length =3D TRAP_PAYLOAD_SIZE_64BITS}; + uint8_t bit_pos; + + payload.addressLow =3D extract64(trap_addr, 0, 32); + payload.addressHigh =3D extract64(trap_addr, 32, 32); + + /* + * When interrupt =3D 1 'tval' is ommited. Take 8 bytes + * from the final size. + */ + if (is_interrupt) { + header.length =3D TRAP_PAYLOAD_SIZE_64BITS - 8; + } + + rv_etrace_write_header(buf, header); + bit_pos =3D 8; + + rv_etrace_write_bits(buf, bit_pos, 2, payload.format); + bit_pos +=3D 2; + rv_etrace_write_bits(buf, bit_pos, 2, payload.subformat); + bit_pos +=3D 2; + rv_etrace_write_bits(buf, bit_pos, 1, payload.branch); + bit_pos +=3D 1; + rv_etrace_write_bits(buf, bit_pos, 3, payload.privilege); + bit_pos +=3D 3; + + rv_etrace_write_bits(buf, bit_pos, 6, payload.ecause); + bit_pos +=3D 6; + + if (is_interrupt) { + rv_etrace_write_bits(buf, bit_pos, 1, 1); + } else { + rv_etrace_write_bits(buf, bit_pos, 1, 0); + } + bit_pos +=3D 1; + + /* thaddr is hardcoded to 1 for now */ + rv_etrace_write_bits(buf, bit_pos, 1, 1); + bit_pos +=3D 1; + + rv_etrace_write_bits(buf, bit_pos, 32, payload.addressLow); + bit_pos +=3D 32; + rv_etrace_write_bits(buf, bit_pos, 32, payload.addressHigh); + bit_pos +=3D 32; + + /* Skip trap_addr if is_interrupt */ + if (is_interrupt) { + goto out; + } + + payload.tvalLow =3D extract64(trap_addr, 0, 32); + payload.tvalHigh =3D extract64(trap_addr, 32, 32); + + rv_etrace_write_bits(buf, bit_pos, 32, payload.tvalLow); + bit_pos +=3D 32; + rv_etrace_write_bits(buf, bit_pos, 32, payload.tvalHigh); + +out: + return HEADER_SIZE + header.length; +} diff --git a/hw/riscv/rv-trace-messages.h b/hw/riscv/rv-trace-messages.h index aeafea8849..f3e38b571f 100644 --- a/hw/riscv/rv-trace-messages.h +++ b/hw/riscv/rv-trace-messages.h @@ -21,5 +21,10 @@ typedef enum { =20 size_t rv_etrace_gen_encoded_sync_msg(uint8_t *buf, uint64_t pc, TracePrivLevel priv_level); +size_t rv_etrace_gen_encoded_trap_msg(uint8_t *buf, uint64_t trap_addr, + TracePrivLevel priv_level, + uint8_t ecause, + bool is_interrupt, + uint64_t tval); =20 #endif --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861943; cv=none; d=zohomail.com; s=zohoarc; b=isGXNnGb5AvQglszCRyRgCaddV2JBoHTcC5BaGOPS/LUYuaSg63P7SZ10cY9HcjG5dCdAR0wwuyE3rsRvPlQwEePD4okReXMXPBc/kz8SXxzA8w0mOcRv1T583NAAvqvcpQFfaHy2Q4mr+YDp92SE/cSK+YnsZz1pNUoDjNNpZ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861943; 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=Ku4gzQekXNmP0NCrTTNTgWbZgcWQty+FiingVB4OVqg=; b=Y+Adgrs1Sf0m9hsAAQJ2SB6rBIQfXB4Cksz2lq9P1aQ3d+5hXH6XYBU1MJAwyuvwiryquLqHaiO2ygP7FTsZBuKQzes10YYcETN5aEDS6FOdhySe4P+MppGIdg47z280vn6FJEPzwutLr98R902OqPsz8RJyXSRIg23Ext3B0FI= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861943128313.8263633185063; Tue, 11 Nov 2025 03:52:23 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrX-0007J5-FN; Tue, 11 Nov 2025 06:48:39 -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 1vImrE-0006Vi-Ey for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:20 -0500 Received: from mail-pl1-x62e.google.com ([2607:f8b0:4864:20::62e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImrC-0004VN-S4 for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:20 -0500 Received: by mail-pl1-x62e.google.com with SMTP id d9443c01a7336-298145fe27eso25516625ad.1 for ; Tue, 11 Nov 2025 03:48:18 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.48.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:48:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861697; x=1763466497; 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=Ku4gzQekXNmP0NCrTTNTgWbZgcWQty+FiingVB4OVqg=; b=Ynw6sL2ZhJ1IEL0HoB8RCgu3lqQAZZBgCDvbMMAovof+VABNuRg5LWMEp6QWGurxZN Pcxdfxa7N4WylYSEpj3xfkVOgI9xsITqatqpOlDS6X/l6wC9zseY/SSv6HO8o6FF0sZS FX2cMj6G6KaYkLMbZ9sYhs0ljeB31cqKNw2CNvWGwZ0cwMaOxYna4RVVfVNSfk0vLUjW MnIp9f4wZvfsG5XQ7i99oE6DNTTgoz/twgfGnmGfNSqlPhRArOfjkUz0zbK0gGwkvRPY w+MhEb2znpCYQpJTvPtBA+ljNX/CZ6wUM8ek8S6PzxKbx95hJfZnA5q00m3CctbSJTdN PIcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861697; x=1763466497; 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=Ku4gzQekXNmP0NCrTTNTgWbZgcWQty+FiingVB4OVqg=; b=hUiwsrK+VAAp40MPh3nPcbaTpsZPGZ772AxWMuNz1vV7trJJHS8MRoFQ79nXG4bQQp Qy9oNBaNM2VdWYskqwpXfVfGjjDcM35F+Lt4hsVitZR3yGUu3VuSYDXIaRoZ/oZWtmL1 GVTIDVvNG5TwQuJAPXHPC4gfUs/sySiRhyRifAzYF/PpkGhM/1z66CGiKKD39lDTVAQF 51s0zHEcpukjkCZARrsbgnDHuFw/ge5iU0ieHispUfR+otXTcDivE2cl5OvFJZnSScru 8Tsli+OCbRwFnkt6cv60rHJH+nhL63TEKgQs5OyMEvvq0ck6Y68K9nAfJuYrUFvaPsY3 6YEg== X-Gm-Message-State: AOJu0Yyl58vL5MloIdMsykF7ZQkYm5qpKGWJxLVcdY052wdLsuZuImV6 ywJYNbEqMNeV0MNeb9/WNz6/qfrYMXmqTLhyLmgPafsJmE+S8QaD7AShiGsGGOFRZVidZCYQluh hUSsT3mA= X-Gm-Gg: ASbGncvRrgAevr+Btdqcnlyqjej9T72vV6zsJjXWPhyK6ClxKzzvnawTJ/gimu979LW IMml0moP4zYbyfS/oyuMaQsj0f6ve1JKq7cl+GiAzXbKJa+KQCEDhxiGG+5F3frmiRvso8Ey1s6 eSwbNtu5sjIT0g/eL2cCJDpbicWtoRTEKJ5SGzNgmgYXWTAPSwbR27TVyEtqx97HuZIvB2IZgNH i38QtGLlwg+E9O23SYXd7hKwcLdO/8Gps9OZCPl4Lhhjk8K3WRHXPpL/pKP6rU5rFnyYnf6dvgu GeGXdGEYxeYh4Ta6Riziu0jDrx+z57flLiUk16SJNi+ArlzusISteYUJ2DeTew9s7soK1Ez1qHO zUpVDhUDOz2ZD+ucoC3WoiGZn8TyYqWVzbg7W1Lq31LtPkQgpFnmun3BWNtfM8so3LIpVZM+E6d cCbVuJlaLWPfQR4H5iBYx/IZUpBPs= X-Google-Smtp-Source: AGHT+IH2FjSwQR7RqNkf8xLZGC4fVzSyj9wagLoOE7f/RejEJlqlwhGad4+ldZZJP4sEtTP7MHEEBw== X-Received: by 2002:a17:902:f683:b0:297:e231:f40c with SMTP id d9443c01a7336-297e562ea74mr147955615ad.19.1762861696899; Tue, 11 Nov 2025 03:48:16 -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 v2 11/17] hw/riscv, target/riscv: send trace trap messages Date: Tue, 11 Nov 2025 08:46:50 -0300 Message-ID: <20251111114656.2285048-12-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::62e; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x62e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861945189158500 Content-Type: text/plain; charset="utf-8" Use the rv_etrace_gen_encoded_trap_msg() helper we added in the previous patch to encode trap packets to be written in the RAM sink SMEM. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/trace-encoder.c | 17 +++++++++++++++++ hw/riscv/trace-encoder.h | 4 ++++ target/riscv/cpu_helper.c | 13 +++++++++++++ 3 files changed, 34 insertions(+) diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 16c9475d46..0750bd22b5 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -403,6 +403,23 @@ void trencoder_set_first_trace_insn(Object *trencoder_= obj, uint64_t pc) trencoder_send_message_smem(trencoder, msg, msg_size); } =20 +void trencoder_trace_trap_insn(Object *trencoder_obj, + uint64_t pc, uint32_t ecause, + bool is_interrupt, + uint64_t tval) +{ + TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); + TracePrivLevel priv =3D trencoder_get_curr_priv_level(trencoder); + g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); + uint8_t msg_size; + + msg_size =3D rv_etrace_gen_encoded_trap_msg(msg, pc, priv, + ecause, is_interrupt, + tval); + + trencoder_send_message_smem(trencoder, msg, msg_size); +} + static const Property trencoder_props[] =3D { /* * We need a link to the associated CPU to diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h index cf3177aefe..4898026f2b 100644 --- a/hw/riscv/trace-encoder.h +++ b/hw/riscv/trace-encoder.h @@ -46,5 +46,9 @@ struct TraceEncoder { OBJECT_DECLARE_SIMPLE_TYPE(TraceEncoder, TRACE_ENCODER) =20 void trencoder_set_first_trace_insn(Object *trencoder_obj, uint64_t pc); +void trencoder_trace_trap_insn(Object *trencoder_obj, + uint64_t pc, uint32_t ecause, + bool is_interrupt, + uint64_t tval); =20 #endif diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index c4fb68b5de..f2990cf7c4 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -38,6 +38,10 @@ #include "pmp.h" #include "qemu/plugin.h" =20 +#ifndef CONFIG_USER_ONLY +#include "hw/riscv/trace-encoder.h" +#endif + int riscv_env_mmu_index(CPURISCVState *env, bool ifetch) { #ifdef CONFIG_USER_ONLY @@ -2285,6 +2289,15 @@ void riscv_cpu_do_interrupt(CPUState *cs) __func__, env->mhartid, async, cause, env->pc, tval, riscv_cpu_get_trap_name(cause, async)); =20 + if (cpu->trencoder) { + TraceEncoder *te =3D TRACE_ENCODER(cpu->trencoder); + + if (te->trace_running) { + trencoder_trace_trap_insn(cpu->trencoder, env->pc, + cause, async, tval); + } + } + mode =3D env->priv <=3D PRV_S && cause < 64 && (((deleg >> cause) & 1) || s_injected || vs_injected) ? PRV_S : PR= V_M; =20 --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861967; cv=none; d=zohomail.com; s=zohoarc; b=nSGZZJI/+TF/OxgdV9qPNLmpGV840g79+y767DXbJpDZBwpGJ8+gUGx7UZ4iBiaA5lJAYXt89VmSTwm0WGvL245ES6WbpzlWnfKCkG9k2Zv8Xku8UULkw6G0ojmcQRFvN4K46EvgppFmMZoEZ0XPMFN2SszhI1IFbd3eB5vTAd8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861967; 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=obRy1SkPe/aJ6PXAHbxL+hkYwKo0WH2K1/L4xG7aCQM=; b=gonJCEzTOSIOmxRohqxGc7vdwXavcBJPQNavBPtT38DwIxRdnbnKE5KZeHy5I2Jamef8cUjhc6l3+e5En8AmU1I1ckyiaqt1GRU8If5uBEUciT4g4agZ5vdYpZeq58avxTEm5rXSxk7eBVGPhALet9KjeATd6RwK8nFs37XHp9A= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861967168229.3632537726877; Tue, 11 Nov 2025 03:52:47 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrZ-0007UD-IV; Tue, 11 Nov 2025 06:48:41 -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 1vImrK-0006n4-Ky for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:26 -0500 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImrI-0004Wo-Tn for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:26 -0500 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-29568d93e87so36494845ad.2 for ; Tue, 11 Nov 2025 03:48:24 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.48.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:48:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861703; x=1763466503; 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=obRy1SkPe/aJ6PXAHbxL+hkYwKo0WH2K1/L4xG7aCQM=; b=EF0JLZyGSToQHrr3ezHoqg5utY0h120VHHgENztAvXgDRN/JooC/esMTc9nOFNsz4S bk2MpGzP6hIbUrOsCQ6RH1ad5HD/xRZkJliDdJAUvF2SlGDXGDWwi+EDHz710o7egXpe MXL2hqRKRStD9zQUNzgdMfj+XyJKtPlqMQ3C82TzKGvveoZd75lhZsYJGtUgg38iJQd9 LoYNN8mbaHsw3uYl50N9dgKJTOHGdZt0VVUtkPqwO7g028K0Y8OyLJyjEL2Z3LAWhIXv 6y8QA1dXH3p9AyHO+RqZuUTW9GaP2wD3g7iP+Yb/qHFO/GOdMO5iOO82wiLDx+bXNN2A qjbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861703; x=1763466503; 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=obRy1SkPe/aJ6PXAHbxL+hkYwKo0WH2K1/L4xG7aCQM=; b=eg74Rq7VTDJZ9WiDBvvHiJ74etFvxoTf4ypVD1LaZ62svnipzPv33321C8ZBy/Gyjy 7wg8/W/Am2ik4kYtTb34kc5cBUD6b4eeIutYDwSEuTSQZzwNxqg6UywZ0ReUKCJpfDYz I9pzqYMnN3wjklAjtcFvYa7Lk8cKZY5bS977mNJtCw9S7vAbQsDwHBaQiUR0hsCssMAp SaVHFEts+FLuzTAwZ3zm1oo6bAA4TbE+CNX5y4n5W1Xv3qhWEvbLd/e9N2QZ3oGDToxQ a32yHBKUBvF9MSo+l5MamL1MWNmiCxDrfynQKO6dIekuskflwheQNcaZ8YC8pP9qtSl7 sRnw== X-Gm-Message-State: AOJu0Yy1y7miiBAdyUZHjVSsmwSEUrotxzI59SnPgbRla3Vd4gzYpSLZ Mvg6Nr/JKsV0qi3SC7V9YFuby9TcjJfYNw4E0jX5ecEWiKcpjUGWKS57mIP2KecwXHE+5gOojru Wfa94bDI= X-Gm-Gg: ASbGncuVmFHnT4d3zAUfNzaAdZNWos8xI2aLkG4Io869+gqJ2sr8pdI2wFGYbSqiKBi 7hC/EU8kIPYMpB7ZQe9CG7U71AHr4HtGl3OuoxgND9o5kYnxFEn27igKntxoeh/9/nSMjGzT0PM DnS/H37Ehfdp9tPYq6FHo+C4jLphZfN82gtYsVKSyHI4Q6+CqyaOBfHi3KlE+RjjwHUiwbY/7Fw gkNRBif2wdfNbYpKCL6Ijv/Y5EOsI/VboomofGJ8SJNYHbelfEvn6hMsWjSS5nIyhk7mfq7GtTa 8YtcjZQeoQb4L3mh248lvXBeQPentY+5PJHCi4X4k1+3c3VOnPNdFJJoC3C04unZ8ACc0aoEMb+ f89Bo9r7bxseNYzhy9yQ12/sadioI5RYtdUn6FQkEwX+/s2xvbz++F8taULOTcyDpwfPikkJMej esKipKMv1zGjX5FXJDXNh7m76RZY4= X-Google-Smtp-Source: AGHT+IEjcXFajXAH74/R1W9Y+YV23swG7neS3xAc3/rkmHaD9J9qaSh+ltK90AQXHAz8o30qPlguIA== X-Received: by 2002:a17:903:244a:b0:25c:8745:4a58 with SMTP id d9443c01a7336-297e53f933cmr151688785ad.3.1762861703202; Tue, 11 Nov 2025 03:48:23 -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 v2 12/17] target/riscv, hw/riscv: send trace ppccd packets Date: Tue, 11 Nov 2025 08:46:51 -0300 Message-ID: <20251111114656.2285048-13-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::633; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x633.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861967888153000 Content-Type: text/plain; charset="utf-8" The ppccd (privilege change) trace packets consists of sync packets like we already sent during trace start and resyncs. The privilege change is being fetched via riscv_cpu_set_mode(). Signed-off-by: Daniel Henrique Barboza --- hw/riscv/trace-encoder.c | 18 ++++++++++++++++++ hw/riscv/trace-encoder.h | 1 + target/riscv/cpu_helper.c | 13 ++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 0750bd22b5..9a4530bbea 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -389,6 +389,19 @@ static void trencoder_send_message_smem(TraceEncoder *= trencoder, trencoder_update_ramsink_writep(trencoder, dest, wrapped); } =20 +static void trencoder_send_sync_msg(Object *trencoder_obj, uint64_t pc) +{ + TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); + TracePrivLevel priv =3D trencoder_get_curr_priv_level(trencoder); + g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); + uint8_t msg_size; + + trencoder->first_pc =3D pc; + msg_size =3D rv_etrace_gen_encoded_sync_msg(msg, pc, priv); + + trencoder_send_message_smem(trencoder, msg, msg_size); +} + void trencoder_set_first_trace_insn(Object *trencoder_obj, uint64_t pc) { TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); @@ -420,6 +433,11 @@ void trencoder_trace_trap_insn(Object *trencoder_obj, trencoder_send_message_smem(trencoder, msg, msg_size); } =20 +void trencoder_trace_ppccd(Object *trencoder_obj, uint64_t pc) +{ + trencoder_send_sync_msg(trencoder_obj, pc); +} + static const Property trencoder_props[] =3D { /* * We need a link to the associated CPU to diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h index 4898026f2b..2bf07c01f6 100644 --- a/hw/riscv/trace-encoder.h +++ b/hw/riscv/trace-encoder.h @@ -50,5 +50,6 @@ void trencoder_trace_trap_insn(Object *trencoder_obj, uint64_t pc, uint32_t ecause, bool is_interrupt, uint64_t tval); +void trencoder_trace_ppccd(Object *trencoder_obj, uint64_t pc); =20 #endif diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index f2990cf7c4..665aad6dea 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -1034,6 +1034,8 @@ void riscv_ctr_add_entry(CPURISCVState *env, target_l= ong src, target_long dst, =20 void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv, bool vir= t_en) { + CPUState *cs =3D env_cpu(env); + g_assert(newpriv <=3D PRV_M && newpriv !=3D PRV_RESERVED); =20 if (newpriv !=3D env->priv || env->virt_enabled !=3D virt_en) { @@ -1041,6 +1043,15 @@ void riscv_cpu_set_mode(CPURISCVState *env, target_u= long newpriv, bool virt_en) riscv_itrigger_update_priv(env); } =20 + if (newpriv !=3D env->priv) { + RISCVCPU *cpu =3D RISCV_CPU(cs); + + if (cpu->trencoder && + TRACE_ENCODER(cpu->trencoder)->trace_running) { + trencoder_trace_ppccd(cpu->trencoder, env->pc); + } + } + riscv_pmu_update_fixed_ctrs(env, newpriv, virt_en); } =20 @@ -1061,7 +1072,7 @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ul= ong newpriv, bool virt_en) if (riscv_has_ext(env, RVH)) { /* Flush the TLB on all virt mode changes. */ if (env->virt_enabled !=3D virt_en) { - tlb_flush(env_cpu(env)); + tlb_flush(cs); } =20 env->virt_enabled =3D virt_en; --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861996; cv=none; d=zohomail.com; s=zohoarc; b=NG14w3LJa3aLirtf2/Jt6+A0wmNPAStiroPGH/JoYw0JhrE9TnCpYfA23VBjupKaCo/S4cZEaJAGOdCUUhyEF8JW/dPD/sRHeypHwxmrFgTbQofQa4AyY9/LMxqzCWuNWhfl5dWJMnavHSzTsTtGXGKBk+AFg5MgqDuPfWkdUKg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861996; 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=mxPxc4Md5C2Zqt98YWnguxmFjA/nPm3BgfgxgFswHjo=; b=OV4hqMdiVOLvBW62Ic6Y1du9ZwYNHv499Ozk/bSOmOGw12evhLRO+7/i+mCHLMVn6TEZL0M6/D2Y7dKCtHHkbGEKA9GfAn4yv91mV5npbMhuAU2dvvABh6gMTpAdqcYN4a55uegCAnmPdtxum1gQmr1giEjIHhlMiFGz+ysxnS0= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861996765521.503008008483; Tue, 11 Nov 2025 03:53:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImrj-00085I-Eo; Tue, 11 Nov 2025 06:48:51 -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 1vImrR-000771-RH for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:34 -0500 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImrQ-0004Xo-2A for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:33 -0500 Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-298039e00c2so28177095ad.3 for ; Tue, 11 Nov 2025 03:48:31 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.48.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:48:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861710; x=1763466510; 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=mxPxc4Md5C2Zqt98YWnguxmFjA/nPm3BgfgxgFswHjo=; b=AYRs5MEAVclXstsIpwefB8De95OYr1Y07zyM5mLdXsRD4/DsczZCTtdjt5hGDZeV45 /weQHRtF3sbyNUzsKw6TDamMk1zUcGU9ar51DmmSzo2ZoMZPVGgWNrzn+zP2KScR4zMb 8WsDvBOtyPYb3P0G0HMtdWpJtkaN8Kor9W8mJj8fIGy47ASLH8zdd53POZr+Q2plidt7 nD1Zofk7wFYC35lhUrPcBB6Ue7UGmJibvkvf+0VChyABIwA3ZflI1Io7LmbczpTSPCrB W4IyNAGKk2s2zq5rr5tT5cIR6Uv3byzesAIGNvuEG8YvSTY+lYMbYLF+Tp0JX1CXjaz6 zXtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861710; x=1763466510; 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=mxPxc4Md5C2Zqt98YWnguxmFjA/nPm3BgfgxgFswHjo=; b=IEBSFtX0l5iRSti7aZapbRCAHDmWMeGWpnWfw9PGvjMRxrKXbLPaXT/is1A3k4MCnk QBCbVQ6TlKHRbNowcQeFN6WULe1qb2Z2qa+GhFaSqBA1HB10YEJIyttU8qAqxU8MhFuz sNeTBIEqv/Ls4AJCMOnXhP2xDtCUvclfulYkdvwnH0k+cmoKXMYI6HTgUE3kv9fVpcpR jbwOQlwzZmH1m5BSzBhHKTGGIQPmEy7fyUy+C1KZXFFJsnbNIg5ZeSaGDSz8AZfvJJSi GLsTWPMcQoz0Z4vp7trzF9RlZ1LjK97hhUFgcafhm4Eqj102xfHYyYMdHDMScmWyYwJ9 7KOg== X-Gm-Message-State: AOJu0Yx976dbkOZN1Me8NAKUA11SjFnG8ML6QTfCyeXKPNb9SpFkdrVH arw44p25vu6g1Fr4Jsnl45ExGCJ6Aa3nXyQIoleiFaEfJPrBEUcnr3dW8Nkk0RCy095kmB4M0xw evfLcKjg= X-Gm-Gg: ASbGncsIGkyDbhh3pUOllQZ3LAc1BiocstkXbSZM4lSjGDNOVMoSeYFJu/toP42FCnk lQ14wRhn63Cqq6Uww9sa+EM44xKAdvOFxj31FB+/4icUggTViRIWcl2QvXsiw41D1ka4ZkhQOpF HteB/4WyHEzOjjj4tomJAlTMmB36RBhUwJCTItgAHJySVGFxzoC/VSPigOjzp2hLfedh1m/eZ+9 5IugbEfeUx7vzrf/BMyDoqkks2mDLnp4ZmOsJn2N/vBonpCgGkc2DQhayJpr/xS06h/qSx2vZG7 rlhVFUNklXbYKqjXMdTaL+DfRh7vIAKHkdjfcHUE8uUSmdv+0/s2LEbyArNuM3IOjBoRTOpXbkd mMd5brR5JtxKhAt26QCM0MDxp+TYFjrKDkJttXv8XUck8oJDYjGA5+Sd2SD2bZb+SmwlU98jh+2 bX7XUbqNWeeacN31+jhy3+EpwB2wARD1L0DtobAw== X-Google-Smtp-Source: AGHT+IE8QZIke1F04Lp/KHbgdXExP+qTG9cpfhkFw3BecV67MRYkgoWP/55R52wYRbC9WuCVAYkAyQ== X-Received: by 2002:a17:902:f785:b0:295:6122:5c42 with SMTP id d9443c01a7336-297e5643bc1mr176402885ad.24.1762861710357; Tue, 11 Nov 2025 03:48:30 -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 v2 13/17] hw/riscv/trace: add format2 msg helper Date: Tue, 11 Nov 2025 08:46:52 -0300 Message-ID: <20251111114656.2285048-14-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::62a; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x62a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762862000034153000 Content-Type: text/plain; charset="utf-8" Before handling updiscon (uninferable PC discontinuity) cases add the encoded message we're going to use, format 2. Format 1 will be added when we add the branch map. There are design decisions worth documenting in this patch. For irreport, the e-trace-encap spec [1] in section 7.6. "Format 2 packets", says that we should make this bit !updiscon if we're either: "following a return because its address differs from the predicted return address at the top of the implicit_return return address stack, or the last retired before an exception, interrupt, privilege change or resync because it is necessary to report the current address stack depth or nested call count." We do not implement any form of call/return prediction in the encoder, and TCG will always retire a single insn per cycle. This means that we'll never set irreport, i.e. irreport will always be equal to updiscon. If this interpretation turns out to be wrong we'll revisit this helper. Likewise, irdepth is also not implemented since we'll always return a package where irreport =3D=3D updiscon. The size of the field is arbitrarily set to '3' to avoid adding padding in the end of the msg to complete an extra byte. [1] https://github.com/riscv-non-isa/e-trace-encap/releases/tag/v1.0 Signed-off-by: Daniel Henrique Barboza --- hw/riscv/rv-trace-messages.c | 59 ++++++++++++++++++++++++++++++++++++ hw/riscv/rv-trace-messages.h | 2 ++ 2 files changed, 61 insertions(+) diff --git a/hw/riscv/rv-trace-messages.c b/hw/riscv/rv-trace-messages.c index 3e9466633d..3fa70ba81c 100644 --- a/hw/riscv/rv-trace-messages.c +++ b/hw/riscv/rv-trace-messages.c @@ -53,6 +53,17 @@ typedef struct RVTraceTrapPayload { } RVTraceTrapPayload; #define TRAP_PAYLOAD_SIZE_64BITS 18 =20 +typedef struct RVTraceFormat2Payload { + uint8_t format:2; + uint32_t addressLow; + uint32_t addressHigh; + uint8_t notify:1; + uint8_t updiscon:1; + uint8_t irreport:1; + uint8_t irdepth:3; +} RVTraceFormat2Payload; +#define FORMAT2_PAYLOAD_SIZE_64BITS 9 + static void rv_etrace_write_bits(uint8_t *bytes, uint32_t bit_pos, uint32_t num_bits, uint32_t val) { @@ -186,3 +197,51 @@ size_t rv_etrace_gen_encoded_trap_msg(uint8_t *buf, ui= nt64_t trap_addr, out: return HEADER_SIZE + header.length; } + +/* + * Note: irreport and irdepth is always =3D=3D updiscon. + * + * return_stack_size_p + call_counter_size_p is hardcoded + * to 3 since we don't implement neither ATM. + */ +size_t rv_etrace_gen_encoded_format2_msg(uint8_t *buf, uint64_t addr, + bool notify, bool updiscon) +{ + RVTraceFormat2Payload payload =3D {.format =3D 0b11, + .notify =3D notify, + .updiscon =3D updiscon}; + RVTraceMessageHeader header =3D {.flow =3D 0, .extend =3D 0, + .length =3D FORMAT2_PAYLOAD_SIZE_64BITS= }; + uint8_t bit_pos; + + payload.addressLow =3D extract64(addr, 0, 32); + payload.addressHigh =3D extract64(addr, 32, 32); + + payload.irreport =3D updiscon; + if (updiscon) { + payload.irdepth =3D 0b111; + } else { + payload.irdepth =3D 0; + } + + rv_etrace_write_header(buf, header); + bit_pos =3D 8; + + rv_etrace_write_bits(buf, bit_pos, 2, payload.format); + bit_pos +=3D 2; + + rv_etrace_write_bits(buf, bit_pos, 32, payload.addressLow); + bit_pos +=3D 32; + rv_etrace_write_bits(buf, bit_pos, 32, payload.addressHigh); + bit_pos +=3D 32; + + rv_etrace_write_bits(buf, bit_pos, 1, payload.notify); + bit_pos +=3D 1; + rv_etrace_write_bits(buf, bit_pos, 1, payload.updiscon); + bit_pos +=3D 1; + rv_etrace_write_bits(buf, bit_pos, 1, payload.irreport); + bit_pos +=3D 1; + rv_etrace_write_bits(buf, bit_pos, 3, payload.irdepth); + + return HEADER_SIZE + header.length; +} diff --git a/hw/riscv/rv-trace-messages.h b/hw/riscv/rv-trace-messages.h index f3e38b571f..50a4a0ef19 100644 --- a/hw/riscv/rv-trace-messages.h +++ b/hw/riscv/rv-trace-messages.h @@ -26,5 +26,7 @@ size_t rv_etrace_gen_encoded_trap_msg(uint8_t *buf, uint6= 4_t trap_addr, uint8_t ecause, bool is_interrupt, uint64_t tval); +size_t rv_etrace_gen_encoded_format2_msg(uint8_t *buf, uint64_t addr, + bool notify, bool updiscon); =20 #endif --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861854; cv=none; d=zohomail.com; s=zohoarc; b=Gzm8crEQ2I8em42Hpem3IJuUv+fP5tJ/W/Qd4CpM+LokuiJ9OlbRXLgj1FrA5VLadgFKdzaNzJrwRRrgVfe6DC2rfmxhkGQv8liWI3Zt8D3h4nwVd9Q2M6/B1Y8k7doX1KnZaNBiATmO/hS5tkCq+AeQxq9AB8bYVwHaSkfKJuY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861854; 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=Bdvq16DNFrDDYS/eBUrRZ3SqUnavTY0SVfaYl0dw6yY=; b=G9flMRDed3mneJUDkcVd0y+rt6j4va2RNQ3LsnY0248Fsm6pJ98Q29OCxd4NGdgzuiZQ5xfQ7mITvKT8MMgIy9bdAfw9UeYnARIphnKcpw/k+TmNDg2boora+/jkQfxls5kdfIfBfDbeQRY+XK9Tjh4tpOWKVIIUG6LpnP18C9k= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861854830516.8839073152268; Tue, 11 Nov 2025 03:50:54 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImre-0007nx-RM; Tue, 11 Nov 2025 06:48:47 -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 1vImrZ-0007Tg-Am for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:41 -0500 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImrW-0004Yl-Bg for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:41 -0500 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-297dc3e299bso30669105ad.1 for ; Tue, 11 Nov 2025 03:48:37 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.48.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:48:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861716; x=1763466516; 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=Bdvq16DNFrDDYS/eBUrRZ3SqUnavTY0SVfaYl0dw6yY=; b=LUDF0lsL4CmYGzS8QFeNh2Y2QiZp/JVjybAdJxT/4r6kbkfiIQ6L8dDLbFgpNgzsMz pFB+SrqoQk9z9wCNnDvX/wH63HvC9zOup234C+aGjQZSlXZKVcZuhtDVA27PPtQhWR9R uCwQhnpQzWBoq3qYLNtxrRjIhL1e9pjIUjoeYMe67Hdo3Ko+Z3udafWw5iKDUVUOx5OR qxXYubopuvs69K6KdCEez7qnzaf2MXIOrRQgFk8Ipva3BjIoYb19/9gzhNxnHtxKzjA+ DX7Jfd1ddAKOkjmobWQypVVyqX2l4+rQBF6SGjQxdYMJBuFv2okxW6XJb/qoFYN5A3HM ICzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861716; x=1763466516; 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=Bdvq16DNFrDDYS/eBUrRZ3SqUnavTY0SVfaYl0dw6yY=; b=QUDEarocYKKZPECy1YLvpJeMgq+5YEHdCiUXkGlF8O+RSOX20FEoyn6dJTBIVlAMCK Zu3oIQqY53RelnkyoRoFp66IrClZAmQqaCJ7COmbQfcLRHCxv+byB51cBFczXgBKOx5+ omS9zu4SXaa+CJl7Wmd82Wp3yzGuDMsKDs5OUr7QGnnyoEuRHGE2pKG3N/yC8GRtVKk2 ppsDLxfpuEm2G6acWpcZYtKqL2P/xJOQpx4rh4t3CvPy0GpxKI2B6nHn8H1aWqHAiglt TCQIh8PxGHHTudR9hefrvP4Lavh8MF/8Tp7VZu9QL4pD1NQAIjUDWe5bHrSx0D0wXh1o wfeg== X-Gm-Message-State: AOJu0YxSYCNC9HhwMYF6fKL4oQyPFrj0GbB7YIkenRci7fcl8NEmK7bp ggX4+9zaApUhSniSVDw2L84YFS4OrNGOXTBHAXmU5BnI4Uk5nHPvgBQA+zD4MimQo5LIG3E5lh9 6AOw2SvQ= X-Gm-Gg: ASbGncugTfdf9/RYXrdcT7K4a9c8t2q5wEN7/VRYkqksnJg402qW9b7zXoff+VD5RsR hyB7bkYvy+Dp/qkB+wFaBjjVQljvvFDSSZRxTPMpkjUe7t/VIrQJIdgG6bHkXXwDed1wnD5Ob2S J5Q/Aqcpdlfgxb3dPYisTtIKjFqA22TK2PiiKlMnT+1c/mjDMC/lTdASP2L2gBKtpNarUGAT7ti 2L06mO0/qGcGkS9kwyq+LQJFHOvUXBISjn7+twXGIZgWfjtOuL4eWJ2PZl9N9/r+5YD3/eZWPFl cBerLiTtZ/tiSoo/0lUyzCAKW2HMiSnXwXL1pfAXOJV7QI+ZUe0HlFJzPDCh4T4m9g7wAd8Qjok tdrgDBzrn50/GcS6GyPH0nVavgP4oQDi8HeLQ7a8rU+ZCpb6mGh7CrWndrnjLn2H1rcYo6b4gaA OE/hGB/av1sqemoA+AEPMKVsyRM2m+tZ7+pNhYIw== X-Google-Smtp-Source: AGHT+IHMVmKKijhoOpwgRfU6G9sx5t8C2qfX8SqaY6PYOQSh80/4U9ZvQLhw9I1FXFF0WZi1hSLrlw== X-Received: by 2002:a17:902:d507:b0:295:6a69:4ad5 with SMTP id d9443c01a7336-297e571bce3mr157218985ad.56.1762861716433; Tue, 11 Nov 2025 03:48:36 -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 v2 14/17] hw/riscv, target/riscv: send resync updiscon trace packets Date: Tue, 11 Nov 2025 08:46:53 -0300 Message-ID: <20251111114656.2285048-15-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::62d; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861855869158500 Content-Type: text/plain; charset="utf-8" Send updiscon packets based on the constraints already discussed in the previous patch: - We do not implement any form of call/return prediction in the encoder, and TCG will always retire a single insn per cycle, e.g. irreport will always be equal to updiscon; - irdepth is not implemented since we'll always return a package where irreport =3D=3D updiscon. Note that we're sending an updiscon packet if the 'updiscon_pending' flag is set when we're about the send a resync or a trap packet. The TCG helper in this case is just setting the trace encoder flags instead of actually triggering a RAM sink SMEM write. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/trace-encoder.c | 37 +++++++++++++++++++ hw/riscv/trace-encoder.h | 3 ++ target/riscv/helper.h | 1 + .../riscv/insn_trans/trans_privileged.c.inc | 11 ++++++ target/riscv/insn_trans/trans_rvi.c.inc | 2 + target/riscv/trace_helper.c | 14 +++++++ target/riscv/translate.c | 9 +++++ 7 files changed, 77 insertions(+) diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 9a4530bbea..5572483d26 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -402,6 +402,22 @@ static void trencoder_send_sync_msg(Object *trencoder_= obj, uint64_t pc) trencoder_send_message_smem(trencoder, msg, msg_size); } =20 +static void trencoder_send_updiscon(TraceEncoder *trencoder, uint64_t pc) +{ + g_autofree uint8_t *format2_msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); + uint8_t addr_msb =3D extract64(pc, 31, 1); + bool notify =3D addr_msb; + bool updiscon =3D !notify; + uint8_t msg_size; + + msg_size =3D rv_etrace_gen_encoded_format2_msg(format2_msg, pc, + notify, + updiscon); + trencoder_send_message_smem(trencoder, format2_msg, msg_size); + + trencoder->updiscon_pending =3D false; +} + void trencoder_set_first_trace_insn(Object *trencoder_obj, uint64_t pc) { TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); @@ -409,6 +425,10 @@ void trencoder_set_first_trace_insn(Object *trencoder_= obj, uint64_t pc) g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); uint8_t msg_size; =20 + if (trencoder->updiscon_pending) { + trencoder_send_updiscon(trencoder, pc); + } + trencoder->first_pc =3D pc; trace_trencoder_first_trace_insn(pc); msg_size =3D rv_etrace_gen_encoded_sync_msg(msg, pc, priv); @@ -426,6 +446,10 @@ void trencoder_trace_trap_insn(Object *trencoder_obj, g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); uint8_t msg_size; =20 + if (trencoder->updiscon_pending) { + trencoder_send_updiscon(trencoder, pc); + } + msg_size =3D rv_etrace_gen_encoded_trap_msg(msg, pc, priv, ecause, is_interrupt, tval); @@ -435,9 +459,22 @@ void trencoder_trace_trap_insn(Object *trencoder_obj, =20 void trencoder_trace_ppccd(Object *trencoder_obj, uint64_t pc) { + TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); + + if (trencoder->updiscon_pending) { + trencoder_send_updiscon(trencoder, pc); + } + trencoder_send_sync_msg(trencoder_obj, pc); } =20 +void trencoder_report_updiscon(Object *trencoder_obj) +{ + TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); + + trencoder->updiscon_pending =3D true; +} + static const Property trencoder_props[] =3D { /* * We need a link to the associated CPU to diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h index 2bf07c01f6..0c44092ccb 100644 --- a/hw/riscv/trace-encoder.h +++ b/hw/riscv/trace-encoder.h @@ -36,6 +36,8 @@ struct TraceEncoder { uint32_t regs[TRACE_R_MAX]; RegisterInfo regs_info[TRACE_R_MAX]; =20 + bool updiscon_pending; + bool enabled; bool trace_running; bool trace_next_insn; @@ -51,5 +53,6 @@ void trencoder_trace_trap_insn(Object *trencoder_obj, bool is_interrupt, uint64_t tval); void trencoder_trace_ppccd(Object *trencoder_obj, uint64_t pc); +void trencoder_report_updiscon(Object *trencoder_obj); =20 #endif diff --git a/target/riscv/helper.h b/target/riscv/helper.h index e80320ad16..f27ff319e9 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -131,6 +131,7 @@ DEF_HELPER_6(csrrw_i128, tl, env, int, tl, tl, tl, tl) =20 /* Trace helpers (should be put inside ifdef) */ DEF_HELPER_2(trace_insn, void, env, i64) +DEF_HELPER_1(trace_updiscon, void, env) =20 #ifndef CONFIG_USER_ONLY DEF_HELPER_1(sret, tl, env) diff --git a/target/riscv/insn_trans/trans_privileged.c.inc b/target/riscv/= insn_trans/trans_privileged.c.inc index 8a62b4cfcd..28089539d5 100644 --- a/target/riscv/insn_trans/trans_privileged.c.inc +++ b/target/riscv/insn_trans/trans_privileged.c.inc @@ -26,6 +26,8 @@ =20 static bool trans_ecall(DisasContext *ctx, arg_ecall *a) { + gen_trace_updiscon(); + /* always generates U-level ECALL, fixed in do_interrupt handler */ generate_exception(ctx, RISCV_EXCP_U_ECALL); return true; @@ -40,6 +42,8 @@ static bool trans_ebreak(DisasContext *ctx, arg_ebreak *a) uint32_t ebreak =3D 0; uint32_t post =3D 0; =20 + gen_trace_updiscon(); + /* * The RISC-V semihosting spec specifies the following * three-instruction sequence to flag a semihosting call: @@ -95,6 +99,8 @@ static bool trans_sret(DisasContext *ctx, arg_sret *a) { #ifndef CONFIG_USER_ONLY if (has_ext(ctx, RVS)) { + gen_trace_updiscon(); + decode_save_opc(ctx, 0); translator_io_start(&ctx->base); gen_update_pc(ctx, 0); @@ -113,6 +119,8 @@ static bool trans_sret(DisasContext *ctx, arg_sret *a) static bool trans_mret(DisasContext *ctx, arg_mret *a) { #ifndef CONFIG_USER_ONLY + gen_trace_updiscon(); + decode_save_opc(ctx, 0); translator_io_start(&ctx->base); gen_update_pc(ctx, 0); @@ -129,6 +137,9 @@ static bool trans_mnret(DisasContext *ctx, arg_mnret *a) { #ifndef CONFIG_USER_ONLY REQUIRE_SMRNMI(ctx); + + gen_trace_updiscon(); + decode_save_opc(ctx, 0); gen_helper_mnret(cpu_pc, tcg_env); tcg_gen_exit_tb(NULL, 0); /* no chaining */ diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index 54b9b4f241..ac00cbc802 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -183,6 +183,8 @@ static bool trans_jalr(DisasContext *ctx, arg_jalr *a) } } =20 + gen_trace_updiscon(); + lookup_and_goto_ptr(ctx); =20 if (misaligned) { diff --git a/target/riscv/trace_helper.c b/target/riscv/trace_helper.c index ed84e6f79a..4b2b645f04 100644 --- a/target/riscv/trace_helper.c +++ b/target/riscv/trace_helper.c @@ -28,9 +28,23 @@ void helper_trace_insn(CPURISCVState *env, uint64_t pc) te->trace_next_insn =3D false; } } + +void helper_trace_updiscon(CPURISCVState *env) +{ + RISCVCPU *cpu =3D env_archcpu(env); + TraceEncoder *te =3D TRACE_ENCODER(cpu->trencoder); + + te->updiscon_pending =3D true; + te->trace_next_insn =3D true; +} #else /* #ifndef CONFIG_USER_ONLY */ void helper_trace_insn(CPURISCVState *env, uint64_t pc) { return; } + +void helper_trace_updiscon(CPURISCVState *env) +{ + return; +} #endif /* #ifndef CONFIG_USER_ONLY*/ diff --git a/target/riscv/translate.c b/target/riscv/translate.c index ff288051e3..26c7678cb9 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -617,6 +617,15 @@ static void gen_ctr_jal(DisasContext *ctx, int rd, tar= get_ulong imm) } #endif =20 +static void gen_trace_updiscon(void) +{ + TCGLabel *skip =3D gen_new_label(); + + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_trace_running, 0, skip); + gen_helper_trace_updiscon(tcg_env); + gen_set_label(skip); +} + static void gen_jal(DisasContext *ctx, int rd, target_ulong imm) { TCGv succ_pc =3D dest_gpr(ctx, rd); --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861870; cv=none; d=zohomail.com; s=zohoarc; b=l2rTf+qTwKqUk7biuQ0vsYFiM/CkusZgI2dQvdJu+jadIa5Pc/c989eyuC6AOee6xyHm5cTL/lO7I5x9xvg9cNtOIOlxv4JT0tiNwG+pNASk0FJi08CtUbr+6z3ed5aJStFV0VwpgZLLZ+UgoxqfL0tvrAnLmatVhyqLOnILpJY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861870; 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=ivUquUYiwaXXCD1dXO2VwN1hIYAeG2qwuYKXR8Yl3go=; b=irHuKRbiyzV3N1poVZUF6dIQt+OmlsMq3FQNdn+FCk9GIFNU74pkgHlWccunZYBaVgiSoMZwFf66yYYs6Iu6ANbwqloB+XylGYhJfPX1qzd6tnvY1LzB7lpfGc7AcKVD8597Ip2zeKlsjodzULTDfNjAZKYT/Ejm8YKXRgfqo3Q= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861870613735.0224535023749; Tue, 11 Nov 2025 03:51:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImsU-0000wq-Td; Tue, 11 Nov 2025 06:49:41 -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 1vImre-0007pW-KT for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:46 -0500 Received: from mail-pg1-x530.google.com ([2607:f8b0:4864:20::530]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImrc-0004Zm-Ec for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:46 -0500 Received: by mail-pg1-x530.google.com with SMTP id 41be03b00d2f7-b994baabfcfso2547417a12.3 for ; Tue, 11 Nov 2025 03:48:44 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.48.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:48:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861722; x=1763466522; 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=ivUquUYiwaXXCD1dXO2VwN1hIYAeG2qwuYKXR8Yl3go=; b=N344eOHodYbTS1W/XLuXZpR8sn0rYVcerZXDkioBPa6EZfuP2qGvDZAeEqVvWFqATR MeqUIXCqD+Q3DoaiFtR8nWJi9jwMGTuzDb/+Ws+nXIw6CkSH8Iw9fke0aXMlQjmsSR2I VgvgqfADU8jrgojRLTkGzbNmVLZaNymrYRsBAxIpUskSnLKqW2XKLjpf98//DT5YGrV8 QTY0u3p13FVVbkfSo58oRBBIWm86h76wbwXtVZGp7k43yM8RgpSLnVD9KYSkRB/zxluU hh3gAGbuGn4Y3UM3ppHVxlXoC/+Yc14gW54GMKXqma1r0kHJho2GokZyJ9NbWUGX8ZPb KdZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861722; x=1763466522; 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=ivUquUYiwaXXCD1dXO2VwN1hIYAeG2qwuYKXR8Yl3go=; b=FsP/QwujV/NMzsnNSC0USq/Mu7XJjjGfj3KXmhDVjCDZhx+hRFG9AxmxvWWFBgTu+j 3GofOagMxIibBNHYubPL+diCsvBVuhCCTokzbV7jBqC93LNU7IFMmZyn+K7d4iOD/WeO vqmDnzDfAcHP5i4N1UwT8/SZaOlyOLaExD9w3mw1KzAO4gEiJVIT9C6GPgE2i4jwE2ry 6Y4BeaLKoyRtobVZNcoqSIJP4pcY4AD33FAQECx0h8ggfFTBqIBA2iINvuE3yezvxniN +kpqMuATnMIXWEDXxsat3XLjnamrZBrlUOygsqDQgrOW9GzOq2GOKfd+wJkmE0WOjk6p PwUA== X-Gm-Message-State: AOJu0YzVx3OrHmsShl45S5LQZXvYXP+v1wrVwEbVAYdDmXZe3rzVVqln mQFlSfvyyZDJ2ZldS2hC3msDVbMIw+xp5L142rxTkvqRVcL6V4N0kzjS8OiPy6aEdmzzVbljNK/ sT/zrrKk= X-Gm-Gg: ASbGnct/oZ+iWkRzGlFtvxsTnpGNC9rgU/8O9zVswNM6gwdUJ6V01VJpJ4UjLQ1KzyS 7TJd0bMJ9yNR5zRB1wPaOZp+RZ945TnYe8iFOBAGNyvsqSXzjl/4x1Dl1u0Y6JEWxOBjhBDzyku hvovDzXkqpLr8fL9zymZc3hGPxx5YlB+/XhaA+jHIwooWFHmYm1BSPKK5aKw16rYEeyEd+R6T48 mX9L38IczqgqqDwlTscFsgCSPhF8ABQGqfO42GKnnGPmqB/awS+O5WjqzDN2VU81rrE1smGgiJD tcs7Oj3JW+si/OgC55AHrgXbmmnAfrMNrRbKWU9L9OXBOvQ0z2pt6QR5kj5sZNfmaTF/MyyMqUf iGt6tIW+Cw1p6rHFmUSv3yywV3VCLicpUFUK0L9Fxp7CgRSRKqWxdz0GcvyfteVCCeNsFO9tnj9 tCwRhVNPuKHo2NXHl2Y67mzHCTAgs= X-Google-Smtp-Source: AGHT+IHPPmjHiYmtcQd6TJYSSaltcKlRmr4hQ8mCkU45m7nMaJ1AXhW1TeazFNrtFH1SAzJT+T48hA== X-Received: by 2002:a17:902:f707:b0:297:f09a:51db with SMTP id d9443c01a7336-297f09a5380mr131373575ad.15.1762861722509; Tue, 11 Nov 2025 03:48:42 -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 v2 15/17] hw/riscv/rv-trace-messages: add format 1 msgs with branch info Date: Tue, 11 Nov 2025 08:46:54 -0300 Message-ID: <20251111114656.2285048-16-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::530; envelope-from=dbarboza@ventanamicro.com; helo=mail-pg1-x530.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861872147158501 Content-Type: text/plain; charset="utf-8" Add encoded message helpers to send branch information trace packets. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/rv-trace-messages.c | 126 +++++++++++++++++++++++++++++++++++ hw/riscv/rv-trace-messages.h | 7 ++ 2 files changed, 133 insertions(+) diff --git a/hw/riscv/rv-trace-messages.c b/hw/riscv/rv-trace-messages.c index 3fa70ba81c..a93b0adfc6 100644 --- a/hw/riscv/rv-trace-messages.c +++ b/hw/riscv/rv-trace-messages.c @@ -64,6 +64,31 @@ typedef struct RVTraceFormat2Payload { } RVTraceFormat2Payload; #define FORMAT2_PAYLOAD_SIZE_64BITS 9 =20 +typedef struct RVTraceFormat1BasePayload { + uint8_t format:2; + uint8_t branches:5; + uint32_t branch_map:31; +} RVTraceFormat1BasePayload; +#define FORMAT1_BASE_PAYLOAD_SIZE_64BITS 5 + +typedef struct RVTraceFormat1Payload { + uint8_t format:2; + uint8_t branches:5; + uint32_t branch_map; + uint32_t addressLow; + uint32_t addressHigh; + uint8_t notify:1; + uint8_t updiscon:1; + uint8_t irreport:1; + uint8_t irdepth:3; +} RVTraceFormat1Payload; + +/* + * FORMAT2_PAYLOAD_SIZE_64BITS =3D 9 plus 5 bits of 'branches', + * plus minimal 3 bits of 'branch_map' =3D 10 bytes. + */ +#define FORMAT1_PAYLOAD_MIN_SIZE_64BITS 10 + static void rv_etrace_write_bits(uint8_t *bytes, uint32_t bit_pos, uint32_t num_bits, uint32_t val) { @@ -245,3 +270,104 @@ size_t rv_etrace_gen_encoded_format2_msg(uint8_t *buf= , uint64_t addr, =20 return HEADER_SIZE + header.length; } + +size_t rv_etrace_gen_encoded_format1_noaddr(uint8_t *buf, + uint8_t branches, + uint32_t branch_map) +{ + RVTraceMessageHeader header =3D {.flow =3D 0, .extend =3D 0, + .length =3D FORMAT1_BASE_PAYLOAD_SIZE_64BITS}; + RVTraceFormat1BasePayload payload =3D {.format =3D 0b01, + .branches =3D branches, .branch_map =3D branch_map}; + uint8_t bit_pos; + + rv_etrace_write_header(buf, header); + bit_pos =3D 8; + + rv_etrace_write_bits(buf, bit_pos, 2, payload.format); + bit_pos +=3D 2; + + rv_etrace_write_bits(buf, bit_pos, 5, payload.branches); + bit_pos +=3D 5; + + rv_etrace_write_bits(buf, bit_pos, 31, payload.branch_map); + + return HEADER_SIZE + header.length; +} + +/* + * Same reservations made in the format 2 helper: + * + * - irreport and irdepth is always =3D=3D updiscon; + * + * - return_stack_size_p + call_counter_size_p is hardcoded + * to 3 since we don't implement neither ATM. + */ +size_t rv_etrace_gen_encoded_format1(uint8_t *buf, + uint8_t branches, uint32_t branch_map, + uint64_t addr, + bool notify, bool updiscon) +{ + RVTraceMessageHeader header =3D {.flow =3D 0, .extend =3D 0}; + RVTraceFormat1Payload payload =3D {.format =3D 0b01, + .branches =3D branches, + .notify =3D notify, + .updiscon =3D updiscon}; + uint8_t payload_size =3D FORMAT1_PAYLOAD_MIN_SIZE_64BITS; + uint8_t branch_map_size =3D 0; + uint8_t bit_pos; + + g_assert(branches < 32); + + if (branches <=3D 3) { + branch_map_size =3D 3; + } else if (branches <=3D 7) { + branch_map_size =3D 7; + payload_size++; + } else if (branches <=3D 15) { + branch_map_size =3D 15; + payload_size +=3D 2; + } else { + branch_map_size =3D 31; + payload_size +=3D 4; + } + + header.length =3D payload_size; + + rv_etrace_write_header(buf, header); + bit_pos =3D 8; + + payload.addressLow =3D extract64(addr, 0, 32); + payload.addressHigh =3D extract64(addr, 32, 32); + + payload.irreport =3D updiscon; + if (updiscon) { + payload.irdepth =3D 0b111; + } else { + payload.irdepth =3D 0; + } + + rv_etrace_write_bits(buf, bit_pos, 2, payload.format); + bit_pos +=3D 2; + + rv_etrace_write_bits(buf, bit_pos, 5, payload.branches); + bit_pos +=3D 5; + + rv_etrace_write_bits(buf, bit_pos, branch_map_size, payload.branch_map= ); + bit_pos +=3D branch_map_size; + + rv_etrace_write_bits(buf, bit_pos, 32, payload.addressLow); + bit_pos +=3D 32; + rv_etrace_write_bits(buf, bit_pos, 32, payload.addressHigh); + bit_pos +=3D 32; + + rv_etrace_write_bits(buf, bit_pos, 1, payload.notify); + bit_pos +=3D 1; + rv_etrace_write_bits(buf, bit_pos, 1, payload.updiscon); + bit_pos +=3D 1; + rv_etrace_write_bits(buf, bit_pos, 1, payload.irreport); + bit_pos +=3D 1; + rv_etrace_write_bits(buf, bit_pos, 3, payload.irdepth); + + return HEADER_SIZE + header.length; +} diff --git a/hw/riscv/rv-trace-messages.h b/hw/riscv/rv-trace-messages.h index 50a4a0ef19..2b371641a4 100644 --- a/hw/riscv/rv-trace-messages.h +++ b/hw/riscv/rv-trace-messages.h @@ -28,5 +28,12 @@ size_t rv_etrace_gen_encoded_trap_msg(uint8_t *buf, uint= 64_t trap_addr, uint64_t tval); size_t rv_etrace_gen_encoded_format2_msg(uint8_t *buf, uint64_t addr, bool notify, bool updiscon); +size_t rv_etrace_gen_encoded_format1_noaddr(uint8_t *buf, + uint8_t branches, + uint32_t branch_map); +size_t rv_etrace_gen_encoded_format1(uint8_t *buf, + uint8_t branches, uint32_t branch_map, + uint64_t addr, + bool notify, bool updiscon); =20 #endif --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861868; cv=none; d=zohomail.com; s=zohoarc; b=FyWxnRbPTOVP3sC8xYZCXAhffuPmotzNFq9+NEwJB61Ex74RFtUTH/ZvzOtKgQBdv9lzgJpjaP+Uzu/wewt7UnNHRhazpmJbgxJnpMNj+E5Ew7Kts1ev/DfPPtZJ8PwT8c4OCa/MSmB58S2lEwB8DYZOcVTtIQJmWaR0Iy0f7QY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861868; 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=lpQVY4NISu/ik+Tbx2HNl6JcAWJQl7TZbFrzNsX0wvg=; b=JvvuABCUWJcZWkQ4y04cln6eQxQbtOIvPqcFGKidnUj6NJo+bawYcG8kRAAZzRZe6j8CcMMWMsM1WpzUhIKDDl2f5vtmYxwJy2pAYaZt+gXp99hN2i7JElno6YMAx7uDd1W524u9MLRhILCHJrwisZxIYCA6H7wE5lPq5NwYmzo= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861868393722.7661186965554; Tue, 11 Nov 2025 03:51:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImt8-00024J-D8; Tue, 11 Nov 2025 06:50:19 -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 1vImrk-0008Aj-CV for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:52 -0500 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImri-0004aP-AC for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:51 -0500 Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-295ceaf8dacso42651745ad.0 for ; Tue, 11 Nov 2025 03:48:49 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.48.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:48:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861728; x=1763466528; 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=lpQVY4NISu/ik+Tbx2HNl6JcAWJQl7TZbFrzNsX0wvg=; b=LV42o9/TOZflOZq0hvXELFHq/beVcovb2Fi1QEYYgqmRDXo31/G782TC1a+ypHEukK 3lGcxvrywDsgQRlmzVyhCZIKNo9zwKZpVxoV0zDnDnM+BtqSGuzgR6x/kdUDLsYbN3Hb YQq64mXFkZvR8lYvBcFBCXPG8W5eZY23zaR5QiL/PhtMH1DtiLN9tP+pJzhpbtSmn5xx 20j4r3syPxQHv1FuvmmjqmbGADpo91vaozpzu9gn78YlbMh+H8NkiGk9sNMWlM6Q8AXH ZFkriKzoXhoFFXiWQPzaoS6AI0UyABa0p3CwhxN9XZwCjmvmxXwd7TlrOJzQbHZpn90K gbuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861728; x=1763466528; 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=lpQVY4NISu/ik+Tbx2HNl6JcAWJQl7TZbFrzNsX0wvg=; b=QMqhBLnX+U0fLrbAywHe9L01zsXYK3rSUFThTHPYQ4icBwShzh4Drne+unsgQsIsbv /Ltie1nuUj4EW20FYiCKs06NAJzm/GES2vKn9TQHxJgAc1RqF3xyOLFlrWMIgKwJYUPB 0Awe7SaCbwBt7NceOFrzHLvw8DNI2fbn7Fj/G93Y1zNlWnG/EfzZZmxTVCf4VdBhDDDT 2BoZAClyqjbZTwlagc/CW/aYkPf29E4wPf7rBJNc1MQaWF0vOgKLMPHMq0diFm7dGc9F YZ+MrBKHDgEpUMFZ7NYJtlPz9bjLMydTJtwa+43XHvdEA/zz+L9N7o2hNTAU1cSb6WXz 6zNg== X-Gm-Message-State: AOJu0YzorC4ixEECfYuuin/r5MuG3FkLNHzB3PdhzuxDZerBNlrRW8hh Y2v6/41j6f6Gh2pIXcHwjOHSPf+zeeAZaV4KYqt7//QZtH3e50slOhS4DYAUhzWf/XloG96p1KI IID8jdUE= X-Gm-Gg: ASbGncsb9v4Iq5Hr6GC+XDiR6VK00xxk6sHevDPuoeRm5ywvCmYhyrn1M1kej/f+70Z Hr0LadoWqDjECvfoPsSGb1nhcBk/zZiZY7FJDfOPvv9vzBjInVvlL3KiSnEk1GL/4GoXJzFjRrz vdIxlzviUE2kjYtYjEbsDqq8vLW172eM+WKf8ID1G/RYzVd2nCELyZEt8kN0cnoplhtLxWMg8Ar RrLTXMXihFMrAc1b4WQBgIT/4qr0MwiLUo2SQx3jP/ubLDLXVM8NVtQj7o4xyOC6f430SYJ2bnH IHS5tby73Kujl1pje9DF4yIUJcu7BjpmWojekwBkp+igOe92nlZQz1lk1nkG0pSv/x6gaOyoz1U RLTR4K5qpGZpnjdEjTE2pVM855c0xkjxzkefrDPTiBLADY+U2eq1ifz20QZY2NOHl80f5FPk9t/ Xs1e0uUsuHCtD28vhiJ21xuGHbzTmR4SLjV6yzfg== X-Google-Smtp-Source: AGHT+IFtft3zogg+yN7/V2ywtS6cRScCK2+n9l41K3bM+pM58QFg2kBxmguYP2E005lY2bfepNsr0A== X-Received: by 2002:a17:903:1a2e:b0:295:5945:2930 with SMTP id d9443c01a7336-297e5411a06mr168238605ad.2.1762861728591; Tue, 11 Nov 2025 03:48:48 -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 v2 16/17] hw/riscv/trace-encoder: send branches info Date: Tue, 11 Nov 2025 08:46:55 -0300 Message-ID: <20251111114656.2285048-17-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::62a; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x62a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861869760153000 Content-Type: text/plain; charset="utf-8" Branch info is reported via the TCG helpers, updating the trace encoder internal branch map. Branch packets are sent in two circunstances: - when the branch map is full; - when an updiscon packet is about to be sent and the branch map isn't empty. The former will trigger a Format 1 no-addr packet, the latter a Format 1 with the updiscon address. Signed-off-by: Daniel Henrique Barboza --- hw/riscv/trace-encoder.c | 52 ++++++++++++++++++++++++- hw/riscv/trace-encoder.h | 4 ++ target/riscv/helper.h | 1 + target/riscv/insn_trans/trans_rvi.c.inc | 13 +++++++ target/riscv/trace_helper.c | 12 ++++++ 5 files changed, 81 insertions(+), 1 deletion(-) diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 5572483d26..5b8f773b11 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -29,6 +29,8 @@ */ #define TRACE_MSG_MAX_SIZE 32 =20 +#define TRACE_MAX_BRANCHES 31 + static TracePrivLevel trencoder_get_curr_priv_level(TraceEncoder *te) { CPURISCVState *env =3D &te->cpu->env; @@ -313,6 +315,9 @@ static void trencoder_reset(DeviceState *dev) te->trace_running =3D false; te->trace_next_insn =3D false; env->trace_running =3D false; + + te->branch_map =3D 0; + te->branches =3D 0; } =20 static void trencoder_realize(DeviceState *dev, Error **errp) @@ -410,9 +415,20 @@ static void trencoder_send_updiscon(TraceEncoder *tren= coder, uint64_t pc) bool updiscon =3D !notify; uint8_t msg_size; =20 - msg_size =3D rv_etrace_gen_encoded_format2_msg(format2_msg, pc, + if (trencoder->branches > 0) { + msg_size =3D rv_etrace_gen_encoded_format1(format2_msg, + trencoder->branches, + trencoder->branch_map, + pc, notify, updiscon); + trencoder->branches =3D 0; + } else { + msg_size =3D rv_etrace_gen_encoded_format2_msg(format2_msg, pc, + notify, + updiscon); + } + trencoder_send_message_smem(trencoder, format2_msg, msg_size); =20 trencoder->updiscon_pending =3D false; @@ -457,6 +473,40 @@ void trencoder_trace_trap_insn(Object *trencoder_obj, trencoder_send_message_smem(trencoder, msg, msg_size); } =20 +static void trencoder_send_branch_map(Object *trencoder_obj) +{ + TraceEncoder *te =3D TRACE_ENCODER(trencoder_obj); + g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); + uint8_t msg_size; + + msg_size =3D rv_etrace_gen_encoded_format1_noaddr(msg, + te->branches, + te->branch_map); + trencoder_send_message_smem(te, msg, msg_size); +} + +void trencoder_report_branch(Object *trencoder_obj, uint64_t pc, bool take= n) +{ + TraceEncoder *te =3D TRACE_ENCODER(trencoder_obj); + + /* + * Note: the e-trace spec determines the value '1' for a + * branch *not* taken. The helper API is using taken =3D 1 + * to be more intuitive when reading TCG code. + */ + if (!taken) { + te->branch_map =3D deposit32(te->branch_map, te->branches, 1, 1); + } + + te->last_branch_pc =3D pc; + te->branches++; + + if (te->branches =3D=3D TRACE_MAX_BRANCHES) { + trencoder_send_branch_map(trencoder_obj); + te->branches =3D 0; + } +} + void trencoder_trace_ppccd(Object *trencoder_obj, uint64_t pc) { TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h index 0c44092ccb..854f8a9ad6 100644 --- a/hw/riscv/trace-encoder.h +++ b/hw/riscv/trace-encoder.h @@ -28,6 +28,9 @@ struct TraceEncoder { uint32_t reg_mem_size; =20 uint64_t first_pc; + uint64_t last_branch_pc; + uint32_t branch_map; + uint8_t branches; =20 hwaddr baseaddr; hwaddr dest_baseaddr; @@ -54,5 +57,6 @@ void trencoder_trace_trap_insn(Object *trencoder_obj, uint64_t tval); void trencoder_trace_ppccd(Object *trencoder_obj, uint64_t pc); void trencoder_report_updiscon(Object *trencoder_obj); +void trencoder_report_branch(Object *trencoder_obj, uint64_t pc, bool take= n); =20 #endif diff --git a/target/riscv/helper.h b/target/riscv/helper.h index f27ff319e9..b1de064e17 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -132,6 +132,7 @@ DEF_HELPER_6(csrrw_i128, tl, env, int, tl, tl, tl, tl) /* Trace helpers (should be put inside ifdef) */ DEF_HELPER_2(trace_insn, void, env, i64) DEF_HELPER_1(trace_updiscon, void, env) +DEF_HELPER_3(trace_branch, void, env, tl, int) =20 #ifndef CONFIG_USER_ONLY DEF_HELPER_1(sret, tl, env) diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index ac00cbc802..ee29adbdeb 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -268,6 +268,15 @@ static void gen_setcond_i128(TCGv rl, TCGv rh, tcg_gen_movi_tl(rh, 0); } =20 +static void gen_trace_branch(int taken) +{ + TCGLabel *skip =3D gen_new_label(); + + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_trace_running, 0, skip); + gen_helper_trace_branch(tcg_env, cpu_pc, tcg_constant_i32(taken)); + gen_set_label(skip); +} + static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond) { TCGLabel *l =3D gen_new_label(); @@ -299,11 +308,15 @@ static bool gen_branch(DisasContext *ctx, arg_b *a, T= CGCond cond) } #endif =20 + gen_trace_branch(0); + gen_goto_tb(ctx, 1, ctx->cur_insn_len); ctx->pc_save =3D orig_pc_save; =20 gen_set_label(l); /* branch taken */ =20 + gen_trace_branch(1); + if (!riscv_cpu_allow_16bit_insn(ctx->cfg_ptr, ctx->priv_ver, ctx->misa_ext) && diff --git a/target/riscv/trace_helper.c b/target/riscv/trace_helper.c index 4b2b645f04..b48b89e0db 100644 --- a/target/riscv/trace_helper.c +++ b/target/riscv/trace_helper.c @@ -37,6 +37,13 @@ void helper_trace_updiscon(CPURISCVState *env) te->updiscon_pending =3D true; te->trace_next_insn =3D true; } + +void helper_trace_branch(CPURISCVState *env, target_ulong pc, int taken) +{ + RISCVCPU *cpu =3D env_archcpu(env); + + trencoder_report_branch(cpu->trencoder, pc, taken); +} #else /* #ifndef CONFIG_USER_ONLY */ void helper_trace_insn(CPURISCVState *env, uint64_t pc) { @@ -47,4 +54,9 @@ void helper_trace_updiscon(CPURISCVState *env) { return; } + +void helper_trace_branch(CPURISCVState *env, target_ulong pc, int taken) +{ + return; +} #endif /* #ifndef CONFIG_USER_ONLY*/ --=20 2.51.1 From nobody Fri Nov 14 22:22:14 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1762861935; cv=none; d=zohomail.com; s=zohoarc; b=nisPVuMIf+UZGrUB7/tJW8TtYNaUYyzjKvbLpDluAhhZzlDHW1RPUyK1hOMvUPjt80Fqjq/m+JR7TXbSjwSFd6RD1u4Eo4SNBWWOnOHGweCZsE2Lggh6Fd5X3/dj7x97lF/Ykovjvlcj1YgdDz4oHCRumRBRW4T2h66Y/EoECdc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1762861935; 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=kMw21UKyK4t+LLYVevUj5AWfKcUQpnJ5koYbjOeAsAc=; b=Fr1Pi/lHsYbnTazt3BTp9Dr3ruy4ih7XwLYEFRU1ZBYJ1cpdMRj6GjEkiRKzJnR431eC54xgcSbIySP9S4SdxEcI+1DMoHZdUB3Ws2OgYyWBxyVhT6B/rLAQZeVZpetOvJxSQ0q6cwT9VhWtaghePgLC7IawY1l1/oFF53DflAw= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1762861935090356.8531191419653; Tue, 11 Nov 2025 03:52:15 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vImtD-0002hx-Ux; Tue, 11 Nov 2025 06:50:24 -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 1vImrq-0008MK-9f for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:49:00 -0500 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vImro-0004b6-HA for qemu-devel@nongnu.org; Tue, 11 Nov 2025 06:48:57 -0500 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-297d4ac44fbso6423515ad.0 for ; Tue, 11 Nov 2025 03:48:56 -0800 (PST) Received: from grind.dc1.ventanamicro.com ([179.93.21.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29651c747d1sm177533125ad.63.2025.11.11.03.48.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 03:48:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1762861735; x=1763466535; 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=kMw21UKyK4t+LLYVevUj5AWfKcUQpnJ5koYbjOeAsAc=; b=QRITqwmAU4rakrlcSj8fsPvcEssQjyRatrR6siDYNA3DHJbNUhOVZ6DSAhvQn6m+I6 Vb2ZGziPPDK5IB2Y6zbWm/VOaajEUt9uut5O11Du3e5wnLC8mp5jO6uQebGPBAttz4AQ ySw8gktTg2qe/anLSvzLOW7qJcBge93HlidWg1qMKgQRQTFYNdCAV59+g9DP99xzQK3W uXT0pn8zqPcxociHenDET3LJU9WeM+0qT3nZGuSOOt8e5NWS0nSA6Jlcj80c/KriFgrW sKQhWfdrrUsXjXNcg77MgwOSVnJkKilvvx/l4q+O0/Tg9qUXtwsWisPuxuEp/ejupbB4 oUjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762861735; x=1763466535; 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=kMw21UKyK4t+LLYVevUj5AWfKcUQpnJ5koYbjOeAsAc=; b=neHzY1mTLIqMsnHlAWBPoinHaxuliGvZczjZ0eCi4m38TWvsV2i1/C5Jn3hmNNvCNe DadsrTmQuna/3TLVR2U9/nS0GXCmPCmrbArA1mNze7NQBeEgWvrItqtckVWjqIMFWBmo w/QhZ/pAGXU5ieYgi/pOr0hujB3ccMeAvVLgbLl4vf9QshziK7W3ms31gQs+RJxc9kfe AB1mStpn+ohKhXyNLijuE7PAfY/kmr05gE1LoxOUqlGFGM0uWwuuAwcYWSlnsPmV3KoK ZBF7eCHtFTepeJwbeCaelssHGK/fYhuQLsY+wz/v433XesViEd7/X4AmbHs2G59k3Z+e +E+g== X-Gm-Message-State: AOJu0YzWlW/We7EczYFXxn8o1piXefY5QqpzHHd939wSX7WxWhsXCEWs jYka1UsxLRUr0AJM7zZrMjxt1M2ProhTGz6Ex2aoclnb7dUaJT8lWJ1iZGw+qwvCXcbF3rjvhpS 6272e9zg= X-Gm-Gg: ASbGncsx8wSVibiPEaCcUP8i4US7FJRMSMYRxL7u2tjlOdobC1/t63ajwtjWRDGPDSA tKby/acZHl3hfWB9yUgyLjeNvne6mAscKn/GVCU/QNq5ki2mB4k6RIVNslYt/pQQckw5aXXLGhq 922/AYmJ4c9OnFihio4vzOEOyixfRfdSu6hbWPAZz5tQtFcSJThL//TJPUEh8JvRoWR4vWk67si U6clNnEjoHqDirX7AVmBR8qLvTYhdOOG9HFCF0pcJ4Q+XuD08wQBw4b6+7d1VOe08WRTNRh+BdX gH1cwmQI1Bkv7FnG2+iA5neNJ4idiDhHEbTiFVQLxwLMdYACut1iXC9LR5aIWatAKlMZqBGEHmo S5b1Wx7MxiNVa+r+FVLHS/i4aZlqYscTEe1bV9lQuQfAEcbUL3TdClXkh8aqDwMHS8rKBRo72+x 3HCkd9x7ZUITsjNxaRM4B1ihrUSpkT+21IOPT53w== X-Google-Smtp-Source: AGHT+IGYm/nSXeXjJlUuHA7uZjEfwYGQm6kgEBF4QJobsyLe9FPWr9rDlbkokaZglq2gLw1AJ1K24w== X-Received: by 2002:a17:903:3bc8:b0:295:6850:a38d with SMTP id d9443c01a7336-29840842bdbmr35766615ad.19.1762861734691; Tue, 11 Nov 2025 03:48:54 -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 v2 17/17] hw/riscv/trace: update branch bit in sync messages Date: Tue, 11 Nov 2025 08:46:56 -0300 Message-ID: <20251111114656.2285048-18-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251111114656.2285048-1-dbarboza@ventanamicro.com> References: <20251111114656.2285048-1-dbarboza@ventanamicro.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::633; envelope-from=dbarboza@ventanamicro.com; helo=mail-pl1-x633.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @ventanamicro.com) X-ZM-MESSAGEID: 1762861937172158500 Content-Type: text/plain; charset="utf-8" Now that we have a working branch map update the branch bit in sync messages by checking if the sync address is a branch address that was taken (or not). Signed-off-by: Daniel Henrique Barboza --- hw/riscv/rv-trace-messages.c | 6 +++--- hw/riscv/rv-trace-messages.h | 3 ++- hw/riscv/trace-encoder.c | 30 ++++++++++++++++++++++++++++-- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/hw/riscv/rv-trace-messages.c b/hw/riscv/rv-trace-messages.c index a93b0adfc6..a0a0cbb6ce 100644 --- a/hw/riscv/rv-trace-messages.c +++ b/hw/riscv/rv-trace-messages.c @@ -115,11 +115,12 @@ static void rv_etrace_write_header(uint8_t *buf, RVTr= aceMessageHeader header) } =20 size_t rv_etrace_gen_encoded_sync_msg(uint8_t *buf, uint64_t pc, - TracePrivLevel priv_level) + TracePrivLevel priv_level, + bool pc_is_branch) { RVTraceSyncPayload payload =3D {.format =3D 0b11, .subformat =3D 0b00, - .branch =3D 1, + .branch =3D pc_is_branch, .privilege =3D priv_level}; RVTraceMessageHeader header =3D {.flow =3D 0, .extend =3D 0, .length =3D SYNC_PAYLOAD_SIZE_64BITS}; @@ -158,7 +159,6 @@ size_t rv_etrace_gen_encoded_trap_msg(uint8_t *buf, uin= t64_t trap_addr, { RVTraceTrapPayload payload =3D {.format =3D 0b11, .subformat =3D 0b01, - .branch =3D 1, .privilege =3D priv_level, .ecause =3D ecause}; RVTraceMessageHeader header =3D {.flow =3D 0, .extend =3D 0, diff --git a/hw/riscv/rv-trace-messages.h b/hw/riscv/rv-trace-messages.h index 2b371641a4..fd4bb10860 100644 --- a/hw/riscv/rv-trace-messages.h +++ b/hw/riscv/rv-trace-messages.h @@ -20,7 +20,8 @@ typedef enum { } TracePrivLevel; =20 size_t rv_etrace_gen_encoded_sync_msg(uint8_t *buf, uint64_t pc, - TracePrivLevel priv_level); + TracePrivLevel priv_level, + bool pc_is_branch); size_t rv_etrace_gen_encoded_trap_msg(uint8_t *buf, uint64_t trap_addr, TracePrivLevel priv_level, uint8_t ecause, diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 5b8f773b11..39ed8c8d54 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -394,15 +394,38 @@ static void trencoder_send_message_smem(TraceEncoder = *trencoder, trencoder_update_ramsink_writep(trencoder, dest, wrapped); } =20 +static bool trencoder_addr_is_branch_taken(TraceEncoder *te, uint64_t addr) +{ + uint8_t last_branch; + + if (te->branches =3D=3D 0) { + return false; + } + + if (te->last_branch_pc =3D=3D addr) { + last_branch =3D extract32(te->branches, te->branches - 1, 1); + + /* 0: branch taken, 1: not taken*/ + if (last_branch =3D=3D 0) { + return true; + } + } + + return false; +} + static void trencoder_send_sync_msg(Object *trencoder_obj, uint64_t pc) { TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); TracePrivLevel priv =3D trencoder_get_curr_priv_level(trencoder); g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); uint8_t msg_size; + bool is_branch_taken; =20 trencoder->first_pc =3D pc; - msg_size =3D rv_etrace_gen_encoded_sync_msg(msg, pc, priv); + is_branch_taken =3D trencoder_addr_is_branch_taken(trencoder, pc); + msg_size =3D rv_etrace_gen_encoded_sync_msg(msg, pc, priv, + is_branch_taken); =20 trencoder_send_message_smem(trencoder, msg, msg_size); } @@ -440,6 +463,7 @@ void trencoder_set_first_trace_insn(Object *trencoder_o= bj, uint64_t pc) TracePrivLevel priv =3D trencoder_get_curr_priv_level(trencoder); g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); uint8_t msg_size; + bool is_branch_taken; =20 if (trencoder->updiscon_pending) { trencoder_send_updiscon(trencoder, pc); @@ -447,7 +471,9 @@ void trencoder_set_first_trace_insn(Object *trencoder_o= bj, uint64_t pc) =20 trencoder->first_pc =3D pc; trace_trencoder_first_trace_insn(pc); - msg_size =3D rv_etrace_gen_encoded_sync_msg(msg, pc, priv); + is_branch_taken =3D trencoder_addr_is_branch_taken(trencoder, pc); + msg_size =3D rv_etrace_gen_encoded_sync_msg(msg, pc, priv, + is_branch_taken); =20 trencoder_send_message_smem(trencoder, msg, msg_size); } --=20 2.51.1