From nobody Fri Dec 19 09:50:26 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1747820723; cv=none; d=zohomail.com; s=zohoarc; b=PYJxPcrFuaPRunYrmpewqxmmdjcXfPFq6B9VD/JmbxCCjr9bzhFlQSP0hQtvEjJ/99OKRjm+TLM5l3dagJoLklBlDdZjFQuwhNojVLLz/swuhI5N2hiTNRqjghgZDxXbs5c02JEiJqa+wi/+P7MSwaq6KCaYmDBwOVA8kAeHDhE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1747820723; 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=bsL+OiRjSHcs+rGSJPYZBhAIDimvy0y883YjsPcJU3c=; b=A2DaUrxEh7WMz1zTq4bPr3IG3Ts4V5lC2NpITz4Fm6qgWCyFGISkb+zksQmxUn4nHfe/uEoe+clO++1W2cNQXjdGGz5SyobyfgsF1Zcv+C1vhbQCL9m3oKRnGOTwCutLZ7174WWR0dj5/ZjMrtdnbbIm5gOzxseNv4nIySCOvrk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 174782072304552.93305888234681; Wed, 21 May 2025 02:45:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uHfzD-0002cC-5t; Wed, 21 May 2025 05:43:43 -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 1uHfzB-0002bo-0I for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:41 -0400 Received: from mail-pf1-x432.google.com ([2607:f8b0:4864:20::432]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uHfz7-0001bP-Ig for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:39 -0400 Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-742c035f2afso2569622b3a.2 for ; Wed, 21 May 2025 02:43:36 -0700 (PDT) Received: from shemhazi.lan ([50.46.174.34]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-742a9829b87sm9255668b3a.114.2025.05.21.02.43.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 02:43:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747820615; x=1748425415; 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=bsL+OiRjSHcs+rGSJPYZBhAIDimvy0y883YjsPcJU3c=; b=WkJGWtURlUDh3WZ3HeCYS/2LP+V8e8neQuJtAd2hd3c9nb5khBAy76qc32i3RzCwCJ 8SRB/FveG3pAm+Zvm+4Jf5RYEIKEUaW6A/GA7ZsGuQfGs8KAvUVDrchi5v4oR5MjZWr3 mJhd1Fo8ee0XgpqV6TGCK+0l7hTrGFhfG1vSKLtNZy/YkSEs8EXCVMzMgPAUWqTc/eL8 Rqx4CGf0PhDciV59C9dg/2djcIvUwd7VlzsJIu4Z6ItR6y9eaGuKbe10wSYkKSw49WSJ 8H0ZLp8fn70T7uYPFbQNhvJZDbR6FqPJA3gmwgzCmYYmxJl8ssvpdweRRY+5SJbbxkXy 3A6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747820615; x=1748425415; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bsL+OiRjSHcs+rGSJPYZBhAIDimvy0y883YjsPcJU3c=; b=BmfyL1IBvp9d0zvvoKYL1R70iCDTBi1QA6whAFdMwSx7+7CmalWe3Eo8++EEYypiry W7e0WXftkHpvJFpaMfBB+WrECxr8N1HQ3BGlL4nXYUnq2S+JqiV9Nfu9wYYk/K6srQ1E /M9m00JKd4mMtqHD0hvipTK7GXlLuRAwqZRz02muynPVHmokI8Tn5cv9XE85OCYrf7lF DJ/wvu8gzkRflrozy+c9q2RvGvw9pRHs7CnoaYWYQtupgGHWr9Fjjpl772dtLyrN9y1B GaKJOLvJgPn/36f8QQPWxKmNuojRNDdjc+ihSpPbzvMi4Av6XTt2IAjoco5/4eAg2kPh DRBg== X-Gm-Message-State: AOJu0Yw6ougUa921iH0AGgIXzZ9iwy8xAur3HmukXfdBqoVjSGM78tn7 SSxil3ejWexypWgBm2GPSsO+advNQ3l0irYzzoVWP2zEO6xW/3hAYrL/7HNfwDjvg1U= X-Gm-Gg: ASbGncu8RFGwC5i27VHlqOIYQP/O7rUpuInSeJREY8JuY3q5BdnOBemVD3qwz6U5jgA V6VxmXDMoGaeVLzE5YeVV536IM4ouXT8RtdP+MHIG1V9VH84CnzIC0VeRsEg/0Ok3+ntNQzT2TC srSGPKeiwTx7xUFWeLWgmmdIr9dE9+Fx/FIXr9NB741hC5FaxG+G/6FQN2iMmZJpQKVnBbTcjid 49VA4BSL/rDxP/um0jenfJ+JCNVCAOQmupbOJl5pTXn2e7y0MUN69hOD5zt2c4jy2fOZgsnjjV3 xECJEgImiE3AXix+C5ilmhcjHcAT19OhkoW/zfPRITiVbadmfyQ= X-Google-Smtp-Source: AGHT+IHjVhTat9Lw9QCdKb+fY0D01nb4CDAX4nMXCk9pryB3mklRaA00mQC3LE78kQlvzplF+271JQ== X-Received: by 2002:a05:6a00:3c96:b0:73e:30af:f479 with SMTP id d2e1a72fcca58-742a98ad9famr25092052b3a.19.1747820614766; Wed, 21 May 2025 02:43:34 -0700 (PDT) From: Rowan Hart To: qemu-devel@nongnu.org Cc: Pierrick Bouvier , Alexandre Iooss , Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Eduardo Habkost , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Paolo Bonzini , novafacing Subject: [PATCH v3 1/8] Expose gdb_write_register function to consumers of gdbstub Date: Wed, 21 May 2025 02:43:25 -0700 Message-ID: <20250521094333.4075796-2-rowanbhart@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250521094333.4075796-1-rowanbhart@gmail.com> References: <20250521094333.4075796-1-rowanbhart@gmail.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::432; envelope-from=rowanbhart@gmail.com; helo=mail-pf1-x432.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, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1747820724416116600 Content-Type: text/plain; charset="utf-8" From: novafacing Signed-off-by: novafacing Signed-off-by: Rowan Hart Reviewed-By: Julian Ganz Reviewed-by: Pierrick Bouvier --- gdbstub/gdbstub.c | 2 +- include/exec/gdbstub.h | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c index 565f6b33a9..5846e481be 100644 --- a/gdbstub/gdbstub.c +++ b/gdbstub/gdbstub.c @@ -534,7 +534,7 @@ int gdb_read_register(CPUState *cpu, GByteArray *buf, i= nt reg) return 0; } =20 -static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg) +int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg) { GDBRegisterState *r; =20 diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h index 0675b0b646..a16c0051ce 100644 --- a/include/exec/gdbstub.h +++ b/include/exec/gdbstub.h @@ -124,6 +124,20 @@ const GDBFeature *gdb_find_static_feature(const char *= xmlname); */ int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); =20 +/** + * gdb_write_register() - Write a register associated with a CPU. + * @cpu: The CPU associated with the register. + * @buf: The buffer that the register contents will be set to. + * @reg: The register's number returned by gdb_find_feature_register(). + * + * The size of @buf must be at least the size of the register being + * written. + * + * Return: The number of written bytes, or 0 if an error occurred (for + * example, an unknown register was provided). + */ +int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg); + /** * typedef GDBRegDesc - a register description from gdbstub */ --=20 2.49.0 From nobody Fri Dec 19 09:50:26 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1747820648; cv=none; d=zohomail.com; s=zohoarc; b=jje+ZPX3uTyrshBiCdHn5JbQ0ZDYp0XpIaWvWRJ1D1lgFilEQoaYd5B3ETpSp/GZQpw/2dzD7VyZI3nGMZO4szG6oxiOK0cUa+NXeyYE/iyXYgU4pfhOSKDCaP2Xt9wqK96qZa/11sxL1K5NCFcZDesZx9Uge6hMYXaK025BItM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1747820648; 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=M9l29Gqtnblx1C+tXQ0EhOa9NoMzGN3zx9AMjGXDdxI=; b=B4TXX+WYhPJwioNrHo1GM3aD/FeTEJ7LPPaBuGGixm83+Pp5rXZ94E2dkIiBW4TtCCoi9Q6p1UAGfbufPUQAJAcqOhSrlAviFA3J+gEFI3EU6Esij+D9Bl0DervokWf66ea/6ozYqStqISX9vNky8IsxE0eV9FntRzZbileq2qo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1747820648886485.71414550134443; Wed, 21 May 2025 02:44:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uHfzE-0002cb-BJ; Wed, 21 May 2025 05:43:44 -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 1uHfzC-0002cD-Go for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:42 -0400 Received: from mail-pf1-x42e.google.com ([2607:f8b0:4864:20::42e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uHfz8-0001bW-4S for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:41 -0400 Received: by mail-pf1-x42e.google.com with SMTP id d2e1a72fcca58-7425bd5a83aso6578940b3a.0 for ; Wed, 21 May 2025 02:43:37 -0700 (PDT) Received: from shemhazi.lan ([50.46.174.34]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-742a9829b87sm9255668b3a.114.2025.05.21.02.43.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 02:43:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747820616; x=1748425416; 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=M9l29Gqtnblx1C+tXQ0EhOa9NoMzGN3zx9AMjGXDdxI=; b=G21BWw55spQjVAIknVTTecqFuax8WKOrm7oIrQ4db0nZ1j0+X81z8P750udp00JnsC 84OaX1qU768SxwFSm6Q+M0dzvUf7+DWpRv9yoR+D+Z94aBojL1P9yDslIrKRmnY/4Ypu 4zZAadXkw39sC4JyIjJu4g7nQHIZDT5TZ1zpmWpIMxLRBg/BQACO57ge038R9S3BymO2 CakG8vB7H1qyroyKbNr6H08IskOgjA8i9nQPqaLfH2JYCZqrm1ITQBLjzRrqOWiJD34g IZNoftXGiCDecnqDG19T02srWd6NplfinKhi/+Vr3guqGhSTzUxDoBjCb4BSeeQL7wQa C9cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747820616; x=1748425416; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=M9l29Gqtnblx1C+tXQ0EhOa9NoMzGN3zx9AMjGXDdxI=; b=Jhf015ejDXkUXytd+WMku55dHMopUDsjvw9KME1HhDAF3U4ThQjn4jtvCIjzwKN4iw 06ze2jgG9/88KYARpicovBUwXaopb+5lAwt3OjQmswZQpmukmRfDvw2BWFRls9/wvVha JOM/oQSGWGUuD3ktmNMFeCsYRJmg3KtzNa3jzLbUt0QMqsxGnGv/sDH2Fmtyr1/xqJRl 6PX53MdOGDkd6V+Oz51kNvoYsVHKpOxRTmjs8m4tmuHG37g4+Ghz8jOylvtZ723k4RLn RuYDtavmOry9XlNJY0wpJZap8m2tjqkwiEblebj/83vioCQ7xl62afbVO0BFz2+4dV9A q4Rg== X-Gm-Message-State: AOJu0YzHT9FOW6sWSLhr4keMXEGVMfbX1dJbSaaHH0mBs9mfY/QRtIIW jWX0+WaGeWSj40OGPU0vLp+fLggFu2vNk39UMMcDoMq3LLtOf1vaRM0mNkE8u3l0NGU= X-Gm-Gg: ASbGncviQvMKDcw7QUQ7UrSyNxfWPxtG2MugGTplhDmlEIwMmS7+kwu7E+Azt/uXn/o lCSEFMy6NAZ3XztxSyZPixC1Edt6NUMcLcYKrwiQXcXaj4T8bH6PyJ0ABSqGX2YXxFzTrnj1CN1 8tNrMHVCGxCzIlYJLJeBtMVbLXlYh8Gh6waAlbU4ooIFrNL+dagEw6hCFfK3GeBTbI47Qn/5+fG uJUtM7IGbwW5bGX9L1NPul5LfNlQMCEhExZYd1XOk1Zcmff2XahA0EjhMbyXxCPr+tStFEspONh ayP6sKCCxt0+dl9Y12TDanaju34mA6A3dUsIfDo4ECDRcuxrskA= X-Google-Smtp-Source: AGHT+IFohnOCuX+lqQtb0xoPfq7A7aL9yyagfHZE7UYzfSXOgDcvgWh+oEnBf2xHoKgVZFBiO+egcQ== X-Received: by 2002:a05:6300:668b:b0:216:1ea0:a52b with SMTP id adf61e73a8af0-21621a2ec54mr30048189637.41.1747820615676; Wed, 21 May 2025 02:43:35 -0700 (PDT) From: Rowan Hart To: qemu-devel@nongnu.org Cc: Pierrick Bouvier , Alexandre Iooss , Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Eduardo Habkost , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Paolo Bonzini , novafacing Subject: [PATCH v3 2/8] Add register write API Date: Wed, 21 May 2025 02:43:26 -0700 Message-ID: <20250521094333.4075796-3-rowanbhart@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250521094333.4075796-1-rowanbhart@gmail.com> References: <20250521094333.4075796-1-rowanbhart@gmail.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::42e; envelope-from=rowanbhart@gmail.com; helo=mail-pf1-x42e.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, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1747820650002116600 Content-Type: text/plain; charset="utf-8" From: novafacing Signed-off-by: novafacing Signed-off-by: Rowan Hart Reviewed-By: Julian Ganz Reviewed-by: Pierrick Bouvier --- include/qemu/qemu-plugin.h | 57 +++++++++++++++++++++++++------------- plugins/api.c | 26 ++++++++++++----- 2 files changed, 56 insertions(+), 27 deletions(-) diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h index 3a850aa216..68c8632fd7 100644 --- a/include/qemu/qemu-plugin.h +++ b/include/qemu/qemu-plugin.h @@ -254,9 +254,6 @@ typedef struct { * @QEMU_PLUGIN_CB_NO_REGS: callback does not access the CPU's regs * @QEMU_PLUGIN_CB_R_REGS: callback reads the CPU's regs * @QEMU_PLUGIN_CB_RW_REGS: callback reads and writes the CPU's regs - * - * Note: currently QEMU_PLUGIN_CB_RW_REGS is unused, plugins cannot change - * system register state. */ enum qemu_plugin_cb_flags { QEMU_PLUGIN_CB_NO_REGS, @@ -871,7 +868,8 @@ struct qemu_plugin_register; /** * typedef qemu_plugin_reg_descriptor - register descriptions * - * @handle: opaque handle for retrieving value with qemu_plugin_read_regis= ter + * @handle: opaque handle for retrieving value with qemu_plugin_read_regis= ter or + * writing value with qemu_plugin_write_register * @name: register name * @feature: optional feature descriptor, can be NULL */ @@ -893,6 +891,41 @@ typedef struct { QEMU_PLUGIN_API GArray *qemu_plugin_get_registers(void); =20 +/** + * qemu_plugin_read_register() - read register for current vCPU + * + * @handle: a @qemu_plugin_reg_handle handle + * @buf: A GByteArray for the data owned by the plugin + * + * This function is only available in a context that register read access = is + * explicitly requested via the QEMU_PLUGIN_CB_R_REGS flag. + * + * Returns the size of the read register. The content of @buf is in target= byte + * order. On failure returns -1. + */ +QEMU_PLUGIN_API +int qemu_plugin_read_register(struct qemu_plugin_register *handle, + GByteArray *buf); + +/** + * qemu_plugin_write_register() - write register for current vCPU + * + * @handle: a @qemu_plugin_reg_handle handle + * @buf: A GByteArray for the data owned by the plugin + * + * This function is only available in a context that register write access= is + * explicitly requested via the QEMU_PLUGIN_CB_W_REGS flag. + * + * The size of @buf must be at least the size of the requested register. + * Attempting to write a register with @buf smaller than the register size + * will result in a crash or other undesired behavior. + * + * Returns the number of bytes written. On failure returns 0. + */ +QEMU_PLUGIN_API +int qemu_plugin_write_register(struct qemu_plugin_register *handle, + GByteArray *buf); + /** * qemu_plugin_read_memory_vaddr() - read from memory using a virtual addr= ess * @@ -915,22 +948,6 @@ QEMU_PLUGIN_API bool qemu_plugin_read_memory_vaddr(uint64_t addr, GByteArray *data, size_t len); =20 -/** - * qemu_plugin_read_register() - read register for current vCPU - * - * @handle: a @qemu_plugin_reg_handle handle - * @buf: A GByteArray for the data owned by the plugin - * - * This function is only available in a context that register read access = is - * explicitly requested via the QEMU_PLUGIN_CB_R_REGS flag. - * - * Returns the size of the read register. The content of @buf is in target= byte - * order. On failure returns -1. - */ -QEMU_PLUGIN_API -int qemu_plugin_read_register(struct qemu_plugin_register *handle, - GByteArray *buf); - /** * qemu_plugin_scoreboard_new() - alloc a new scoreboard * diff --git a/plugins/api.c b/plugins/api.c index 3c9d4832e9..79b2dc20b8 100644 --- a/plugins/api.c +++ b/plugins/api.c @@ -433,6 +433,25 @@ GArray *qemu_plugin_get_registers(void) return create_register_handles(regs); } =20 +int qemu_plugin_read_register(struct qemu_plugin_register *reg, GByteArray= *buf) +{ + g_assert(current_cpu); + + return gdb_read_register(current_cpu, buf, GPOINTER_TO_INT(reg) - 1); +} + +int qemu_plugin_write_register(struct qemu_plugin_register *reg,=20 + GByteArray *buf) +{ + g_assert(current_cpu); + + if (buf->len =3D=3D 0) { + return 0; + } + + return gdb_write_register(current_cpu, buf->data, GPOINTER_TO_INT(reg)= - 1); +} + bool qemu_plugin_read_memory_vaddr(uint64_t addr, GByteArray *data, size_t= len) { g_assert(current_cpu); @@ -453,13 +472,6 @@ bool qemu_plugin_read_memory_vaddr(uint64_t addr, GByt= eArray *data, size_t len) return true; } =20 -int qemu_plugin_read_register(struct qemu_plugin_register *reg, GByteArray= *buf) -{ - g_assert(current_cpu); - - return gdb_read_register(current_cpu, buf, GPOINTER_TO_INT(reg) - 1); -} - struct qemu_plugin_scoreboard *qemu_plugin_scoreboard_new(size_t element_s= ize) { return plugin_scoreboard_new(element_size); --=20 2.49.0 From nobody Fri Dec 19 09:50:26 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1747820757; cv=none; d=zohomail.com; s=zohoarc; b=aTS0QqFLmaFd4AvDe08HV4BRfx6uFSynqRmFg6qJcRK1jUItSbmrqsuNqTxiwewfWz3u47zJRAivtRpldwZYPd6BrFBbBJ5INGxxQ1ginGvjiwqRSrBO3n/LjBFiqq2FkyiZDXSqz9PAIInS/4i9ngIq6eCYHS4IAIQOAu33MjU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1747820757; 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=BNcrawxKqZ/qeUEHaOl7zBZ2/y+VobVUnCpMTs79Y8s=; b=iypLp+fH1MVMW6I4NxwSfLZ/zOZ7vvIsFSfcg766/h2yQScWMtlI31Yg44JQYHGdbNsyj7iLTs273Gvagtu5wk+/qM1rlVyU2TiSXPrcgYWfGcrgeH9mN8ZaaKszv6PelCv4AhlnX281xy8i4BF/4kCXyoGCnDzkxbtYPsolLYM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1747820757050802.1642627278811; Wed, 21 May 2025 02:45:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uHfzR-0002lu-2h; Wed, 21 May 2025 05:43:57 -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 1uHfzI-0002ih-BB for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:48 -0400 Received: from mail-pf1-x431.google.com ([2607:f8b0:4864:20::431]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uHfz8-0001bY-G2 for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:46 -0400 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-7425bd5a83aso6578954b3a.0 for ; Wed, 21 May 2025 02:43:38 -0700 (PDT) Received: from shemhazi.lan ([50.46.174.34]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-742a9829b87sm9255668b3a.114.2025.05.21.02.43.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 02:43:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747820616; x=1748425416; 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=BNcrawxKqZ/qeUEHaOl7zBZ2/y+VobVUnCpMTs79Y8s=; b=RlXnwylqa83ex07lZoPMBNceu7vJmjS7/21zSrwzLiHanVSl9I9ADZk36II6Bgnnrm SRNE4eBUfx+wyHSoVgAz+DLsEuon8VVUqJUmqEkTQ04/RtlVoWHCL7zyQ8T/WItE6P1s pzbPJ006F/5uO4pJmLYSbGUf8sJl56k1GOYLpx1dsp5JVHME4MB+n8i0+/8NruzVg4t3 S+ZLCKW+yY2EBywePmjEO4p8axbHezXr/XYgXzY057rVBlzIl3BYQW/SksCU64Itg66C XOR5KA+fC2Wk6DSaFsfbZMCakjs7xokHe/nJq1pEHS5zfp1vHf2q0WUf83gyAOB0BSkf 9H1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747820616; x=1748425416; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BNcrawxKqZ/qeUEHaOl7zBZ2/y+VobVUnCpMTs79Y8s=; b=qWpW+YLj2l9lPxn4xViCFH2C1zcAVU/pcn2mdveU/RHE90CamD3F9nHRlXi4ncxSUN k4ntzj+cvAm6i20Cmb1uwmXjizjLMYkFbuQNMdmSA6/d8Jx4Wuh8iulwxFy5eFZiCuWi s898dkhSlU0fuT1fOyz4ixJyiLnzIgZ6te0lwfEq7iSyn80dj9tChEtiLY8LpOGPKQfy /DpruENE7efcqYvyEpGZUjJ0O1zlDO6B6wDsye7f+P2h2W6VKXH6YrnG0SoOwX/PLPim Ha9FsK72+BZl3YGHf7v4f3sxWNctWNENXrHwuHztWLfesocR0dJpYkZJjRWcbSIGxJNT NbCg== X-Gm-Message-State: AOJu0YyxAPoQAI+d7WlFp4la2pqpfJcbEfZpv0KJt8l9Gv9e3/KK4hPb GYGWL7OXqsPqyKYm8MpKySV68B9hXJwuc7S/yRnNjHTR+C0E1uQKF5iADBCR1cvh2Hw= X-Gm-Gg: ASbGncsMveN3cOhQ15QJMsUh5isfeGVj0NUCTlRXaU+A5Ec7MgGrMObdZKX1fC14x3l 2JIsq9o98D1IwF4p0T4NxtRFFFMsyMEPcf59jrmQocA9aF9/uWXaL//Hark6ico4fKdVsY5VM6H Io68MPEnPbfBcXbapRkmV3slRo9TdK8TJ8zxlQut8qcexksPjSh92O4QQwwea++4M/EDHmhyTHo rpgrMuP83cFJdlZuGv77NjwLKlLJIPTidyMGtoUVm00lVX/4qrm1s58Ii2P/ZR4/+f9B6uUKJJo T8/rJL5Y8yU9QgcZg7924dhrsJb3TgFg+heh1eNgjjzC/qEtHZg= X-Google-Smtp-Source: AGHT+IG0IvZXOWUDfesBRJoVVMzo8UkVpW0qkPC7zeVuUDKCyoBV8fik23Qw8M5qncEP3SsznqSbPg== X-Received: by 2002:a05:6a20:518a:b0:216:5f68:427b with SMTP id adf61e73a8af0-2165f68442cmr21441618637.33.1747820616342; Wed, 21 May 2025 02:43:36 -0700 (PDT) From: Rowan Hart To: qemu-devel@nongnu.org Cc: Pierrick Bouvier , Alexandre Iooss , Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Eduardo Habkost , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Paolo Bonzini , novafacing Subject: [PATCH v3 3/8] Add address space API Date: Wed, 21 May 2025 02:43:27 -0700 Message-ID: <20250521094333.4075796-4-rowanbhart@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250521094333.4075796-1-rowanbhart@gmail.com> References: <20250521094333.4075796-1-rowanbhart@gmail.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::431; envelope-from=rowanbhart@gmail.com; helo=mail-pf1-x431.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, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1747820758871116600 Content-Type: text/plain; charset="utf-8" From: novafacing Signed-off-by: novafacing Signed-off-by: Rowan Hart --- include/qemu/plugin.h | 6 +++ include/qemu/qemu-plugin.h | 45 ++++++++++++++++++++++ plugins/api.c | 79 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+) diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h index 9726a9ebf3..38439a37fa 100644 --- a/include/qemu/plugin.h +++ b/include/qemu/plugin.h @@ -139,6 +139,12 @@ struct qemu_plugin_tb { GArray *cbs; }; =20 +/* Internal context for address space information */ +struct qemu_plugin_address_space_info { + CPUState *cpu; + GPtrArray *names; +}; + /** * struct CPUPluginState - per-CPU state for plugins * @event_mask: plugin event bitmap. Modified only via async work. diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h index 68c8632fd7..1380f7d441 100644 --- a/include/qemu/qemu-plugin.h +++ b/include/qemu/qemu-plugin.h @@ -926,6 +926,51 @@ QEMU_PLUGIN_API int qemu_plugin_write_register(struct qemu_plugin_register *handle, GByteArray *buf); =20 +/** struct qemu_plugin_address_space_info - Opaque handle for space info */ +struct qemu_plugin_address_space_info; + +/** + * qemu_plugin_get_current_vcpu_address_spaces() - get a list of address s= paces + * for the current vCPU + * + * This function should be called in vCPU context, i.e. from a vCPU, trans= lation + * block, or operation callback. + * + * This function is only valid for softmmu targets. + * + * Returns an opaque qemu_plugin_address_space* handle that is only valid = for + * the duration of the callback. The caller is not responsible for freeing= the + * result. + */ +QEMU_PLUGIN_API +struct qemu_plugin_address_space_info* +qemu_plugin_get_current_vcpu_address_spaces(void); + +/** + * qemu_plugin_n_address_spaces() - get the number of address spaces + * + * @info: opaque handle to address space information + * + * Returns the number of address spaces, or -1 if the handle is invalid. + */ +QEMU_PLUGIN_API +int qemu_plugin_n_address_spaces(struct qemu_plugin_address_space_info *in= fo); + +/** + * qemu_plugin_address_space_name() - get the name of an address space + * + * @info: opaque handle to address space information + * @idx: index of the address space + * + * Returns the name of the address space, or NULL if the handle is invalid= . The + * caller is responsible for freeing the result. + * + */ +QEMU_PLUGIN_API +const char* +qemu_plugin_address_space_name(struct qemu_plugin_address_space_info *info, + unsigned int idx); + /** * qemu_plugin_read_memory_vaddr() - read from memory using a virtual addr= ess * diff --git a/plugins/api.c b/plugins/api.c index 79b2dc20b8..d1cc6ff86e 100644 --- a/plugins/api.c +++ b/plugins/api.c @@ -39,6 +39,7 @@ #include "qemu/main-loop.h" #include "qemu/plugin.h" #include "qemu/log.h" +#include "system/memory.h" #include "tcg/tcg.h" #include "exec/gdbstub.h" #include "exec/target_page.h" @@ -452,6 +453,84 @@ int qemu_plugin_write_register(struct qemu_plugin_regi= ster *reg, return gdb_write_register(current_cpu, buf->data, GPOINTER_TO_INT(reg)= - 1); } =20 +#ifdef CONFIG_SOFTMMU +static __thread struct qemu_plugin_address_space_info address_space_info = =3D { + NULL, NULL +}; +static void free_g_string_and_data(gpointer data) +{ + g_string_free(data, true); +} +#endif + +struct qemu_plugin_address_space_info* +qemu_plugin_get_current_vcpu_address_spaces(void) +{ +#ifdef CONFIG_SOFTMMU + CPUState *cpu =3D current_cpu; + + if (address_space_info.names =3D=3D NULL) { + address_space_info.cpu =3D NULL; + address_space_info.names =3D g_ptr_array_new(); + g_ptr_array_set_free_func(address_space_info.names, + free_g_string_and_data); + } + + g_ptr_array_set_size(address_space_info.names, 0); + + for (size_t i =3D 0; i < cpu->cpu_ases_count; i++) { + AddressSpace *as =3D cpu_get_address_space(cpu, i); + + if (as =3D=3D NULL || as->name =3D=3D NULL) { + return NULL; + } + + g_ptr_array_add(address_space_info.names, + g_string_new(as->name)); + } + + address_space_info.cpu =3D cpu; + + return &address_space_info; +#else + return NULL; +#endif +} + +int qemu_plugin_n_address_spaces(struct qemu_plugin_address_space_info *in= fo) +{ +#ifdef CONFIG_SOFTMMU + if (info->cpu !=3D current_cpu) { + address_space_info.cpu =3D NULL; + g_ptr_array_set_size(address_space_info.names, 0); + return -1; + } + + return info->names->len; +#else + return -1; +#endif +} + +const char * +qemu_plugin_address_space_name(struct qemu_plugin_address_space_info *info, + unsigned int idx) +{ +#ifdef CONFIG_SOFTMMU + if (info->cpu !=3D current_cpu) { + address_space_info.cpu =3D NULL; + g_ptr_array_set_size(address_space_info.names, 0); + return NULL; + } + + if (idx < info->names->len) { + GString *name =3D g_ptr_array_index(info->names, idx); + return g_strdup(name->str); + } +#endif + return NULL; +} + bool qemu_plugin_read_memory_vaddr(uint64_t addr, GByteArray *data, size_t= len) { g_assert(current_cpu); --=20 2.49.0 From nobody Fri Dec 19 09:50:26 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1747820703; cv=none; d=zohomail.com; s=zohoarc; b=KB1djGwxO7UiF3Wgk3nrP4vIlOnFv0onya3F1LxkJMDq6jS+pNZKNwkpjfr3NeWXNLfB/5tjQONXZWP6vjcrFq8JiBiV7LifwS9o9NGLT8p+cNvE6t/KJl2N+0MYCgLpRqw9v81S+crdIs9JccGkbSIvavq//x0c9bXPaqCH9Ew= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1747820703; 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=Kw+/hkmATb95JeIY1+qMlFeBI8BcaQOwV1YDDwxVg+Y=; b=ZJNULjcG7mUkOTuNTqCZWoHSLfK7LS5HfAHEZslkbK43asFnQjslh1kAI0GFgUPz7EEHgU9mdcL061LSQ1fGuzhAvPIeleo/yvkWcPS7FTsNRUATcjRgI+ILWNU/m+lc5NS1/MByrrw9So9fFdSSnM4f5ayV/Xc1CcXhmFWPdMU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1747820703158386.7114521627225; Wed, 21 May 2025 02:45:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uHfzT-0002mp-8r; Wed, 21 May 2025 05:43:59 -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 1uHfzK-0002k0-10 for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:51 -0400 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uHfzC-0001bf-9c for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:49 -0400 Received: by mail-pf1-x434.google.com with SMTP id d2e1a72fcca58-742c73f82dfso3025625b3a.2 for ; Wed, 21 May 2025 02:43:40 -0700 (PDT) Received: from shemhazi.lan ([50.46.174.34]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-742a9829b87sm9255668b3a.114.2025.05.21.02.43.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 02:43:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747820618; x=1748425418; 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=Kw+/hkmATb95JeIY1+qMlFeBI8BcaQOwV1YDDwxVg+Y=; b=Q55TeUOlS1U50TqKSGWvYlcU2cp5FWLJ2aGseoSe/NbnHx1lYI3oIey2JYNo/RIPKI Oyy+plLuKNm6uW0S0x07BP4paA4seifw9EI/NlUFkSLWj/I5FMFZyPjPGCWNJHPyoq9j Umlbc3c3VCjcGD6qKFhb7ESvqyl976B83MMtONcyy7LxHgWAF+vBvhxTvLEa14K8uLJe Ig5HuMaMEXDZWQPny+SYhCq4MybSq376nswnk6SMhhMdKoDuPMIOzA/QWnm7tM81M8b9 dQoqFhcLZE4Qilfpx2U41V7DAeOnBxKLWJZhyN4/8B+uWu5MgNvS+6x2u89txcxOuAy4 KXbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747820618; x=1748425418; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Kw+/hkmATb95JeIY1+qMlFeBI8BcaQOwV1YDDwxVg+Y=; b=duSPa69u3EhbfyCD1sgtdY4GcpBQ+TCvuMwCU858lsNxSFuLLlje34/jMGrgVAnNUL SAfYcH9Wd4SljOShZUMkDtxEVcdAs+a9rQ/7ZgcH7Z7mNsCUAQypXwW+dY3ouF0MEfSF UzUwdzPPjr+wIBWpBM6gnk+ZZnlIt/SD6HOsVn/euPxpYpXMBwogc2A20wvnrQjezRIF 4r/WbgBcTm9Lx/nCqvAz9nQ5PflzFJc0mrvrles1htDHW8FgSLTR7oG8/VG27/0QuA4l 85YbJgdNE18a0jag5tqD7eHPL7n7L+2TAnAm4nTJ3OABnvzv7F3jSY7GKDwmBkrMzdWB F0Gg== X-Gm-Message-State: AOJu0YxwxorQpDIw3q5GjDMAH/crQmwlXxiQUiQcZ51j5hEHxsA0I42n Aaje8+/WPopCNgYg4QSXnfpg6y3ebYS+HgngZxt6ix3t8Xqe/2ujhrNkykaZ9yNPvqI= X-Gm-Gg: ASbGncsASh9Urm89szKqaHpAtZI7/dGeGw35tL2tn0RDJ3Jlf3OHG0ys0/Av/7TiGRE GokHLThDHE4Q/qWqySo5BXzfAIpsWpJhfRutmIDg8Nfh4Uf1VE2qlMee8Ba7aX8RF1r0vnO4rtV gjp5Rjy+6mWYXUORhm41htgIZAV4QbmJ2GciQm5iObMvbgjCVT0WSYoYBp/vaz9K7JOrEQIRuMr 4U1VAnGBElMkaZIIBpVh2Gvq6pAwwQTorKzhY1M8XkZH4IOPvD1kq/zdN6zOUY0BZtF/AnHSvZj 4a9HiS+kdWQebwFevNVEj6Ea/D5aeZuuN/ylzXIcVRaphkvvPEw= X-Google-Smtp-Source: AGHT+IGqAHnSD3kFcXORJSPJhI1kBd/CJm6Kh0XdOkFd9XtM/pkgrNAx3AZexOAoI9/kFo3g6QT0pg== X-Received: by 2002:a05:6a00:3c89:b0:740:a023:5d60 with SMTP id d2e1a72fcca58-742a989f492mr28881001b3a.19.1747820617776; Wed, 21 May 2025 02:43:37 -0700 (PDT) From: Rowan Hart To: qemu-devel@nongnu.org Cc: Pierrick Bouvier , Alexandre Iooss , Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Eduardo Habkost , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Paolo Bonzini , novafacing Subject: [PATCH v3 4/8] Add memory virtual address write API Date: Wed, 21 May 2025 02:43:28 -0700 Message-ID: <20250521094333.4075796-5-rowanbhart@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250521094333.4075796-1-rowanbhart@gmail.com> References: <20250521094333.4075796-1-rowanbhart@gmail.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::434; envelope-from=rowanbhart@gmail.com; helo=mail-pf1-x434.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, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1747820704385116600 Content-Type: text/plain; charset="utf-8" From: novafacing Signed-off-by: novafacing Signed-off-by: Rowan Hart Reviewed-by: Pierrick Bouvier --- include/qemu/qemu-plugin.h | 21 +++++++++++++++++++++ plugins/api.c | 18 ++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h index 1380f7d441..eff8430b4a 100644 --- a/include/qemu/qemu-plugin.h +++ b/include/qemu/qemu-plugin.h @@ -993,6 +993,27 @@ QEMU_PLUGIN_API bool qemu_plugin_read_memory_vaddr(uint64_t addr, GByteArray *data, size_t len); =20 +/** + * qemu_plugin_write_memory_vaddr() - write to memory using a virtual addr= ess + * + * @addr: A virtual address to write to + * @data: A byte array containing the data to write + * + * The contents of @data will be written to memory starting at the virtual + * address @addr. + * + * This function does not guarantee consistency of writes, nor does it ens= ure + * that pending writes are flushed either before or after the write takes = place, + * so callers should take care to only call this function in vCPU context = (i.e. + * in callbacks) and avoid depending on the existence of data written usin= g this + * function which may be overwritten afterward. + * + * Returns true on success and false on failure. + */ +QEMU_PLUGIN_API +bool qemu_plugin_write_memory_vaddr(uint64_t addr, + GByteArray *data); + /** * qemu_plugin_scoreboard_new() - alloc a new scoreboard * diff --git a/plugins/api.c b/plugins/api.c index d1cc6ff86e..19c10bb39e 100644 --- a/plugins/api.c +++ b/plugins/api.c @@ -551,6 +551,24 @@ bool qemu_plugin_read_memory_vaddr(uint64_t addr, GByt= eArray *data, size_t len) return true; } =20 +bool qemu_plugin_write_memory_vaddr(uint64_t addr, GByteArray *data) +{ + g_assert(current_cpu); + + if (data->len =3D=3D 0) { + return false; + } + + int result =3D cpu_memory_rw_debug(current_cpu, addr, data->data, + data->len, true); + + if (result < 0) { + return false; + } + + return true; +} + struct qemu_plugin_scoreboard *qemu_plugin_scoreboard_new(size_t element_s= ize) { return plugin_scoreboard_new(element_size); --=20 2.49.0 From nobody Fri Dec 19 09:50:26 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1747820673; cv=none; d=zohomail.com; s=zohoarc; b=DfBTNTJqStd9f86Oa6S0KoePPVAWACYtHWPCTDPZKPD0LLm+1i2oGE4iI+tMN8D7NKnTK4MMi9Y8O4vQ8AtV/Fwl2ANej0ygKjilek/wU7IgpNSCNvPSSPOPy5wa3bMrAMyK7b3SSV3nlesrnSg1nmrfhpgZorusAD7hnAG6EUY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1747820673; 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=iOOmy0NnOkTG9aWPPbTXqcQiNJ8PCIOZVYoxmQs26tY=; b=K1p6GuV8+Kl7YDyZFrZJWcMZViciEMoS5RtyW3wzDKWh0Om0EbOqnGJ+S8F2N69pCPPmK/1GcLv8WjcJ5R/2tfubUINuHEMbp6PyT5gCQJ9q/boJgMHDH5gISg1A/GBKaZgVNW3ZBg7zf4iMvUTgYJXRP0v7APd8GIgUXlROvIg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1747820673085257.40011621836516; Wed, 21 May 2025 02:44:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uHfzJ-0002jm-PY; Wed, 21 May 2025 05:43:49 -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 1uHfzE-0002d1-Ih for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:44 -0400 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uHfzB-0001bl-TW for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:44 -0400 Received: by mail-pf1-x434.google.com with SMTP id d2e1a72fcca58-742c46611b6so4772200b3a.1 for ; Wed, 21 May 2025 02:43:39 -0700 (PDT) Received: from shemhazi.lan ([50.46.174.34]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-742a9829b87sm9255668b3a.114.2025.05.21.02.43.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 02:43:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747820619; x=1748425419; 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=iOOmy0NnOkTG9aWPPbTXqcQiNJ8PCIOZVYoxmQs26tY=; b=JHGZH/aIt4Vc2J8NDM50JaCZayckQdXUpPu8MBRFxnosTL55u77mnTT6Vjx/HMA7Dq 5/IYitbIm5afc6sWrv4m5SfslaKuM9ouxSUSZ+WDvKTaBunfOKnkqx5KL6Gw8F3rvJOS EMzQgVRxDBHaWUxHKASwbODsQm93AKlEED6wqcB4fFu87dfzp1Vtv/AmX1FI7xxokF9g 4UojoMuWuaS1Y5/dRW1w8h+DRgzRYK509ObSNUgliPjsFWaR9Ynlihg+MTWlpaoqnpvV gxEW+R6zOirVxOF5IylT0rNQ9bbK8XTJZYEA9GcDy5qlNIINF5VFip/6Q8n7G2gIlkvL y2ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747820619; x=1748425419; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iOOmy0NnOkTG9aWPPbTXqcQiNJ8PCIOZVYoxmQs26tY=; b=tGtCe2NNrLhWgjsEKDfObjiDL4HMx/FAtBr6iKAUveO8+8okhy6vfS225cO9ZCnlV6 +MxOQ2o58TXEQCcYBbIUNA2vHtwt21Lq9EdUYb04rAwnqfIDxrBZNr2T8it6gaPWLAVp 3QGLxe1yuyfZVAoytRY/3DRkFyPijhfIlvCHZ5e6J7AbH/8WcIlbOeXh6niCdBeGgZVb 8JwjX/1pgHNIB1qHu3+M4TUpBUsTVf/wlxrONLtjCj4lWDYJhF/WnbQw5LguY3K9STD5 ngjytGP0qMEsLrAF0w0DqbHnAPf1QFzvXoNBKSpfX1zEhktlaHdM0ppBXPz1jQ4Yl5+F wi0A== X-Gm-Message-State: AOJu0YyrXpUS5688j7wGKB2S5/uz1ZsEU94GJIInlfTnQF6d15UeyDrq wGAYUEbXXNlMJN1lhC+gSPY8Ofg+2lWZjCxbWoJTaBuOIOTSHdQQ2YHJQPhDGaEjJ1Q= X-Gm-Gg: ASbGncup9d7Y4Tj17R979aYj8EN8lYAlGrU+GXq1WFTJ4JFreMgos1si/eSJN+eEpeQ WY7KQ8+CBNYPs6KslV9WPK+Py3fvkx/sMe36zyPP1cuBq7NHitUK26i3N1biLPcfmGlU2huzahK uDL3Qna4mDCciepwuDE+9RgNvAMWGb2whvo3lzf3t7j2cq01VmEBomVEJof8s6E+ubbN9X0bh+8 Qe6DX1NXjU1El/Pf+g3whwvXIBq3lRjFy+IycnGcCTv3G20wacyuGhvKL3C9BG34QPnboiQn6L/ /AjaiNF7+VRcbDXofjbZ9aZZB93fhyKh3v8qTy4ffTFc3iNw7bk= X-Google-Smtp-Source: AGHT+IH8VLO4EukNIkob08vR4bW8Hgu3TyQWMGDTSUZxfWrdN3kDpJfZLtJsYG8ecMEluQltD50cCw== X-Received: by 2002:a05:6a00:1d88:b0:736:546c:eb69 with SMTP id d2e1a72fcca58-742accc5783mr22699960b3a.9.1747820618661; Wed, 21 May 2025 02:43:38 -0700 (PDT) From: Rowan Hart To: qemu-devel@nongnu.org Cc: Pierrick Bouvier , Alexandre Iooss , Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Eduardo Habkost , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Paolo Bonzini , novafacing Subject: [PATCH v3 5/8] Add memory hardware address read/write API Date: Wed, 21 May 2025 02:43:29 -0700 Message-ID: <20250521094333.4075796-6-rowanbhart@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250521094333.4075796-1-rowanbhart@gmail.com> References: <20250521094333.4075796-1-rowanbhart@gmail.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::434; envelope-from=rowanbhart@gmail.com; helo=mail-pf1-x434.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, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1747820674035116600 Content-Type: text/plain; charset="utf-8" From: novafacing Signed-off-by: novafacing Signed-off-by: Rowan Hart --- include/qemu/qemu-plugin.h | 96 +++++++++++++++++++++++++++++++++++ plugins/api.c | 100 +++++++++++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+) diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h index eff8430b4a..d4f229abd9 100644 --- a/include/qemu/qemu-plugin.h +++ b/include/qemu/qemu-plugin.h @@ -1014,6 +1014,102 @@ QEMU_PLUGIN_API bool qemu_plugin_write_memory_vaddr(uint64_t addr, GByteArray *data); =20 +/** + * enum qemu_plugin_hwaddr_operation_result - result of a memory operation + * + * @QEMU_PLUGIN_HWADDR_OPERATION_OK: hwaddr operation succeeded + * @QEMU_PLUGIN_HWADDR_OPERATION_ERROR: unexpected error occurred + * @QEMU_PLUGIN_HWADDR_OPERATION_DEVICE_ERROR: error in memory device + * @QEMU_PLUGIN_HWADDR_OPERATION_ACCESS_DENIED: permission error + * @QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS: address was invalid + * @QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS_SPACE: invalid address sp= ace + */ +enum qemu_plugin_hwaddr_operation_result { + QEMU_PLUGIN_HWADDR_OPERATION_OK, + QEMU_PLUGIN_HWADDR_OPERATION_ERROR, + QEMU_PLUGIN_HWADDR_OPERATION_DEVICE_ERROR, + QEMU_PLUGIN_HWADDR_OPERATION_ACCESS_DENIED, + QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS, + QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS_SPACE, +}; + +/** + * qemu_plugin_read_memory_hwaddr() - read from memory using a hardware ad= dress + * + * @as_idx: The index of the address space to read from + * @addr: A physical address to read from + * @data: A byte array to store data into + * @len: The number of bytes to read, starting from @addr + * + * @len bytes of data is read starting at @addr and stored into @data. If = @data + * is not large enough to hold @len bytes, it will be expanded to the nece= ssary + * size, reallocating if necessary. @len must be greater than 0. + * + * This function does not ensure writes are flushed prior to reading, so + * callers should take care when calling this function in plugin callbacks= to + * avoid attempting to read data which may not yet be written and should u= se + * the memory callback API instead. + * + * This function is only valid for softmmu targets. + * + * Returns a qemu_plugin_hwaddr_operation_result indicating the result of = the + * operation. + */ +QEMU_PLUGIN_API +enum qemu_plugin_hwaddr_operation_result +qemu_plugin_read_memory_hwaddr(unsigned int as_idx, uint64_t addr, + GByteArray *data, size_t len); + +/** + * qemu_plugin_write_memory_hwaddr() - write to memory using a hardware ad= dress + * + * @as_idx: The index of the address space to write to + * @addr: A physical address to write to + * @data: A byte array containing the data to write + * + * The contents of @data will be written to memory starting at the hardware + * address @addr. + * + * This function does not guarantee consistency of writes, nor does it ens= ure + * that pending writes are flushed either before or after the write takes = place, + * so callers should take care when calling this function in plugin callba= cks to + * avoid depending on the existence of data written using this function wh= ich + * may be overwritten afterward. In addition, this function requires that = the + * pages containing the address are not locked. Practically, this means th= at you + * should not write instruction memory in a current translation block insi= de a + * callback registered with qemu_plugin_register_vcpu_tb_trans_cb. + * + * You can, for example, write instruction memory in a current translation= block + * in a callback registered with qemu_plugin_register_vcpu_tb_exec_cb, alt= hough + * be aware that the write will not be flushed until after the translation= block + * has finished executing. In general, this function should be used to wr= ite + * data memory or to patch code at a known address, not in a current trans= lation + * block. + * + * This function is only valid for softmmu targets. + * + * Returns a qemu_plugin_hwaddr_operation_result indicating the result of = the + * operation. + */ +QEMU_PLUGIN_API +enum qemu_plugin_hwaddr_operation_result +qemu_plugin_write_memory_hwaddr(unsigned int as_idx, uint64_t addr, + GByteArray *data); + +/** + * qemu_plugin_translate_vaddr() - translate a virtual address to a physic= al one + * + * @vaddr: virtual address to translate + * @hwaddr: pointer to store the physical address + * + * This function is only valid in vCPU context (i.e. in callbacks) and is = only + * valid for softmmu targets. + * + * Returns true on success and false on failure. + */ +QEMU_PLUGIN_API +bool qemu_plugin_translate_vaddr(uint64_t vaddr, uint64_t *hwaddr); + /** * qemu_plugin_scoreboard_new() - alloc a new scoreboard * diff --git a/plugins/api.c b/plugins/api.c index 19c10bb39e..5983768783 100644 --- a/plugins/api.c +++ b/plugins/api.c @@ -569,6 +569,106 @@ bool qemu_plugin_write_memory_vaddr(uint64_t addr, GB= yteArray *data) return true; } =20 +enum qemu_plugin_hwaddr_operation_result +qemu_plugin_read_memory_hwaddr(unsigned int as_idx, hwaddr addr, + GByteArray *data, size_t len) +{ +#ifdef CONFIG_SOFTMMU + CPUState *cpu =3D current_cpu; + + if (len =3D=3D 0 || as_idx >=3D cpu->cpu_ases_count) { + return QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS_SPACE; + } + + g_byte_array_set_size(data, len); + + AddressSpace *as =3D cpu_get_address_space(cpu, as_idx); + + if (as =3D=3D NULL) { + return QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS_SPACE; + } + + MemTxResult res =3D address_space_rw(as, addr, + MEMTXATTRS_UNSPECIFIED, data->data, + data->len, false); + + switch (res) { + case MEMTX_OK: + return QEMU_PLUGIN_HWADDR_OPERATION_OK; + case MEMTX_ERROR: + return QEMU_PLUGIN_HWADDR_OPERATION_DEVICE_ERROR; + case MEMTX_DECODE_ERROR: + return QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS; + case MEMTX_ACCESS_ERROR: + return QEMU_PLUGIN_HWADDR_OPERATION_ACCESS_DENIED; + default: + return QEMU_PLUGIN_HWADDR_OPERATION_ERROR; + } +#else + return QEMU_PLUGIN_HWADDR_OPERATION_ERROR; +#endif +} + +enum qemu_plugin_hwaddr_operation_result +qemu_plugin_write_memory_hwaddr(unsigned int as_idx, hwaddr addr,=20 + GByteArray *data) +{ +#ifdef CONFIG_SOFTMMU + CPUState *cpu =3D current_cpu; + + if (data->len =3D=3D 0 || as_idx >=3D cpu->cpu_ases_count) { + return QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS_SPACE; + } + + AddressSpace *as =3D cpu_get_address_space(cpu, as_idx); + + if (as =3D=3D NULL) { + return QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS_SPACE; + } + + qemu_plugin_outs("Got cpu address space...\n"); + + MemTxResult res =3D address_space_rw(as, addr, + MEMTXATTRS_UNSPECIFIED, data->data, + data->len, true); + switch (res) { + case MEMTX_OK: + return QEMU_PLUGIN_HWADDR_OPERATION_OK; + case MEMTX_ERROR: + return QEMU_PLUGIN_HWADDR_OPERATION_DEVICE_ERROR; + case MEMTX_DECODE_ERROR: + return QEMU_PLUGIN_HWADDR_OPERATION_INVALID_ADDRESS; + case MEMTX_ACCESS_ERROR: + return QEMU_PLUGIN_HWADDR_OPERATION_ACCESS_DENIED; + default: + return QEMU_PLUGIN_HWADDR_OPERATION_ERROR; + } +#else + return QEMU_PLUGIN_HWADDR_OPERATION_ERROR; +#endif +} + +bool qemu_plugin_translate_vaddr(uint64_t vaddr, uint64_t *hwaddr) +{ +#ifdef CONFIG_SOFTMMU + g_assert(current_cpu); + + CPUState *cpu =3D current_cpu; + + uint64_t res =3D cpu_get_phys_page_debug(cpu, vaddr); + + if (res =3D=3D (uint64_t)-1) { + return false; + } + + *hwaddr =3D res | (vaddr & ~TARGET_PAGE_MASK); + + return true; +#else + return false; +#endif +} + struct qemu_plugin_scoreboard *qemu_plugin_scoreboard_new(size_t element_s= ize) { return plugin_scoreboard_new(element_size); --=20 2.49.0 From nobody Fri Dec 19 09:50:26 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1747820748; cv=none; d=zohomail.com; s=zohoarc; b=Fph0wBXkxNEw07bvQOtgTydHyRLJjr/YganmeD4LnK5Z8x72rATAh9oPlO/wUjfcR5F4w23zwsMuJwgw0TZH3C0wEFXGCE2MTRwNMN/SCALnBSyA3P7CHmGYbfX/71sEb10iIoY6W3AD635zVdHrlTf8oWU7REWdf5NeEpIpwzE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1747820748; 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=ywsYPP0Q6PNXw79uC0aaj+5/O0313tdl8XcfpwkKGXM=; b=K7HUdPttztvmAPQHpoAU3hcpDpo9Yv+THe2gEgpAUWYx+XnqAA9kzSlBE/XyvbThgkj7yZpMCkxZj0Vo6QAdYsRcg8YIxQ6WQRW1uje/nviEV1rVomN7K+vw/msKOhCv9T02EX87ifNkArcKFJQ3aGp/UM7qPeScTins+izeSh8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1747820748402240.17805827340362; Wed, 21 May 2025 02:45:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uHfzL-0002k2-Pt; Wed, 21 May 2025 05:43: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 1uHfzI-0002iO-AD for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:48 -0400 Received: from mail-pf1-x42c.google.com ([2607:f8b0:4864:20::42c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uHfzC-0001c2-9z for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:47 -0400 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-7398d65476eso5133399b3a.1 for ; Wed, 21 May 2025 02:43:41 -0700 (PDT) Received: from shemhazi.lan ([50.46.174.34]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-742a9829b87sm9255668b3a.114.2025.05.21.02.43.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 02:43:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747820620; x=1748425420; 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=ywsYPP0Q6PNXw79uC0aaj+5/O0313tdl8XcfpwkKGXM=; b=HlgTQtVueeoTmChWuueGaGKZV8GZfY6h5LptfRSLg36QJMR03XvXcQ4kIiBWpZkYpO s71WHqsLgHS4hZ+GrzGCNq1EeyGW+OU/AprVueUoY2BTag4fbKB3spX/xkZyTgKuoNuU iUB8BzOyIVQEJ7DeyTPkHToad79BLlycrgXUq/nCZ048CGU3Jr3FdzP2nmqDWzILWSpe GntPXA52srpWR6RRfgrlhPTR2GQFeH23ccDuN9Zjo/4qBqONu5g2DI5DnPrH/88cg0nm N4G7gahHckqaTb3QgA95kewpuGTF4f/IzWiAIhPXJc0QcEUG0ZkuXxat2pc4IceeJs3l 7oWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747820620; x=1748425420; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ywsYPP0Q6PNXw79uC0aaj+5/O0313tdl8XcfpwkKGXM=; b=s0/loWdHIOySW8wUYGx5I4I/2iK+IPiY17yNO/mV47Kb4Jddzs1XXV/Xg0cmgPaLQd 4gL2NOuCPlNoryr0YuBYi5PpLKjYMwhet0GgwaqLH0EGdt3MuoEJS6pNtME+O0CuxajP 7/0j1UG5xZgPap5+Qw4ZhD4RikxiTezfG2ZlhahExHJGQH7xGp/zV25OxWK3xKZ2szZQ JoYMsuv3jksx0cGirm1OjiPB1gthM8ia/SKhuDWkewe2esNaVWiEH4PTkUC0DeRwc3bu syx1sG2D5dlIQsh4rBYMZ8mtZZM0ML6kBDcvapXvCKmfwSieI0PD6JFNu43ipxDNVhj+ KcYA== X-Gm-Message-State: AOJu0YzXvpvIMuXBA1a7pFjgf6h0p9dNB+iZy4EWRVjcYrcaoYC5xC51 51kz1ZDFwZqRRy4xlwRIwsDQLZzdjeQergIcpdbr8QlHDPhQCW29B/TaphxXPJi1j+Q= X-Gm-Gg: ASbGncsHnnVaAmwlxnZxJ93nMQt/vWlSI1c4oyPnAWO6KYt0MOF30sx3Z0sU4vE7EnM 5xCQE31zW3RdMljo0GT/AuCes2lBsqQ8boM6CDqJ+YPxGhwhV9aLcEE0+C/mtJy4YAF6xyaG530 Xa/iPjsJ4iNDUszKobLWwCKrZIO1SixwpFfr6lnttAqlEmxbKBDEsiSOGfFLs79AHPGoiDQ9Ior 9LFkLOFqxhPRT0s+3bfe50ei619WxZ2Sz38I/o8AjwjiIuH3K/LOHe1scUFguAXQ0LHgKQZolpp hVK4pEmTRd8aDo/KWtfxQyQ+I5Xh/e82aaNb4L5ZlIjjqSHL+dk= X-Google-Smtp-Source: AGHT+IFW8yTcNwJD4RNg1q7UNzxCchu4sJ0yTdB2ukaTbB5pE2wFQuBdZD6jyTASy147qqxEHWnInQ== X-Received: by 2002:a05:6a00:10cb:b0:73c:3f2e:5df5 with SMTP id d2e1a72fcca58-742a9afe772mr23918395b3a.9.1747820619587; Wed, 21 May 2025 02:43:39 -0700 (PDT) From: Rowan Hart To: qemu-devel@nongnu.org Cc: Pierrick Bouvier , Alexandre Iooss , Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Eduardo Habkost , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Paolo Bonzini , novafacing Subject: [PATCH v3 6/8] Add patcher plugin and test Date: Wed, 21 May 2025 02:43:30 -0700 Message-ID: <20250521094333.4075796-7-rowanbhart@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250521094333.4075796-1-rowanbhart@gmail.com> References: <20250521094333.4075796-1-rowanbhart@gmail.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::42c; envelope-from=rowanbhart@gmail.com; helo=mail-pf1-x42c.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, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1747820749117116600 Content-Type: text/plain; charset="utf-8" From: novafacing Signed-off-by: novafacing Signed-off-by: Rowan Hart --- tests/tcg/Makefile.target | 1 + tests/tcg/plugins/meson.build | 2 +- tests/tcg/plugins/patch.c | 324 ++++++++++++++++++++++ tests/tcg/x86_64/Makefile.softmmu-target | 32 ++- tests/tcg/x86_64/system/patch-target.c | 32 +++ tests/tcg/x86_64/system/validate-patch.py | 39 +++ 6 files changed, 424 insertions(+), 6 deletions(-) create mode 100644 tests/tcg/plugins/patch.c create mode 100644 tests/tcg/x86_64/system/patch-target.c create mode 100755 tests/tcg/x86_64/system/validate-patch.py diff --git a/tests/tcg/Makefile.target b/tests/tcg/Makefile.target index 95ff76ea44..4b709a9d18 100644 --- a/tests/tcg/Makefile.target +++ b/tests/tcg/Makefile.target @@ -176,6 +176,7 @@ RUN_TESTS+=3D$(EXTRA_RUNS) # Some plugins need additional arguments above the default to fully # exercise things. We can define them on a per-test basis here. run-plugin-%-with-libmem.so: PLUGIN_ARGS=3D$(COMMA)inline=3Dtrue +run-plugin-%-with-libpatch.so: PLUGIN_ARGS=3D$(COMMA)target=3Dffffffff$(CO= MMA)patch=3D00000000 =20 ifeq ($(filter %-softmmu, $(TARGET)),) run-%: % diff --git a/tests/tcg/plugins/meson.build b/tests/tcg/plugins/meson.build index 41f02f2c7f..163042e601 100644 --- a/tests/tcg/plugins/meson.build +++ b/tests/tcg/plugins/meson.build @@ -1,6 +1,6 @@ t =3D [] if get_option('plugins') - foreach i : ['bb', 'empty', 'inline', 'insn', 'mem', 'reset', 'syscall'] + foreach i : ['bb', 'empty', 'inline', 'insn', 'mem', 'reset', 'syscall',= 'patch'] if host_os =3D=3D 'windows' t +=3D shared_module(i, files(i + '.c') + '../../../contrib/plugins/= win32_linker.c', include_directories: '../../../include/qemu', diff --git a/tests/tcg/plugins/patch.c b/tests/tcg/plugins/patch.c new file mode 100644 index 0000000000..6f2bc3688e --- /dev/null +++ b/tests/tcg/plugins/patch.c @@ -0,0 +1,324 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright (C) 2025, Rowan Hart + * + * License: GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + * This plugin patches instructions matching a pattern to a different + * instruction as they execute + * + */ + +#include "glib.h" +#include "glibconfig.h" + +#include +#include +#include + +QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; + +static bool use_hwaddr; +static bool debug_insns; +static GByteArray *target_data; +static GByteArray *patch_data; + +/** + * Parse a string of hexadecimal digits into a GByteArray. The string must= be + * even length + */=20 +static GByteArray *str_to_bytes(const char *str) +{ + GByteArray *bytes =3D g_byte_array_new(); + char byte[3] =3D {0}; + size_t len =3D strlen(str); + guint8 value =3D 0; + + if (len % 2 !=3D 0) { + g_byte_array_free(bytes, true); + return NULL; + } + + for (size_t i =3D 0; i < len; i +=3D 2) { + byte[0] =3D str[i]; + byte[1] =3D str[i + 1]; + value =3D (guint8)g_ascii_strtoull(byte, NULL, 16); + g_byte_array_append(bytes, &value, 1); + } + + return bytes; +} + +static void patch_hwaddr(unsigned int vcpu_index, void *userdata) +{ + uint64_t addr =3D (uint64_t)userdata; + GString *str =3D g_string_new(NULL); + g_string_printf(str, "patching: @0x%" + PRIx64 "\n", + addr); + qemu_plugin_outs(str->str); + g_string_free(str, true); + + struct qemu_plugin_address_space_info *info =3D + qemu_plugin_get_current_vcpu_address_spaces(); + + if (!info) { + qemu_plugin_outs("Failed to get address spaces\n"); + return; + } + + qemu_plugin_outs("Got address spaces\n"); + + int n_address_spaces =3D qemu_plugin_n_address_spaces(info); + unsigned int memory_idx; + + for (memory_idx =3D 0; memory_idx < n_address_spaces; memory_idx++) { + const char *name =3D qemu_plugin_address_space_name(info, memory_i= dx); + if (!g_strcmp0(name, "cpu-memory-0")) { + break; + } + } + + if (memory_idx >=3D n_address_spaces) { + qemu_plugin_outs("No matching address space\n"); + return; + } + + qemu_plugin_outs("Got address space cpu-memory-0\n"); + + qemu_plugin_outs("Writing memory (hwaddr)...\n"); + enum qemu_plugin_hwaddr_operation_result result =3D + qemu_plugin_write_memory_hwaddr(memory_idx, addr, patch_data); + + + if (result !=3D QEMU_PLUGIN_HWADDR_OPERATION_OK) { + GString *errmsg =3D g_string_new(NULL); + g_string_printf(errmsg, "Failed to write memory: %d\n", result); + qemu_plugin_outs(errmsg->str); + g_string_free(errmsg, true); + return; + } + + GByteArray *read_data =3D g_byte_array_new(); + + result =3D qemu_plugin_read_memory_hwaddr(memory_idx, addr, read_data,= patch_data->len); + + qemu_plugin_outs("Reading memory...\n"); + + if (result !=3D QEMU_PLUGIN_HWADDR_OPERATION_OK) { + GString *errmsg =3D g_string_new(NULL); + g_string_printf(errmsg, "Failed to read memory: %d\n", result); + qemu_plugin_outs(errmsg->str); + g_string_free(errmsg, true); + return; + } + + if (memcmp(patch_data->data, read_data->data, patch_data->len) !=3D 0)= { + qemu_plugin_outs("Failed to read back written data\n"); + } + + qemu_plugin_outs("Success!\n"); + + return; +} + +static void patch_vaddr(unsigned int vcpu_index, void *userdata) +{ + uint64_t addr =3D (uint64_t)userdata; + GString *str =3D g_string_new(NULL); + g_string_printf(str, "patching: @0x%"=20 + PRIx64 "\n", + addr); + qemu_plugin_outs(str->str); + g_string_free(str, true); + + qemu_plugin_outs("Writing memory (vaddr)...\n"); + + if (!qemu_plugin_write_memory_vaddr(addr, patch_data)) { + qemu_plugin_outs("Failed to write memory\n"); + return; + } + + qemu_plugin_outs("Reading memory (vaddr)...\n"); + + + GByteArray *read_data =3D g_byte_array_new(); + + if (!qemu_plugin_read_memory_vaddr(addr, read_data, patch_data->len)) { + qemu_plugin_outs("Failed to read memory\n"); + return; + } + + if (memcmp(patch_data->data, read_data->data, patch_data->len) !=3D 0)= { + qemu_plugin_outs("Failed to read back written data\n"); + } + + qemu_plugin_outs("Success!\n"); + + return; +} + +static void debug_disas(unsigned int vcpu_index, void *userdata) +{ + GString *debug_info =3D (GString *)userdata; + qemu_plugin_outs(debug_info->str); +} + +static void debug_print_newline(unsigned int vcpu_index, void *userdata) +{ + qemu_plugin_outs("\n"); +} + +/* + * Callback on translation of a translation block. + */ +static void vcpu_tb_trans_cb(qemu_plugin_id_t id, struct qemu_plugin_tb *t= b) +{ + uint64_t addr =3D 0; + GByteArray *insn_data =3D g_byte_array_new(); + for (size_t i =3D 0; i < qemu_plugin_tb_n_insns(tb); i++) { + struct qemu_plugin_insn *insn =3D qemu_plugin_tb_get_insn(tb, i); + + if (use_hwaddr) { + uint64_t vaddr =3D qemu_plugin_insn_vaddr(insn); + if (!qemu_plugin_translate_vaddr(vaddr, &addr)) { + qemu_plugin_outs("Failed to translate vaddr\n"); + continue; + } + } else { + addr =3D qemu_plugin_insn_vaddr(insn); + } + + g_byte_array_set_size(insn_data, qemu_plugin_insn_size(insn)); + qemu_plugin_insn_data(insn, insn_data->data, insn_data->len); + + if (insn_data->len >=3D target_data->len && + !memcmp(insn_data->data, target_data->data, + MIN(target_data->len, insn_data->len))) { + if (use_hwaddr) { + qemu_plugin_register_vcpu_tb_exec_cb(tb, patch_hwaddr, + QEMU_PLUGIN_CB_NO_REG= S, + (void *)addr); + } else { + qemu_plugin_register_vcpu_tb_exec_cb(tb, patch_vaddr, + QEMU_PLUGIN_CB_NO_REG= S, + (void *)addr); + } + } + } + for (size_t i =3D 0; i < qemu_plugin_tb_n_insns(tb); i++) { + struct qemu_plugin_insn *insn =3D qemu_plugin_tb_get_insn(tb, i); + uint64_t vaddr =3D qemu_plugin_insn_vaddr(insn); + uint64_t hwaddr =3D (uint64_t)qemu_plugin_insn_haddr(insn); + uint64_t translated_hwaddr =3D 0; + if (!qemu_plugin_translate_vaddr(vaddr, &translated_hwaddr)) { + qemu_plugin_outs("Failed to translate vaddr\n"); + continue; + } + char *disas =3D qemu_plugin_insn_disas(insn); + GString *str =3D g_string_new(NULL); + g_string_printf(str, + "vaddr: 0x%" PRIx64 " hwaddr: 0x%" PRIx64 + " translated: 0x%" PRIx64 " : %s\n", + vaddr, hwaddr, translated_hwaddr, disas); + g_free(disas); + if (debug_insns) { + qemu_plugin_register_vcpu_insn_exec_cb(insn, debug_disas, + QEMU_PLUGIN_CB_NO_REGS, + str); + } + + } + + if (debug_insns) { + qemu_plugin_register_vcpu_tb_exec_cb(tb, debug_print_newline, + QEMU_PLUGIN_CB_NO_REGS, + NULL); + } + + g_byte_array_free(insn_data, true); +} + +static void usage(void) +{ + fprintf(stderr, "Usage: ,target=3D,patch=3D" + "[,use_hwaddr=3D]" + "[,debug_insns=3D]\n"); +} + +/* + * Called when the plugin is installed + */ +QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id, + const qemu_info_t *info, int ar= gc, + char **argv) +{ + + use_hwaddr =3D true; + debug_insns =3D false; + target_data =3D NULL; + patch_data =3D NULL; + + if (argc > 4) { + usage(); + return -1; + } + + for (size_t i =3D 0; i < argc; i++) { + char *opt =3D argv[i]; + g_auto(GStrv) tokens =3D g_strsplit(opt, "=3D", 2); + if (g_strcmp0(tokens[0], "use_hwaddr") =3D=3D 0) { + if (!qemu_plugin_bool_parse(tokens[0], tokens[1], &use_hwaddr)= ) { + fprintf(stderr, + "Failed to parse boolean argument use_hwaddr\n"); + return -1; + } + } else if (g_strcmp0(tokens[0], "debug_insns") =3D=3D 0) { + if (!qemu_plugin_bool_parse(tokens[0], tokens[1], &debug_insns= )) { + fprintf(stderr, + "Failed to parse boolean argument debug_insns\n"); + return -1; + } + } else if (g_strcmp0(tokens[0], "target") =3D=3D 0) { + target_data =3D str_to_bytes(tokens[1]); + if (!target_data) { + fprintf(stderr, + "Failed to parse target bytes.\n"); + return -1; + } + } else if (g_strcmp0(tokens[0], "patch") =3D=3D 0) { + patch_data =3D str_to_bytes(tokens[1]); + if (!patch_data) { + fprintf(stderr, "Failed to parse patch bytes.\n"); + return -1; + } + } else { + fprintf(stderr, "Unknown argument: %s\n", tokens[0]); + usage(); + return -1; + } + } + + if (!target_data) { + fprintf(stderr, "target argument is required\n"); + usage(); + return -1; + } + + if (!patch_data) { + fprintf(stderr, "patch argument is required\n"); + usage(); + return -1; + } + + if (target_data->len !=3D patch_data->len) { + fprintf(stderr, "Target and patch data must be the same length\n"); + return -1; + } + + qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans_cb); + + return 0; +} diff --git a/tests/tcg/x86_64/Makefile.softmmu-target b/tests/tcg/x86_64/Ma= kefile.softmmu-target index ef6bcb4dc7..8d3a067c33 100644 --- a/tests/tcg/x86_64/Makefile.softmmu-target +++ b/tests/tcg/x86_64/Makefile.softmmu-target @@ -7,18 +7,27 @@ # =20 I386_SYSTEM_SRC=3D$(SRC_PATH)/tests/tcg/i386/system -X64_SYSTEM_SRC=3D$(SRC_PATH)/tests/tcg/x86_64/system +X86_64_SYSTEM_SRC=3D$(SRC_PATH)/tests/tcg/x86_64/system =20 # These objects provide the basic boot code and helper functions for all t= ests CRT_OBJS=3Dboot.o =20 -CRT_PATH=3D$(X64_SYSTEM_SRC) -LINK_SCRIPT=3D$(X64_SYSTEM_SRC)/kernel.ld +X86_64_TEST_C_SRCS=3D$(wildcard $(X86_64_SYSTEM_SRC)/*.c) +X86_64_TEST_S_SRCS=3D + +X86_64_C_TESTS =3D $(patsubst $(X86_64_SYSTEM_SRC)/%.c, %, $(X86_64_TEST_C= _SRCS)) +X86_64_S_TESTS =3D $(patsubst $(X86_64_SYSTEM_SRC)/%.S, %, $(X86_64_TEST_S= _SRCS)) + +X86_64_TESTS =3D $(X86_64_C_TESTS) +X86_64_TESTS +=3D $(X86_64_S_TESTS) + +CRT_PATH=3D$(X86_64_SYSTEM_SRC) +LINK_SCRIPT=3D$(X86_64_SYSTEM_SRC)/kernel.ld LDFLAGS=3D-Wl,-T$(LINK_SCRIPT) -Wl,-melf_x86_64 CFLAGS+=3D-nostdlib -ggdb -O0 $(MINILIB_INC) LDFLAGS+=3D-static -nostdlib $(CRT_OBJS) $(MINILIB_OBJS) -lgcc =20 -TESTS+=3D$(MULTIARCH_TESTS) +TESTS+=3D$(X86_64_TESTS) $(MULTIARCH_TESTS) EXTRA_RUNS+=3D$(MULTIARCH_RUNS) =20 # building head blobs @@ -27,11 +36,24 @@ EXTRA_RUNS+=3D$(MULTIARCH_RUNS) %.o: $(CRT_PATH)/%.S $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -Wa,--noexecstack -c $< -o $@ =20 -# Build and link the tests +# Build and link the multiarch tests %: %.c $(LINK_SCRIPT) $(CRT_OBJS) $(MINILIB_OBJS) $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(LDFLAGS) =20 +# Build and link the arch tests +%: $(X86_64_SYSTEM_SRC)/%.c $(LINK_SCRIPT) $(CRT_OBJS) $(MINILIB_OBJS) + $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(LDFLAGS) + memory: CFLAGS+=3D-DCHECK_UNALIGNED=3D1 +patch-target: CFLAGS+=3D-O0 =20 # Running QEMU_OPTS+=3D-device isa-debugcon,chardev=3Doutput -device isa-debug-exit,= iobase=3D0xf4,iosize=3D0x4 -kernel + +# Add patch-target to ADDITIONAL_PLUGINS_TESTS +ADDITIONAL_PLUGINS_TESTS +=3D patch-target + +run-plugin-patch-target-with-libpatch.so: \ + PLUGIN_ARGS=3D$(COMMA)target=3Dffc0$(COMMA)patch=3D9090$(COMMA)use_hwaddr= =3Dtrue$(COMMA)debug_insns=3Dfalse +run-plugin-patch-target-with-libpatch.so: \ + CHECK_PLUGIN_OUTPUT_COMMAND=3D$(X86_64_SYSTEM_SRC)/validate-patch.py $@.o= ut \ No newline at end of file diff --git a/tests/tcg/x86_64/system/patch-target.c b/tests/tcg/x86_64/syst= em/patch-target.c new file mode 100644 index 0000000000..671987a873 --- /dev/null +++ b/tests/tcg/x86_64/system/patch-target.c @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright (C) 2025, Rowan Hart + * + * License: GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + * This test target increments a value 100 times. The patcher converts the + * inc instruction to a nop, so it only increments the value once. + * + */ +#include + +int main(void) +{ + ml_printf("Running test...\n"); +#if defined(__x86_64__) + ml_printf("Testing insn memory read/write...\n"); + unsigned int x =3D 0; + for (int i =3D 0; i < 100; i++) { + asm volatile ( + "inc %[x]" + : [x] "+a" (x) + ); + } + ml_printf("Value: %d\n", x); +#else + #error "This test is only valid for x86_64 architecture." +#endif + return 0; +} diff --git a/tests/tcg/x86_64/system/validate-patch.py b/tests/tcg/x86_64/s= ystem/validate-patch.py new file mode 100755 index 0000000000..700950eae5 --- /dev/null +++ b/tests/tcg/x86_64/system/validate-patch.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +# +# validate-patch.py: check the patch applies +# +# This program takes two inputs: +# - the plugin output +# - the binary output +# +# Copyright (C) 2024 +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import sys +from argparse import ArgumentParser + +def main() -> None: + """ + Process the arguments, injest the program and plugin out and + verify they match up and report if they do not. + """ + parser =3D ArgumentParser(description=3D"Validate patch") + parser.add_argument('test_output', + help=3D"The output from the test itself") + parser.add_argument('plugin_output', + help=3D"The output from plugin") + args =3D parser.parse_args() + + with open(args.test_output, 'r') as f: + test_data =3D f.read() + with open(args.plugin_output, 'r') as f: + plugin_data =3D f.read() + if "Value: 1" in test_data: + sys.exit(0) + else: + sys.exit(1) + +if __name__ =3D=3D "__main__": + main() + --=20 2.49.0 From nobody Fri Dec 19 09:50:26 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1747820736; cv=none; d=zohomail.com; s=zohoarc; b=SO/M4UZyZcs7XiL13MsrN0FacfnsSN6xHvZoXOrCRBPXy2AGSijeSUEHzchexMAQs4RIsRuA2GVMfuGoyAQE4m6V8xLdaJdAU4LkMHpQadk3HRsT+X/TJ+0pwAzzSDgPXQZhwNkoAmRUQYaaD1YY2iDstS3MZ8hLqUvNdiLs/9E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1747820736; 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=n/DBzAreAwvr+Hgw4v2qtgUXV9VD6oRQUsc4eI1UxtY=; b=BnGlNyLHpIK9tnfN23xXJ46uHcVEZK+0te8eejlqt7cycKV2YPWHsLYQHJElFiks7Naknkh5v+Dy3EzQQculDrrXyYTt/2RilaLBcg9EBY0enMjsU/CsAk0k4nbUZ17+NPSK8iIR2Csjfgu61Dq/pdrlq/EsUyJUnpgMPk3Ubj4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1747820736716292.5557235998266; Wed, 21 May 2025 02:45:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uHfzR-0002m4-1H; Wed, 21 May 2025 05:43:57 -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 1uHfzL-0002kd-VV for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:53 -0400 Received: from mail-pf1-x42b.google.com ([2607:f8b0:4864:20::42b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uHfzD-0001c8-82 for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:51 -0400 Received: by mail-pf1-x42b.google.com with SMTP id d2e1a72fcca58-7376e311086so7932589b3a.3 for ; Wed, 21 May 2025 02:43:42 -0700 (PDT) Received: from shemhazi.lan ([50.46.174.34]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-742a9829b87sm9255668b3a.114.2025.05.21.02.43.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 02:43:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747820621; x=1748425421; 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=n/DBzAreAwvr+Hgw4v2qtgUXV9VD6oRQUsc4eI1UxtY=; b=bd2oJxP4ndQe6xkqGCE5b/lTjMGh6etJ2ycEvvzktoGmphfmlvzjhMkuqQniBni+wz mSK6v6bOsOgcTSSzj02FvjSEwVA7TYFehlzKJzToM+w5oxPRWAwD6t1jCqExocPuzgQ6 dC0ZtFBaWM0OkUNzkNyE9B/hJZqNDumZOaePNzblF2Z1mAS9Dcv2xT3druvNjndMQw0D W6NLY+lktLm6MswhsqGFdzuAEf3u/QeQBwDfzkM123yH3qGsL6e2cZ+nTN2uDQqC2iul 6EgZN/W/fgK9ssgE9ytJmXuqOj0fxp8VBm++RT4dqXoUZnCy9N/i4qMdn6iysLlDxzYM 90ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747820621; x=1748425421; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=n/DBzAreAwvr+Hgw4v2qtgUXV9VD6oRQUsc4eI1UxtY=; b=XrKDqhb9vRl7UiFIcGOCkZ2SylbofbmLJjLpffatVWaT/YQsWoqTA0DoD6fY5eXLBx ib2Q5WdcjfAGrmKsd/2njBoaT2R2eH7rfN6T1Ihv2KN854BQk+Pt5Bx9CUefIo3xutUI +qaefVgv1+q3GdvV4gfpAkMCllacf65SbrvMIAEKfZczXA60MGEMK+agWCI6CncN1mlg EVd2+1o25sQEVvZlxbNUZI/cgIc1xPe1CR6TZcdZONz+2s6jZ4grPHY+b+d6qJFUFE93 lzM/KA9udtt1ch5eucY4odnUeQl6F6lr1mquca1w5f6oc+osc/FDygTtd/bwF8+kQaSV ApVw== X-Gm-Message-State: AOJu0YyIoY3VKPWI+pSmkc2VTPODb9Wtiwa5dds4So8FjHYPiIFAummI nBovotUQLlyHr8m/GwmyY6quxyUkVPxIdyMvgs7fwf4++bRe/xk2vX79N8p9EkiSgZY= X-Gm-Gg: ASbGncuDc69WKDo69Rm+MXiAedOi71rGqyNQmVXBdXRwquXOtJU9jZvko84g7MnsC7Y i6mDiVb3A3WAO8h1Hd+b9NL1fXOqdHNqh/R1L3+YS9ad8ikVUCwwgHKZ9e+Lhfc0obq9FbVhxj+ WRzXWEjjvFVEnCZzCriDi4rPg1x4fGEhappgv/sleVXNhitNpsnW+P6j9gyY52yYQY3PA1q937Q Ltq642PVzSdSbh0rmS+366c8HuzdniMZnq8Zbx+bP3IvRWZ09bPkYUU4h3hqYHWjD7rch+V5XI/ avkOHB+2rUA3FX4QUjbsiK/zw2tJn7XIq+nrt9YtDpFjjv3eRWM= X-Google-Smtp-Source: AGHT+IGakEs4TCEtpoPaoWFbR+6eq9HJl1QCHSOe9TLjtPUdlMy0EuzVlsH825iUrM5JFWRFt52ZMw== X-Received: by 2002:a05:6a00:4b08:b0:730:95a6:3761 with SMTP id d2e1a72fcca58-742a97a720bmr29817678b3a.3.1747820620634; Wed, 21 May 2025 02:43:40 -0700 (PDT) From: Rowan Hart To: qemu-devel@nongnu.org Cc: Pierrick Bouvier , Alexandre Iooss , Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Eduardo Habkost , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Paolo Bonzini , novafacing Subject: [PATCH v3 7/8] Add hypercalls plugin and test Date: Wed, 21 May 2025 02:43:31 -0700 Message-ID: <20250521094333.4075796-8-rowanbhart@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250521094333.4075796-1-rowanbhart@gmail.com> References: <20250521094333.4075796-1-rowanbhart@gmail.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::42b; envelope-from=rowanbhart@gmail.com; helo=mail-pf1-x42b.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, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1747820738806116600 Content-Type: text/plain; charset="utf-8" From: novafacing Signed-off-by: novafacing Signed-off-by: Rowan Hart --- tests/tcg/Makefile.target | 1 + tests/tcg/plugins/hypercalls.c | 552 ++++++++++++++++++ tests/tcg/plugins/meson.build | 2 +- tests/tcg/x86_64/Makefile.softmmu-target | 6 +- tests/tcg/x86_64/system/hypercalls-target.c | 45 ++ .../tcg/x86_64/system/validate-hypercalls.py | 40 ++ 6 files changed, 644 insertions(+), 2 deletions(-) create mode 100644 tests/tcg/plugins/hypercalls.c create mode 100644 tests/tcg/x86_64/system/hypercalls-target.c create mode 100755 tests/tcg/x86_64/system/validate-hypercalls.py diff --git a/tests/tcg/Makefile.target b/tests/tcg/Makefile.target index 4b709a9d18..5ac9638102 100644 --- a/tests/tcg/Makefile.target +++ b/tests/tcg/Makefile.target @@ -177,6 +177,7 @@ RUN_TESTS+=3D$(EXTRA_RUNS) # exercise things. We can define them on a per-test basis here. run-plugin-%-with-libmem.so: PLUGIN_ARGS=3D$(COMMA)inline=3Dtrue run-plugin-%-with-libpatch.so: PLUGIN_ARGS=3D$(COMMA)target=3Dffffffff$(CO= MMA)patch=3D00000000 +run-plugin-%-with-libhypercalls.so: PLUGIN_ARGS=3D$(COMMA)ignore_unsupport= ed=3Dtrue =20 ifeq ($(filter %-softmmu, $(TARGET)),) run-%: % diff --git a/tests/tcg/plugins/hypercalls.c b/tests/tcg/plugins/hypercalls.c new file mode 100644 index 0000000000..ece2716ae8 --- /dev/null +++ b/tests/tcg/plugins/hypercalls.c @@ -0,0 +1,552 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright (C) 2024, Rowan Hart + * + * License: GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + * This plugin implements a simple hypercall interface for guests (both sy= stem + * and user mode) to call certain operations from the host. + */ +#include "glib.h" +#include "glibconfig.h" +#include +#include +#include +#include +#include +#include +#include + +#include + +QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; + +#define AARCH64_N_HYPERCALL_INSNS (28) +#define AARCH64_HYPERCALL_INSN_LEN (4) +#define AARCH64_HYPERCALL_MAX (AARCH64_N_HYPERCALL_INSNS) +#define ARM_N_HYPERCALL_INSNS (12) +#define ARM_HYPERCALL_INSN_LEN (4) +#define ARM_HYPERCALL_MAX (ARM_N_HYPERCALL_INSNS) +#define X86_HYPERCALL_INSN_LEN (2) +#define X86_HYPERCALL_VALUE_BASE (0x4711) +#define X86_HYPERCALL_MAX (0x10000) +#define N_HYPERCALL_ARGS (4) + +static bool ignore_unsupported; + +static struct qemu_plugin_register *get_register(const char *name); +static uint64_t byte_array_to_uint64(GByteArray *buf); + +enum HypercallInsnType { + CONSTANT, + CALLBACK, +}; + + +/* + * Checks an instruction and returns its hypercall number, if it is + * a hypercall instruction, or -1 if it is not. Called at execution + * time. + */ +typedef int32_t (*hypercall_nr_cb)(GByteArray *); + +/* + * Checks an instruction and returns whether it is a hypercall, or -1 if i= t is + * not. Called at execution time. + */ +typedef bool (*is_hypercall_cb)(GByteArray *); + +/* + * Specifies a Hypercall for an architecture: + * + * - Architecture name + * - Whether it is enabled + * - The hypercall instruction + * - The register names to pass the hypercall # and args + */ +struct HypercallSpec { + const bool enabled; + const char *name; + const bool le; + const char *args[N_HYPERCALL_ARGS]; + const hypercall_nr_cb hypercall_nr_cb; + const is_hypercall_cb is_hypercall_cb; +}; + +static int32_t aarch64_hypercall_nr_cb(GByteArray *insn) +{ + if (insn->len !=3D AARCH64_HYPERCALL_INSN_LEN) { + return -1; + } + + static const uint8_t + hypercall_insns[AARCH64_N_HYPERCALL_INSNS][AARCH64_HYPERCALL_INSN_LEN]= =3D { + { 0xaa, 0x4, 0x0, 0x84 }, + { 0xaa, 0x5, 0x0, 0xa5 }, + { 0xaa, 0x6, 0x0, 0xc6 }, + { 0xaa, 0x7, 0x0, 0xe7 }, + { 0xaa, 0x8, 0x1, 0x8 }, + { 0xaa, 0x9, 0x1, 0x29 }, + { 0xaa, 0xa, 0x1, 0x4a }, + { 0xaa, 0xb, 0x1, 0x6b }, + { 0xaa, 0xc, 0x1, 0x8c }, + { 0xaa, 0xd, 0x1, 0xad }, + { 0xaa, 0xe, 0x1, 0xce }, + { 0xaa, 0xf, 0x1, 0xef }, + { 0xaa, 0x10, 0x2, 0x10 }, + { 0xaa, 0x11, 0x2, 0x31 }, + { 0xaa, 0x12, 0x2, 0x52 }, + { 0xaa, 0x13, 0x2, 0x73 }, + { 0xaa, 0x14, 0x2, 0x94 }, + { 0xaa, 0x15, 0x2, 0xb5 }, + { 0xaa, 0x16, 0x2, 0xd6 }, + { 0xaa, 0x17, 0x2, 0xf7 }, + { 0xaa, 0x18, 0x3, 0x18 }, + { 0xaa, 0x19, 0x3, 0x39 }, + { 0xaa, 0x1a, 0x3, 0x5a }, + { 0xaa, 0x1b, 0x3, 0x7b }, + { 0xaa, 0x1c, 0x3, 0x9c }, + { 0xaa, 0x1d, 0x3, 0xbd }, + { 0xaa, 0x1e, 0x3, 0xde }, + { 0xaa, 0x1f, 0x3, 0xff }, + }; + + for (int32_t i =3D 0; i < AARCH64_N_HYPERCALL_INSNS; i++) { + if (!memcmp(hypercall_insns[i], insn->data, insn->len)) { + return i; + } + } + return -1; +} + +static bool aarch64_is_hypercall_cb(GByteArray *insn) +{ + return aarch64_hypercall_nr_cb(insn) < 0; +} + + +static int32_t aarch64_be_hypercall_nr_cb(GByteArray *insn) +{ + if (insn->len !=3D AARCH64_HYPERCALL_INSN_LEN) { + return -1; + } + + static const uint8_t + hypercall_insns[AARCH64_N_HYPERCALL_INSNS][AARCH64_HYPERCALL_INSN_LEN]= =3D { + {0x84, 0x0, 0x4, 0xaa}, + {0xa5, 0x0, 0x5, 0xaa}, + {0xc6, 0x0, 0x6, 0xaa}, + {0xe7, 0x0, 0x7, 0xaa}, + {0x8, 0x1, 0x8, 0xaa}, + {0x29, 0x1, 0x9, 0xaa}, + {0x4a, 0x1, 0xa, 0xaa}, + {0x6b, 0x1, 0xb, 0xaa}, + {0x8c, 0x1, 0xc, 0xaa}, + {0xad, 0x1, 0xd, 0xaa}, + {0xce, 0x1, 0xe, 0xaa}, + {0xef, 0x1, 0xf, 0xaa}, + {0x10, 0x2, 0x10, 0xaa}, + {0x31, 0x2, 0x11, 0xaa}, + {0x52, 0x2, 0x12, 0xaa}, + {0x73, 0x2, 0x13, 0xaa}, + {0x94, 0x2, 0x14, 0xaa}, + {0xb5, 0x2, 0x15, 0xaa}, + {0xd6, 0x2, 0x16, 0xaa}, + {0xf7, 0x2, 0x17, 0xaa}, + {0x18, 0x3, 0x18, 0xaa}, + {0x39, 0x3, 0x19, 0xaa}, + {0x5a, 0x3, 0x1a, 0xaa}, + {0x7b, 0x3, 0x1b, 0xaa}, + {0x9c, 0x3, 0x1c, 0xaa}, + {0xbd, 0x3, 0x1d, 0xaa}, + {0xde, 0x3, 0x1e, 0xaa}, + {0xff, 0x3, 0x1f, 0xaa}, + }; + + for (int32_t i =3D 0; i < AARCH64_N_HYPERCALL_INSNS; i++) { + if (!memcmp(hypercall_insns[i], insn->data, insn->len)) { + return i; + } + } + return -1; +} + +static bool aarch64_be_is_hypercall_cb(GByteArray *insn) +{ + return aarch64_be_hypercall_nr_cb(insn) < 0; +} + + +static int32_t arm_hypercall_nr_cb(GByteArray *insn) +{ + if (insn->len !=3D ARM_HYPERCALL_INSN_LEN) { + return -1; + } + + static const uint8_t + hypercall_insns[ARM_N_HYPERCALL_INSNS][ARM_HYPERCALL_INSN_LEN] =3D { + { 0xe1, 0x84, 0x40, 0x4 }, + { 0xe1, 0x85, 0x50, 0x5 }, + { 0xe1, 0x86, 0x60, 0x6 }, + { 0xe1, 0x87, 0x70, 0x7 }, + { 0xe1, 0x88, 0x80, 0x8 }, + { 0xe1, 0x89, 0x90, 0x9 }, + { 0xe1, 0x8a, 0xa0, 0xa }, + { 0xe1, 0x8b, 0xb0, 0xb }, + { 0xe1, 0x8c, 0xc0, 0xc }, + { 0xe1, 0x8d, 0xd0, 0xd }, + { 0xe1, 0x8e, 0xe0, 0xe }, + { 0xe1, 0x8f, 0xf0, 0xf }, + }; + + for (int32_t i =3D 0; i < ARM_N_HYPERCALL_INSNS; i++) { + if (!memcmp(hypercall_insns[i], insn->data, insn->len)) { + return i; + } + } + return -1; +} + +static bool arm_is_hypercall_cb(GByteArray *insn) +{ + return arm_hypercall_nr_cb(insn) < 0; +} + +static int32_t arm_be_hypercall_nr_cb(GByteArray *insn) +{ + if (insn->len !=3D ARM_HYPERCALL_INSN_LEN) { + return -1; + } + + static const uint8_t + hypercall_insns[ARM_N_HYPERCALL_INSNS][ARM_HYPERCALL_INSN_LEN] =3D { + {0x4, 0x40, 0x84, 0xe1}, + {0x5, 0x50, 0x85, 0xe1}, + {0x6, 0x60, 0x86, 0xe1}, + {0x7, 0x70, 0x87, 0xe1}, + {0x8, 0x80, 0x88, 0xe1}, + {0x9, 0x90, 0x89, 0xe1}, + {0xa, 0xa0, 0x8a, 0xe1}, + {0xb, 0xb0, 0x8b, 0xe1}, + {0xc, 0xc0, 0x8c, 0xe1}, + {0xd, 0xd0, 0x8d, 0xe1}, + {0xe, 0xe0, 0x8e, 0xe1}, + {0xf, 0xf0, 0x8f, 0xe1}, + }; + + for (int32_t i =3D 0; i < ARM_N_HYPERCALL_INSNS; i++) { + if (!memcmp(hypercall_insns[i], insn->data, insn->len)) { + return i; + } + } + return -1; +} + +static bool arm_be_is_hypercall_cb(GByteArray *insn) +{ + return arm_be_hypercall_nr_cb(insn) < 0; +} + +static int32_t x86_64_hypercall_nr_cb(GByteArray *insn) +{ + if (insn->len !=3D X86_HYPERCALL_INSN_LEN) { + return -1; + } + + uint8_t cpuid[] =3D { 0x0f, 0xa2 }; + if (!memcmp(cpuid, insn->data, insn->len)) { + GByteArray *reg =3D g_byte_array_new(); + qemu_plugin_read_register(get_register("rax"), reg); + uint64_t value =3D byte_array_to_uint64(reg); + g_byte_array_free(reg, true); + =20 + + if (!(value & X86_HYPERCALL_VALUE_BASE)) { + return -1; + } + + value =3D (value >> 16) & 0xffff; + + if (value >=3D X86_HYPERCALL_MAX) { + return -1; + } + + return (int32_t)value; + } + + return -1; +} + +static bool x86_64_is_hypercall_cb(GByteArray *insn) +{ + if (insn->len !=3D X86_HYPERCALL_INSN_LEN) { + return false; + } + + uint8_t cpuid[] =3D { 0x0f, 0xa2 }; + if (!memcmp(cpuid, insn->data, insn->len)) { + return true; + } + + return false; +} + +static int32_t i386_hypercall_nr_cb(GByteArray *insn) +{ + if (insn->len !=3D X86_HYPERCALL_INSN_LEN) { + return -1; + } + + uint8_t cpuid[] =3D { 0x0f, 0xa2 }; + if (!memcmp(cpuid, insn->data, insn->len)) { + GByteArray *reg =3D g_byte_array_new(); + qemu_plugin_read_register(get_register("eax"), reg); + uint64_t value =3D byte_array_to_uint64(reg); + g_byte_array_free(reg, true); + + if (!(value & X86_HYPERCALL_VALUE_BASE)) { + return -1; + } + + value =3D (value >> 16) & 0xffff; + + if (value >=3D X86_HYPERCALL_MAX) { + return -1; + } + return (int32_t)value; + } + + return -1; + +} + +static bool i386_is_hypercall_cb(GByteArray *insn) +{ + if (insn->len !=3D X86_HYPERCALL_INSN_LEN) { + return false; + } + + uint8_t cpuid[] =3D { 0x0f, 0xa2 }; + if (!memcmp(cpuid, insn->data, insn->len)) { + return true; + } + + return false; + +} + +static const struct HypercallSpec *hypercall_spec; + +static const struct HypercallSpec hypercall_specs[] =3D { + { true, "aarch64", true, { + "x0", "x1", "x2", "x3", + }, aarch64_hypercall_nr_cb, aarch64_is_hypercall_cb + }, + { true, "aarch64_be", false, { + "x0", "x1", "x2", "x3", + }, aarch64_be_hypercall_nr_cb, aarch64_be_is_hypercall_cb + }, + { true, "arm", true, { + "r0", "r1", "r2", "r3", + }, arm_hypercall_nr_cb, arm_is_hypercall_cb + }, + { true, "armeb", false, { + "r0", "r1", "r2", "r3" + }, arm_be_hypercall_nr_cb, arm_be_is_hypercall_cb + }, + { true, "i386", true, { + "edi", "esi", "edx", "ecx" + }, i386_hypercall_nr_cb, i386_is_hypercall_cb + }, + { true, "x86_64", true, { + "rdi", "rsi", "rdx", "rcx" + + }, x86_64_hypercall_nr_cb, x86_64_is_hypercall_cb + }, + { false, NULL, .le =3D false, {NULL, NULL, NULL, NULL}, NULL}, +}; + +static GArray *hypercall_insns; + +/* + * Returns a handle to a register with a given name, or NULL if there is no + * such register. + */ +static struct qemu_plugin_register *get_register(const char *name) +{ + GArray *registers =3D qemu_plugin_get_registers(); + + struct qemu_plugin_register *handle =3D NULL; + + qemu_plugin_reg_descriptor *reg_descriptors =3D + (qemu_plugin_reg_descriptor *)registers->data; + + for (size_t i =3D 0; i < registers->len; i++) { + if (!strcmp(reg_descriptors[i].name, name)) { + handle =3D reg_descriptors[i].handle; + } + } + + g_array_free(registers, true); + + return handle; +} + +/* + * Transforms a byte array with at most 8 entries into a uint64_t + * depending on the target machine's endianness. + */ +static uint64_t byte_array_to_uint64(GByteArray *buf) +{ + uint64_t value =3D 0; + if (hypercall_spec->le) { + for (int i =3D 0; i < buf->len && i < sizeof(uint64_t); i++) { + value |=3D ((uint64_t)buf->data[i]) << (i * 8); + } + } else { + for (int i =3D 0; i < buf->len && i < sizeof(uint64_t); i++) { + value |=3D ((uint64_t)buf->data[i]) << ((buf->len - 1 - i) * 8= ); + } + } + return value; +} + +/* + * Handle a "hypercall" instruction, which has some special meaning for th= is + * plugin. + */ +static void hypercall(unsigned int vcpu_index, void *userdata) +{ + GByteArray *insn_data =3D (GByteArray *)userdata; + int32_t hypercall_nr =3D hypercall_spec->hypercall_nr_cb(insn_data); + + if (hypercall_nr < 0) { + return; + } + + uint64_t args[N_HYPERCALL_ARGS] =3D {0}; + GByteArray *buf =3D g_byte_array_new(); + for (size_t i =3D 0; i < N_HYPERCALL_ARGS; i++) { + g_byte_array_set_size(buf, 0); + struct qemu_plugin_register *reg =3D=20 + get_register(hypercall_spec->args[i]); + qemu_plugin_read_register(reg, buf); + args[i] =3D byte_array_to_uint64(buf); + } + g_byte_array_free(buf, true); + + switch (hypercall_nr) { + /* + * The write hypercall (#0x01) tells the plugin to write random bytes + * of a given size into the memory of the emulated system at a particu= lar + * vaddr + */ + case 1: { + GByteArray *data =3D g_byte_array_new(); + g_byte_array_set_size(data, args[1]); + for (uint64_t i =3D 0; i < args[1]; i++) { + data->data[i] =3D (uint8_t)g_random_int(); + } + qemu_plugin_write_memory_vaddr(args[0], data); + break; + } + default: + break; + } +} + +/* + * Callback on translation of a translation block. + */ +static void vcpu_tb_trans_cb(qemu_plugin_id_t id, struct qemu_plugin_tb *t= b) +{ + for (size_t i =3D 0; i < qemu_plugin_tb_n_insns(tb); i++) { + struct qemu_plugin_insn *insn =3D qemu_plugin_tb_get_insn(tb, i); + GByteArray *insn_data =3D g_byte_array_new(); + size_t insn_len =3D qemu_plugin_insn_size(insn); + g_byte_array_set_size(insn_data, insn_len); + qemu_plugin_insn_data(insn, insn_data->data, insn_data->len); + + if (hypercall_spec->is_hypercall_cb(insn_data)) { + g_array_append_val(hypercall_insns, insn_data); + qemu_plugin_register_vcpu_insn_exec_cb(insn, hypercall, + QEMU_PLUGIN_CB_R_REGS, + (void *)insn_data); + } else { + g_byte_array_free(insn_data, true); + } + + } +} + +static void atexit_cb(qemu_plugin_id_t id, void *userdata) +{ + for (size_t i =3D 0; i < hypercall_insns->len; i++) { + g_byte_array_free(g_array_index(hypercall_insns, GByteArray *, i), + true); + } + + g_array_free(hypercall_insns, true); +} + +static void usage(void) +{ + fprintf(stderr, + "Usage: ,[ignore_unsupported=3D]"); +} + +/* + * Called when the plugin is installed + */ +QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id, + const qemu_info_t *info, int ar= gc, + char **argv) +{ + if (argc > 1) { + usage(); + return -1; + } + + for (size_t i =3D 0; i < argc; i++) { + char *opt =3D argv[i]; + g_auto(GStrv) tokens =3D g_strsplit(opt, "=3D", 2); + if (g_strcmp0(tokens[0], "ignore_unsupported") =3D=3D 0) { + if (!qemu_plugin_bool_parse(tokens[0], + tokens[1], &ignore_unsupported)) { + fprintf(stderr, "Failed to parse boolean argument ignore_u= nsupported\n"); + return -1; + } + } else { + fprintf(stderr, "Unknown argument: %s\n", tokens[0]); + usage(); + return -1; + } + } + + + hypercall_spec =3D &hypercall_specs[0]; + + while (hypercall_spec->name !=3D NULL) { + if (!strcmp(hypercall_spec->name, info->target_name)) { + break; + } + hypercall_spec++; + } + + if (hypercall_spec->name =3D=3D NULL || !hypercall_spec->enabled) { + qemu_plugin_outs("Error: no hypercall spec."); + if (ignore_unsupported) { + return 0; + } + return -1; + } + + hypercall_insns =3D g_array_new(true, true, sizeof(GByteArray *)); + + qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans_cb); + qemu_plugin_register_atexit_cb(id, atexit_cb, NULL); + + return 0; +} diff --git a/tests/tcg/plugins/meson.build b/tests/tcg/plugins/meson.build index 163042e601..909bf3005a 100644 --- a/tests/tcg/plugins/meson.build +++ b/tests/tcg/plugins/meson.build @@ -1,6 +1,6 @@ t =3D [] if get_option('plugins') - foreach i : ['bb', 'empty', 'inline', 'insn', 'mem', 'reset', 'syscall',= 'patch'] + foreach i : ['bb', 'empty', 'inline', 'insn', 'mem', 'reset', 'syscall',= 'hypercalls', 'patch'] if host_os =3D=3D 'windows' t +=3D shared_module(i, files(i + '.c') + '../../../contrib/plugins/= win32_linker.c', include_directories: '../../../include/qemu', diff --git a/tests/tcg/x86_64/Makefile.softmmu-target b/tests/tcg/x86_64/Ma= kefile.softmmu-target index 8d3a067c33..8cb2a19461 100644 --- a/tests/tcg/x86_64/Makefile.softmmu-target +++ b/tests/tcg/x86_64/Makefile.softmmu-target @@ -46,14 +46,18 @@ EXTRA_RUNS+=3D$(MULTIARCH_RUNS) =20 memory: CFLAGS+=3D-DCHECK_UNALIGNED=3D1 patch-target: CFLAGS+=3D-O0 +hypercalls-target: CFLAGS+=3D-O0 =20 # Running QEMU_OPTS+=3D-device isa-debugcon,chardev=3Doutput -device isa-debug-exit,= iobase=3D0xf4,iosize=3D0x4 -kernel =20 # Add patch-target to ADDITIONAL_PLUGINS_TESTS ADDITIONAL_PLUGINS_TESTS +=3D patch-target +ADDITIONAL_PLUGINS_TESTS +=3D hypercalls-target =20 run-plugin-patch-target-with-libpatch.so: \ PLUGIN_ARGS=3D$(COMMA)target=3Dffc0$(COMMA)patch=3D9090$(COMMA)use_hwaddr= =3Dtrue$(COMMA)debug_insns=3Dfalse run-plugin-patch-target-with-libpatch.so: \ - CHECK_PLUGIN_OUTPUT_COMMAND=3D$(X86_64_SYSTEM_SRC)/validate-patch.py $@.o= ut \ No newline at end of file + CHECK_PLUGIN_OUTPUT_COMMAND=3D$(X86_64_SYSTEM_SRC)/validate-patch.py $@.o= ut +run-plugin-hypercalls-target-with-libhypercalls.so: \ + CHECK_PLUGIN_OUTPUT_COMMAND=3D$(X86_64_SYSTEM_SRC)/validate-hypercalls.py= $@.out diff --git a/tests/tcg/x86_64/system/hypercalls-target.c b/tests/tcg/x86_64= /system/hypercalls-target.c new file mode 100644 index 0000000000..643d489e9c --- /dev/null +++ b/tests/tcg/x86_64/system/hypercalls-target.c @@ -0,0 +1,45 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright (C) 2025, Rowan Hart + * + * License: GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + * This test target invokes a hypercall to write the value 0x1337 to a + * variable. + * + */ +#include +#include +#include + +#define _hypercall(num, arg0, arg1, arg2, arg3) \ + unsigned int a __attribute__((unused)) =3D 0; \ + unsigned int b __attribute__((unused)) =3D 0; \ + unsigned int c __attribute__((unused)) =3D 0; \ + unsigned int d __attribute__((unused)) =3D 0; \ + __asm__ __volatile__("cpuid\n\t" \ + : "=3Da"(a), "=3Db"(b), "=3Dc"(c), "=3Dd"(d) = \ + : "a"(num), "D"(arg0), "S"(arg1), \ + "d"(arg2), "c"(arg3)); + +#define hypercall(num, arg0, arg1, arg2, arg3) \ + { \ + unsigned int __num =3D 0x4711 | (num << 16); \ + _hypercall(__num, arg0, arg1, arg2, arg3); \ + } + +int main(void) +{ + uint16_t value =3D 0; + + for (size_t i =3D 0; i < 1000000; i++) { + hypercall(1, &value, sizeof(value), 0, 0); + if (value =3D=3D 0x1337) { + ml_printf("Victory!\n"); + return 0; + } + } + return 0; +} diff --git a/tests/tcg/x86_64/system/validate-hypercalls.py b/tests/tcg/x86= _64/system/validate-hypercalls.py new file mode 100755 index 0000000000..6e7c980706 --- /dev/null +++ b/tests/tcg/x86_64/system/validate-hypercalls.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +# +# validate-patch.py: check the patch applies +# +# This program takes two inputs: +# - the plugin output +# - the binary output +# +# Copyright (C) 2024 +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import sys +from argparse import ArgumentParser + +def main() -> None: + """ + Process the arguments, injest the program and plugin out and + verify they match up and report if they do not. + """ + parser =3D ArgumentParser(description=3D"Validate patch") + parser.add_argument('test_output', + help=3D"The output from the test itself") + parser.add_argument('plugin_output', + help=3D"The output from plugin") + args =3D parser.parse_args() + + with open(args.test_output, 'r') as f: + test_data =3D f.read() + with open(args.plugin_output, 'r') as f: + plugin_data =3D f.read() + + if "Victory" in test_data: + sys.exit(0) + else: + sys.exit(1) + +if __name__ =3D=3D "__main__": + main() + --=20 2.49.0 From nobody Fri Dec 19 09:50:26 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1747820691; cv=none; d=zohomail.com; s=zohoarc; b=OkKz3EKvUwCNeiN0aCMFfbqOHEe0KdTZK0rjT1oxxXPtLAxNdab1EL5xSoiZ4n6MBTqjLsGwQAyrj2CSKNkKltqPqPV9es+Lk+crcu4B/fDqCYtzxO3uSldQC0CY/1sA7q/rHdf3V89ohAZN7XKlfpZOKKpopBFCVuEtERi2mj8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1747820691; 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=iIakYp1lP7xSBXnDVrm8gIcQG/rmDlJvM13jkAvGUko=; b=FxWTK6L7wuNeck/fPPYhySsSR7nV+b/KRw1e0ePLKk2msTomqpTjPBbgwZlQKF2uwtx05D0ibRVBky7/UMf+toEryPkKsLdAcmYBMCSygFyvJ2DyHHyaJIvPq9VYdYbDJh2sFllbmO6NiHmdAqV8/hSLdWkSBHMeLLrs4dNDttI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1747820691118507.3512703943861; Wed, 21 May 2025 02:44:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uHfzS-0002mO-32; Wed, 21 May 2025 05:43:58 -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 1uHfzI-0002jh-LQ for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:48 -0400 Received: from mail-pf1-x42e.google.com ([2607:f8b0:4864:20::42e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uHfzD-0001cC-F4 for qemu-devel@nongnu.org; Wed, 21 May 2025 05:43:48 -0400 Received: by mail-pf1-x42e.google.com with SMTP id d2e1a72fcca58-742c27df0daso3284584b3a.1 for ; Wed, 21 May 2025 02:43:42 -0700 (PDT) Received: from shemhazi.lan ([50.46.174.34]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-742a9829b87sm9255668b3a.114.2025.05.21.02.43.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 02:43:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747820621; x=1748425421; 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=iIakYp1lP7xSBXnDVrm8gIcQG/rmDlJvM13jkAvGUko=; b=m+s+z6sOQmlF7paWbACdxh8n7RXobu8uWtkvyhPKDzafoC5ZE8NXfIR8e4Lol9xlBK xdU7w+miKc9a8EmR37c3pkkd4nCUXulIwI1LDFfI2zE4aokHCxuqCTN0t0z0ifY/+aRC prVKJYhn5nkISknb1B9CPD27C3a64zFaJownO9cNYfFCDsXFbBq2Cs6g5QBc/TI8HRjc 955+snUax2jshLdfaflcBsonUkR7r+tHR9DTwpla60E0misOww/nQmTkKX9k+LOl+V99 EELBuMkWlgI3jcAWqxtramIBF7h0+sbyn+eMJqjs4m4Ndi0AHHm1y6WQc+3jvefbSSKh QFSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747820621; x=1748425421; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iIakYp1lP7xSBXnDVrm8gIcQG/rmDlJvM13jkAvGUko=; b=RkQhlK/LPdmyWSgA8a69E+hYZKyw8JSGZOJ329RGfpnSZPsY71dCM+ITGnJbsk+b1T TwJlsTmgq5whTQZVjtGaATxylR1t8sevt0DFfsWuYWTD8i9Q30+Ala5hGYev0eCKQTPX EjNQKdvPqvS3wUN7S63DNgE61Z4DBTDzJKTrGI1+/izUpC91XFiVAhA5JmH2ckEMhd+C vYDli3KrBERRFLJP4og6mLPe0M9Zmsc/5t8iSLfsV+cx80i2jfBFyLqCKZbek6s/Jghk 6uA9TFH08mp3DPdmyXFlrFWoV/vIJDWBUPStRr+InCvdu2dVZbYVEZAVyYQp4jnggpRl yg6g== X-Gm-Message-State: AOJu0YxKGTdHCy8tvwTndBFLGaVkP1wlP6q+okCKh5bRM3PNlZCOcIpM XELR5OSQqWuAf1f/FHjc2Jkse6qe0FCFEhvBoIsYJK1LtTyUxebKP40zgfk3EGr6dtc= X-Gm-Gg: ASbGncto9P+FxRnsoZb2PghSwnEOukg6fYizFJz7rpLgKNgGQpDTLk4m5XKf3hXHWGw Bl3pEFEKnSHDxLeqZC4pzbQfzdmiIeJPzyxPb2gLiwoo+N5JpBFrX15nL7jH32+VvbF3K13k+LF A3YuAbWTY1oxrsXOotxjWYbFmXdQ1BO2Ni1Uh6knHORJQEtSG1Rg+N2VvHwFd0dtz6opxO/200u XG36v/t7xpXTLKMuCDj/z/kchN2LBAWh7qil6P8pV8oE2wEUTUD3L5tij0wz1rMCadMhxKY/Drm ac9nr0OFK+ieRNOOzEiAwcsUq52NhdxIq/hjXn4hVZm4ku7abb8= X-Google-Smtp-Source: AGHT+IGO5bKuc2rTh6ikR04ee/WVR8CKKVt8643OrAS4GJ897r5oO38RUQJsXxNrSRBGyhcmgj9jzQ== X-Received: by 2002:a05:6a00:982:b0:736:a7ec:a366 with SMTP id d2e1a72fcca58-742a97a2bcamr25456071b3a.9.1747820621281; Wed, 21 May 2025 02:43:41 -0700 (PDT) From: Rowan Hart To: qemu-devel@nongnu.org Cc: Pierrick Bouvier , Alexandre Iooss , Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Eduardo Habkost , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Paolo Bonzini , novafacing Subject: [PATCH v3 8/8] Update plugin version and add notes Date: Wed, 21 May 2025 02:43:32 -0700 Message-ID: <20250521094333.4075796-9-rowanbhart@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250521094333.4075796-1-rowanbhart@gmail.com> References: <20250521094333.4075796-1-rowanbhart@gmail.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::42e; envelope-from=rowanbhart@gmail.com; helo=mail-pf1-x42e.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, FREEMAIL_FROM=0.001, 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 @gmail.com) X-ZM-MESSAGEID: 1747820692135116600 Content-Type: text/plain; charset="utf-8" From: novafacing Signed-off-by: Rowan Hart --- include/qemu/qemu-plugin.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h index d4f229abd9..4cf2955560 100644 --- a/include/qemu/qemu-plugin.h +++ b/include/qemu/qemu-plugin.h @@ -65,11 +65,21 @@ typedef uint64_t qemu_plugin_id_t; * * version 4: * - added qemu_plugin_read_memory_vaddr + * + * version 5: + * - added qemu_plugin_write_memory_vaddr + * - added qemu_plugin_read_memory_hwaddr + * - added qemu_plugin_write_memory_hwaddr + * - added qemu_plugin_write_register + * - added qemu_plugin_get_current_vcpu_address_spaces + * - added qemu_plugin_n_address_spaces + * - added qemu_plugin_address_space_name + * - added qemu_plugin_translate_vaddr */ =20 extern QEMU_PLUGIN_EXPORT int qemu_plugin_version; =20 -#define QEMU_PLUGIN_VERSION 4 +#define QEMU_PLUGIN_VERSION 5 =20 /** * struct qemu_info_t - system information for plugins --=20 2.49.0