From patchwork Thu Aug 17 05:29:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Akihiko Odaki X-Patchwork-Id: 1822154 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=daynix-com.20221208.gappssmtp.com header.i=@daynix-com.20221208.gappssmtp.com header.a=rsa-sha256 header.s=20221208 header.b=foDAMsj/; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=patchwork.ozlabs.org) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RRDCX6qVVz1yNm for ; Thu, 17 Aug 2023 15:32:08 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qWVav-0006ZS-4t; Thu, 17 Aug 2023 01:30:53 -0400 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 1qWVas-0006W7-Uz for qemu-devel@nongnu.org; Thu, 17 Aug 2023 01:30:50 -0400 Received: from mail-pg1-x533.google.com ([2607:f8b0:4864:20::533]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qWVao-0003ms-UW for qemu-devel@nongnu.org; Thu, 17 Aug 2023 01:30:50 -0400 Received: by mail-pg1-x533.google.com with SMTP id 41be03b00d2f7-5650ef42f6dso4574762a12.0 for ; Wed, 16 Aug 2023 22:30:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20221208.gappssmtp.com; s=20221208; t=1692250245; x=1692855045; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=mQyi6gfRgbfl9Ba+HuBYDjs0BflAbozpyrrSa1VYhO8=; b=foDAMsj/Luf3JT0hF77ecWbCMXR62K/pt13rcHFIsAZecLufRI8U+vJeMkICee3tbc A2srfIbdFPgJ9EWMcmJQtXyeGs+nMTAeolhp1KLy0/t+oFI2Xb23lS285rPG5vBfOgjf +6B/Qk7f90KrqSgUxsYyTFoUPVwwLQlKy5zrSKCtl9uhrVf4Kd4zhJV7Uwda19LdJSn9 j1g8rwy76DBFRh17khvu/zqyK/V/pnfcSEP/kyVOsrhfpNOLgaX0lQ+ohALH34YgPcVs a1ZV45juk2ebZIHrrOXGBLCjDzMZvt7vZ8zhPB8v2OhHM/F98vnFn48GkJFWpMmu3lp2 i7YQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692250245; x=1692855045; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=mQyi6gfRgbfl9Ba+HuBYDjs0BflAbozpyrrSa1VYhO8=; b=JqSj+dY/PPciaU4baN9fWjZlCePtMQ9W1+Bw7OnOrzq10pS6qvJHh9/4OQazzFzbDa 3YdD+Pz7IfJiDfT9IjWMscp1a4tlj0Is4y7OsGr3PjZoFilGLhyLOXmOPjSw7nx/1MoN MMIYuhlJ1sdYNPvO8tZuQPVhUuQMc68vyiNxCM42A27NZ/cfH7zDrYws6Jew9+x0T6sT QK5sIrrOWTCB0KDuloThYOTA1rqQA0MwHTkQMQ6fnPD65lnmx/gudTTh9Ael2fKgsSGC TmL6n6rWMPJLd1DrWzyr3OXudKXLqwp6Ebibc0q6t4dqJy4GMK5HAypXLdTXk4dhbgfq 1rkQ== X-Gm-Message-State: AOJu0Yx3vnYFyW/SVXD0aHsucqjB0QTgdZja9DrlLEZWKwkoa5hkejL8 a2IylyU9Ub5NJ2BtXzsOXzbmEg== X-Google-Smtp-Source: AGHT+IGfYhrcUvpGzOTYqb82+q9qq2vUi7LvrswIp9J2Txc3w26+L40Re4cMZJpHZ5HqbFY3M4ZlFQ== X-Received: by 2002:a05:6a20:729d:b0:13d:ee19:771f with SMTP id o29-20020a056a20729d00b0013dee19771fmr5340005pzk.8.1692250245092; Wed, 16 Aug 2023 22:30:45 -0700 (PDT) Received: from alarm.flets-east.jp ([2400:4050:a840:1e00:78d2:b862:10a7:d486]) by smtp.gmail.com with ESMTPSA id j18-20020aa783d2000000b00662610cf7a8sm12339407pfn.172.2023.08.16.22.30.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Aug 2023 22:30:44 -0700 (PDT) From: Akihiko Odaki To: Cc: Paolo Bonzini , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , Alexandre Iooss , Mahmoud Mandour , Eduardo Habkost , Marcel Apfelbaum , =?utf-8?q?Philippe_Mathieu-D?= =?utf-8?q?aud=C3=A9?= , Yanan Wang , Richard Henderson , =?utf-8?q?Marc-Andr=C3=A9?= =?utf-8?q?_Lureau?= , =?utf-8?q?Daniel_P_=2E_B?= =?utf-8?q?errang=C3=A9?= , John Snow , Cleber Rosa , Peter Maydell , Michael Rolnik , "Edgar E . Iglesias" , Brian Cain , Song Gao , Xiaojuan Yang , Laurent Vivier , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Chris Wulff , Marek Vasut , Stafford Horne , Daniel Henrique Barboza , =?utf-8?q?C=C3=A9dric_Le_G?= =?utf-8?q?oater?= , David Gibson , Greg Kurz , Nicholas Piggin , Palmer Dabbelt , Alistair Francis , Bin Meng , Weiwei Li , Liu Zhiwei , Yoshinori Sato , David Hildenbrand , Ilya Leoshkevich , Mark Cave-Ayland , Artyom Tarasenko , Bastian Koppelmann , Max Filippov , qemu-devel@nongnu.org, qemu-arm@nongnu.org, qemu-ppc@nongnu.org, qemu-riscv@nongnu.org, qemu-s390x@nongnu.org, Anton Kochkov , Akihiko Odaki Subject: [PATCH v5 00/26] plugins: Allow to read registers Date: Thu, 17 Aug 2023 14:29:47 +0900 Message-ID: <20230817053017.24207-1-akihiko.odaki@daynix.com> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 Received-SPF: none client-ip=2607:f8b0:4864:20::533; envelope-from=akihiko.odaki@daynix.com; helo=mail-pg1-x533.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=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+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org I and other people in the University of Tokyo, where I research processor design, found TCG plugins are very useful for processor design exploration. The feature we find missing is the capability to read registers from plugins. In this series, I propose to add such a capability by reusing gdbstub code. The reuse of gdbstub code ensures the long-term stability of the TCG plugin interface for register access without incurring a burden to maintain yet another interface for register access. This process to add TCG plugin involves four major changes. The first one is to add GDBFeature structure that represents a GDB feature, which usually includes registers. GDBFeature can be generated from static XML files or dynamically generated by architecture-specific code. In fact, this is a refactoring independent of the feature this series adds, and potentially it's benefitial even without the plugin feature. The plugin feature will utilize this new structure to describe registers exposed to plugins. The second one is to make gdb_read_register/gdb_write_register usable outside of gdbstub context. The third one is to actually make registers readable for plugins. The last one is to allow to implement a QEMU plugin in C++. A plugin that I'll describe later is written in C++. The below is a summary of patches: Patch 01 fixes a bug in execlog plugin. Patch [02, 16] introduce GDBFeature. Patch 17 adds information useful for plugins to GDBFeature. Patch [18, 21] make registers readable outside of gdbstub context. Patch [22, 24] add the feature to read registers from plugins. Patch [25, 26] make it possible to write plugins in C++. The execlog plugin will have new options to demonstrate the new feature. I also have a plugin that uses this new feature to generate execution traces for Sniper processor simulator, which is available at: https://github.com/shioya-lab/sniper/tree/akihikodaki/bb V4 -> V5: Corrected g_rw_lock_writer_lock() call. (Richard Henderson) Replaced abort() with g_assert_not_reached(). (Richard Henderson) Fixed CSR name leak in target/riscv. (Richard Henderson) Removed gdb_has_xml variable. V3 -> V4: Added execlog changes I forgot to include in the last version. V2 -> V3: Added patch "hw/core/cpu: Return static value with gdb_arch_name()". Added patch "gdbstub: Dynamically allocate target.xml buffer". (Alex Bennée) Added patch "gdbstub: Introduce GDBFeatureBuilder". (Alex Bennée) Dropped Reviewed-by tags for "target/*: Use GDBFeature for dynamic XML". Changed gdb_find_static_feature() to abort on failure. (Alex Bennée) Changed the execlog plugin to log the register value only when changed. (Alex Bennée) Dropped 0x prefixes for register value logs for conciseness. V1 -> V2: Added SPDX-License-Identifier: GPL-2.0-or-later. (Philippe Mathieu-Daudé) Split long lines. (Philippe Mathieu-Daudé) Renamed gdb_features to gdb_static_features (Philippe Mathieu-Daudé) Dropped RFC. Akihiko Odaki (26): contrib/plugins: Use GRWLock in execlog gdbstub: Introduce GDBFeature structure gdbstub: Add num_regs member to GDBFeature gdbstub: Introduce gdb_find_static_feature() target/arm: Move the reference to arm-core.xml hw/core/cpu: Replace gdb_core_xml_file with gdb_core_feature gdbstub: Introduce GDBFeatureBuilder target/arm: Use GDBFeature for dynamic XML target/ppc: Use GDBFeature for dynamic XML target/riscv: Use GDBFeature for dynamic XML gdbstub: Use GDBFeature for gdb_register_coprocessor gdbstub: Use GDBFeature for GDBRegisterState hw/core/cpu: Return static value with gdb_arch_name() gdbstub: Dynamically allocate target.xml buffer gdbstub: Simplify XML lookup hw/core/cpu: Remove gdb_get_dynamic_xml member gdbstub: Add members to identify registers to GDBFeature target/arm: Remove references to gdb_has_xml target/ppc: Remove references to gdb_has_xml gdbstub: Remove gdb_has_xml variable gdbstub: Expose functions to read registers cpu: Call plugin hooks only when ready plugins: Allow to read registers contrib/plugins: Allow to log registers plugins: Support C++ contrib/plugins: Add cc plugin MAINTAINERS | 2 +- docs/devel/tcg-plugins.rst | 18 +++- configure | 15 ++- meson.build | 2 +- gdbstub/internals.h | 2 +- include/exec/gdbstub.h | 51 +++++++-- include/hw/core/cpu.h | 11 +- include/qemu/qemu-plugin.h | 69 +++++++++++- target/arm/cpu.h | 26 ++--- target/arm/internals.h | 2 +- target/ppc/cpu-qom.h | 3 +- target/ppc/cpu.h | 3 +- target/ppc/internal.h | 2 +- target/riscv/cpu.h | 4 +- target/s390x/cpu.h | 2 - contrib/plugins/execlog.c | 150 ++++++++++++++++++++------ cpu.c | 11 -- gdbstub/gdbstub.c | 198 +++++++++++++++++++++++----------- gdbstub/softmmu.c | 3 +- gdbstub/user.c | 1 - hw/core/cpu-common.c | 10 ++ plugins/api.c | 40 +++++++ stubs/gdbstub.c | 6 +- target/arm/cpu.c | 12 +-- target/arm/cpu64.c | 8 +- target/arm/gdbstub.c | 202 +++++++++++++---------------------- target/arm/gdbstub64.c | 90 +++++++--------- target/arm/tcg/cpu32.c | 3 +- target/avr/cpu.c | 4 +- target/hexagon/cpu.c | 5 +- target/i386/cpu.c | 13 ++- target/loongarch/cpu.c | 8 +- target/loongarch/gdbstub.c | 2 +- target/m68k/cpu.c | 7 +- target/m68k/helper.c | 6 +- target/microblaze/cpu.c | 9 +- target/ppc/cpu_init.c | 9 +- target/ppc/gdbstub.c | 80 ++++---------- target/riscv/cpu.c | 27 ++--- target/riscv/gdbstub.c | 89 +++++++-------- target/rx/cpu.c | 4 +- target/s390x/cpu.c | 8 +- target/s390x/gdbstub.c | 28 ++--- target/tricore/cpu.c | 4 +- contrib/plugins/Makefile | 5 + contrib/plugins/cc.cc | 17 +++ plugins/qemu-plugins.symbols | 2 + scripts/feature_to_c.py | 102 ++++++++++++++++++ scripts/feature_to_c.sh | 69 ------------ tests/tcg/Makefile.target | 3 + 50 files changed, 825 insertions(+), 622 deletions(-) create mode 100644 contrib/plugins/cc.cc create mode 100755 scripts/feature_to_c.py delete mode 100644 scripts/feature_to_c.sh