From nobody Sun Oct 26 01:22:41 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1601129454; cv=none; d=zohomail.com; s=zohoarc; b=UN1gifw+HHPvsINrmUO2fgWbQ+AEHsB8BGKRO3EL2NQstaHUO52xDb+SrVJXdn2HC9mvVNbNkf6DUPz5IpexN2IN493Wx0FpyAZfwHqP+T38nxgz0gJt4sNfSw/orbAQCmIaDQkhT36ZvEawVSJMhDkMyEJf9tYULrxr8rHfpW0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601129454; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=g28WcNhsCD1pOggCNiGSa3fCFHjJ9SBe6D8ikmZXRPs=; b=EKvJZsCI/DvAo7+mryiTLBr+uIL7clm7H5cQtOcNxN+8aNngQysWB+bslgkYoToQrr+76ihIPS+lw9kJNoDXiqSyvoqi4siG6x+vo5rmVcCv8T6k7xHCYvCCBkn6KcpFONhswbN+o3E6iSFlNXV6UVop0SR5RRRjTrRjjxUCotk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1601129454692401.665146418424; Sat, 26 Sep 2020 07:10:54 -0700 (PDT) Received: from localhost ([::1]:41848 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kMAub-0007g2-5V for importer@patchew.org; Sat, 26 Sep 2020 10:10:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54196) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kMAoX-0000QP-Cp for qemu-devel@nongnu.org; Sat, 26 Sep 2020 10:04:37 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:44216) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kMAoV-0005Lt-BZ for qemu-devel@nongnu.org; Sat, 26 Sep 2020 10:04:37 -0400 Received: by mail-pl1-x641.google.com with SMTP id j7so870391plk.11 for ; Sat, 26 Sep 2020 07:04:34 -0700 (PDT) Received: from localhost.localdomain ([222.95.248.6]) by smtp.googlemail.com with ESMTPSA id k3sm6091109pfp.41.2020.09.26.07.04.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 26 Sep 2020 07:04:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=g28WcNhsCD1pOggCNiGSa3fCFHjJ9SBe6D8ikmZXRPs=; b=szTDjnddLVwfHUrFtJYMa+J4P48eTcgLe25aJIO49Zt1YtTy4WOEIBrdX3UfWe954G vp1TwkDYuZvwzmFZcMSAEuUT8yH9tXYWUd7tAYgw4jqzvZVarQwwBXjC0Xzt/v+vsAaj nMuU6HDv1NgocG7YzUTz4Iy+fsBNy6I98/PPy7UCLx4uByEeH6ErUn5fRbVGNhjWJGIy IFSEjdBUFjPUrA9zgODCOTVbvSN6dAghWon+EpVjtHmFdef07uwruSk3cnPezlss3+VV 0YsZ2X1m+rGXb50FQa+1Zm9mEeyP9p3rhBRbVQTocl0mcmplOUBpmr9D7BJiasMJ8+nm dStw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=g28WcNhsCD1pOggCNiGSa3fCFHjJ9SBe6D8ikmZXRPs=; b=FrBtzOMshCnJjReV59bGMiOlOSODYDjeYckzz379UdpXtlfTq8upCB/jNHUorG3n6E og+7Y9JrRiQPq5OGHTzh+HRVMAkEz/GperIutX3RTnHbCbz39lelCJp2+C+bIvzzfvFw WZHCI3IQXMTjS4/3r6RSC0q1bNNfYqyqO+GG38YelpgcJTmb3wuvWA9lAh2Hby28V7I4 fCwL8S9LfVXyhJQ06IEG7hHLFrcgH6NJPQVeXAc4boAZzyECmQ5RdVxRaV9XDxNPA1AS baFTqBdkNqWNstMcslrdIdTI+WQWBFPK8rR/Ks1wHa1HYwQEIuGkaWXjpw3B5DaF2T0z 7z2A== X-Gm-Message-State: AOAM5335ZEsw1RqoOQ+oxeCSrH1ebYVfNntQ03lac+1jZ8AzdKhps9/0 Niwugftv9JU2mISgUzUHTB3RCai2Cd/wqkqU X-Google-Smtp-Source: ABdhPJwvcoHnhfM2EhATiYOE8c8HJx5xZiYZIACDdLuP93j1j2koJC/dVVugSKifwVL/klruRRBxnA== X-Received: by 2002:a17:90b:350b:: with SMTP id ls11mr2141667pjb.201.1601129073517; Sat, 26 Sep 2020 07:04:33 -0700 (PDT) From: Yonggang Luo To: qemu-devel@nongnu.org Subject: [PATCH 1/4] plugins: Fixes a issue when dlsym failed, the handle not closed. Date: Sat, 26 Sep 2020 22:04:12 +0800 Message-Id: <20200926140415.1286-2-luoyonggang@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20200926140415.1286-1-luoyonggang@gmail.com> References: <20200926140415.1286-1-luoyonggang@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::641; envelope-from=luoyonggang@gmail.com; helo=mail-pl1-x641.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. 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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Alex=20Benn=C3=A9e?= , Paolo Bonzini , Yonggang Luo , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Signed-off-by: Yonggang Luo Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- plugins/loader.c | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/loader.c b/plugins/loader.c index 685d334e1a..8ac5dbc20f 100644 --- a/plugins/loader.c +++ b/plugins/loader.c @@ -235,6 +235,7 @@ static int plugin_load(struct qemu_plugin_desc *desc, c= onst qemu_info_t *info) return rc; =20 err_symbol: + g_module_close(ctx->handle); err_dlopen: qemu_vfree(ctx); return 1; --=20 2.28.0.windows.1 From nobody Sun Oct 26 01:22:41 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1601129530; cv=none; d=zohomail.com; s=zohoarc; b=mPjzDRCVu++MqrglPfHXKbU7olcei8g4Ie+Sg65HlKs8iPlLGIeE6tK19ZS4aPCJLJZB29Dg84112504Cgn7dpar3ERFNhxf9gSOMFLKYZHu0Dgvb12Mf+F+5nhMSRbbIbrKrbPhKFCM7T3BLRTeawoQGEvL2c8O37h0H86r3oM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601129530; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=EOZ1D2QEBZkHNlw7AF2wWJzGV7XJ3mBIlC+/pAIy1UI=; b=larpV1XYsKHGl1s9Iuuaicgntbohd3x9M6S8dcBwC5PfmKTJjiZC/6tQqTDti0WQbGLdolfczzgWgLQdZyFpOYmigacSSR6dFY1QLvtLyJ3ygxkI2D1mVYTPNN7qs8k+E2DKAJhTzQzvBKTTIwpABk/Sd1tRVMKDyhomPp7I+ME= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1601129530835422.5529339272765; Sat, 26 Sep 2020 07:12:10 -0700 (PDT) Received: from localhost ([::1]:45002 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kMAvp-0000fk-HF for importer@patchew.org; Sat, 26 Sep 2020 10:12:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54234) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kMAoZ-0000VN-SC for qemu-devel@nongnu.org; Sat, 26 Sep 2020 10:04:39 -0400 Received: from mail-pl1-x635.google.com ([2607:f8b0:4864:20::635]:40675) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kMAoY-0005MG-1c for qemu-devel@nongnu.org; Sat, 26 Sep 2020 10:04:39 -0400 Received: by mail-pl1-x635.google.com with SMTP id bd2so878963plb.7 for ; Sat, 26 Sep 2020 07:04:37 -0700 (PDT) Received: from localhost.localdomain ([222.95.248.6]) by smtp.googlemail.com with ESMTPSA id k3sm6091109pfp.41.2020.09.26.07.04.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 26 Sep 2020 07:04:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=EOZ1D2QEBZkHNlw7AF2wWJzGV7XJ3mBIlC+/pAIy1UI=; b=rrjaSurQ7c1hZSrwZX5ift//w0vHEt6TzhxHRC9Tfg/XpcXok+qgltwT9d9+ziepXS qj5YdhnJi0yIkKzQChJ6Yu0T1Gff7xBNcXCkk5Pm1y2rgtLaQ+IdgODHixu5M75fBAyv RjISEwx598EckQnXPAFGotR8ISEx10Rev+lG9BYLn63MGtUs55enMqtBnsnsD0A4nzWI Ye2qGLX1tnsA8fOjy8sSg08yizEgn+YGrsYN97iL3goAEtTQIegOJEQSfqmp3MrBBf7N o6BIolBLuZh3OXwbkrTeEvI/YBCINAuyrCBRbbpMH54+k9CWYrctmR2HRdcbaqoP/8qO 5ipg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EOZ1D2QEBZkHNlw7AF2wWJzGV7XJ3mBIlC+/pAIy1UI=; b=e0ssnNxwUz758MwyTHP8KxF2rKjx9BrihDastPZ+0K5snEPjdwYHs4LFBch5KrX25N hbScGVPNuaZ0PNGFMGxzrFmOSHXamXzkRQQJyd/nLI9UXHsMfpMbewGpN1PiSZk7w/Xf AH945SB5YbLrFaDlgl4rawcEojPC79tfQ6fJuAgKW4qfd9XTqS5Por1mvynarscqzXAe GsXQ7VLXGY2W67YV97pqmpNb/0KKuNWHqhoqb0XYGyf2F53JSSj/a62TV9ZwCT9/wCWH U6Faz8Pn3Gq4e+7G/XPeytjzZRrYfRIH6hH3yrcfNCKzG7nTevEFzk2MRXLAcT/N01eg WTNQ== X-Gm-Message-State: AOAM530YDp011mYD5TFDcxaEmcSgsOSCaAdPQotAC/wDYjMixjYo4T1B MeQk9BLhVQtkH9U6bhDvEN3ZE+xfrFBvWSN+ X-Google-Smtp-Source: ABdhPJwtZIj/WwLnJO8m/y3qHvXALXQ0m0EFB8lQPLQZOtNlxC2MBHfDoS/i0sGIr02TrZFnD/X2jg== X-Received: by 2002:a17:902:fe88:b029:d2:2a16:254 with SMTP id x8-20020a170902fe88b02900d22a160254mr4152247plm.23.1601129076004; Sat, 26 Sep 2020 07:04:36 -0700 (PDT) From: Yonggang Luo To: qemu-devel@nongnu.org Subject: [PATCH 2/4] plugin: Fixes compiling errors on msys2/mingw Date: Sat, 26 Sep 2020 22:04:13 +0800 Message-Id: <20200926140415.1286-3-luoyonggang@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20200926140415.1286-1-luoyonggang@gmail.com> References: <20200926140415.1286-1-luoyonggang@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::635; envelope-from=luoyonggang@gmail.com; helo=mail-pl1-x635.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. 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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Alex=20Benn=C3=A9e?= , Paolo Bonzini , Yonggang Luo , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Signed-off-by: Yonggang Luo Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- contrib/plugins/hotblocks.c | 2 +- tests/plugin/bb.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/plugins/hotblocks.c b/contrib/plugins/hotblocks.c index 3942a2ca54..37435a3fc7 100644 --- a/contrib/plugins/hotblocks.c +++ b/contrib/plugins/hotblocks.c @@ -102,7 +102,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct q= emu_plugin_tb *tb) { ExecCount *cnt; uint64_t pc =3D qemu_plugin_tb_vaddr(tb); - unsigned long insns =3D qemu_plugin_tb_n_insns(tb); + size_t insns =3D qemu_plugin_tb_n_insns(tb); uint64_t hash =3D pc ^ insns; =20 g_mutex_lock(&lock); diff --git a/tests/plugin/bb.c b/tests/plugin/bb.c index e4cc7fdd6e..ef784be78f 100644 --- a/tests/plugin/bb.c +++ b/tests/plugin/bb.c @@ -72,7 +72,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *ud= ata) CPUCount *count =3D max_cpus ? g_ptr_array_index(counts, cpu_index) : &inline_count; =20 - unsigned long n_insns =3D (unsigned long)udata; + uint64_t n_insns =3D (uint64_t)udata; g_mutex_lock(&count->lock); count->insn_count +=3D n_insns; count->bb_count++; @@ -81,7 +81,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *ud= ata) =20 static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) { - unsigned long n_insns =3D qemu_plugin_tb_n_insns(tb); + size_t n_insns =3D qemu_plugin_tb_n_insns(tb); =20 if (do_inline) { qemu_plugin_register_vcpu_tb_exec_inline(tb, QEMU_PLUGIN_INLINE_AD= D_U64, --=20 2.28.0.windows.1 From nobody Sun Oct 26 01:22:41 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1601129595; cv=none; d=zohomail.com; s=zohoarc; b=kQ7B6JZ0WTsa34arx5Kiv1JFZ0Z0ZKMPCHiR0+Y6rERAtoel6wDNJu9krwSzP9LSzZ7wRmd5ee8xbg6/ioNpV578vy6Dv+21Nl2iQjL7iYgjGu3rZqRiVN6ChsRxnhQYKD/TSXab4/JKnmFqIFt4yUkeJvpFWEnYZLZCyyuT800= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601129595; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=BWpwCwB/QGi8FwsUUfmydg2qWbBTs6uwVfATSkHaPOs=; b=OtfpA6QN8v5/YkJJj2dd8JEZPYzHRCkcbTdwBtxvByC/dvb7z1bFshhRIiNJxOeIKvk6mcoS0EbO4mH3WfE7a9+Uy5Md8teSQahTrIC2LA8JtESoezectN0XcxwIQhL20w/XuaMX2ixJKEz/kW+zbGEEed8zBgmIPO2ukmXAQc4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 160112959537264.2777209734935; Sat, 26 Sep 2020 07:13:15 -0700 (PDT) Received: from localhost ([::1]:47596 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kMAwr-0001nf-SS for importer@patchew.org; Sat, 26 Sep 2020 10:13:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54304) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kMAoh-0000bb-4i for qemu-devel@nongnu.org; Sat, 26 Sep 2020 10:04:47 -0400 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]:36446) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kMAob-0005NB-8Z for qemu-devel@nongnu.org; Sat, 26 Sep 2020 10:04:46 -0400 Received: by mail-pl1-x630.google.com with SMTP id s19so892178plp.3 for ; Sat, 26 Sep 2020 07:04:40 -0700 (PDT) Received: from localhost.localdomain ([222.95.248.6]) by smtp.googlemail.com with ESMTPSA id k3sm6091109pfp.41.2020.09.26.07.04.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 26 Sep 2020 07:04:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BWpwCwB/QGi8FwsUUfmydg2qWbBTs6uwVfATSkHaPOs=; b=fTlmmZOV2rvBou7efz8i1UfgQtFlJzBOn2/qyyzdZzcsik4aHzTSXUC9ZqSsEWEPbn 9MpanfLFixcid1EnB5kBQW/4cgnW6oL32KTAM8AXbWzjCMaTLyZdLXFJgWjD7x1TA6I2 h4nrRrxi2G5y8CCYRq3Py0oB1tmffIGxgLpSACgZeesOxwR4BGvFq2SsbJjDc3K+CBc8 vtzrdBZdOZKIMm92U2nqIAelYoE+iKtRVwPHa2leuD28HbSFa4t/3EYXy55GIBUlCtYS azIxTCNjWc3pkENZY9HdW5Vhvd+GDttsqKD3q1myRvw3NPQKdKY+F0D7qLvP3+UMBiLb /ZHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BWpwCwB/QGi8FwsUUfmydg2qWbBTs6uwVfATSkHaPOs=; b=XMVk4kBQ/hSX8CYgogLarnLc0xQ6rAq6tiWwFiirS8369EwmQXKlMCrZE2RpWhaG+D +hkBSqIQEQlv22r2uVKIKjM2v7B7FH+un0yEPvs3pOZOUhGQNfyT4GBP3GEEGAb7Wlv8 ktt0nQjzU3C73IiUXGRFxOvm76ii5WXpqemYMFkSLSxD23dKI4PtpbNyGUdeLVeCbzTB sWf+KJjCTY46BqLw8grL9R4nvSUw7aDP8EokKaTS6mQ2gNih0UAqNI8a9brh5Cxo7G/5 tpH1lJt593qjMrWH8sLuzwMXBjQDeUXxrIWaHxvnndU43HwubmWDWCcMAEiuLVaPjBTX ASmA== X-Gm-Message-State: AOAM531fSJh6tq11Sq+GNc77Rg5rqslCg/SK1V8RQ5fO+8wpzs+JKIlz vWtuSuvdFcISZh86QMlFmB0t3Qj7haQ+Op15 X-Google-Smtp-Source: ABdhPJxxGfotzT0VmaNA3f19FBgOQiz9bBOOYLrz+Xq1/Ol93v3cwVu43XUsBHd2+SNcHIutKqY7iQ== X-Received: by 2002:a17:902:778e:b029:d2:8046:efe2 with SMTP id o14-20020a170902778eb02900d28046efe2mr2152098pll.44.1601129078713; Sat, 26 Sep 2020 07:04:38 -0700 (PDT) From: Yonggang Luo To: qemu-devel@nongnu.org Subject: [PATCH 3/4] Getting qemu-plugin works under win32. Date: Sat, 26 Sep 2020 22:04:14 +0800 Message-Id: <20200926140415.1286-4-luoyonggang@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20200926140415.1286-1-luoyonggang@gmail.com> References: <20200926140415.1286-1-luoyonggang@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::630; envelope-from=luoyonggang@gmail.com; helo=mail-pl1-x630.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. 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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Alex=20Benn=C3=A9e?= , Paolo Bonzini , Yonggang Luo , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Signed-off-by: Yonggang Luo --- Makefile | 1 - configure | 71 -------------- contrib/plugins/hotblocks.c | 2 + contrib/plugins/hotpages.c | 2 + contrib/plugins/howvec.c | 2 + contrib/plugins/lockstep.c | 2 + include/qemu/qemu-plugin.h | 184 ++++++++++++++++++++++++++--------- meson.build | 6 +- plugins/api.c | 65 +++++++------ plugins/core.c | 7 +- plugins/loader.c | 20 ++++ plugins/meson.build | 10 +- plugins/qemu-plugins.symbols | 40 -------- tests/plugin/bb.c | 2 + tests/plugin/empty.c | 2 + tests/plugin/insn.c | 2 + tests/plugin/mem.c | 2 + 17 files changed, 218 insertions(+), 202 deletions(-) delete mode 100644 plugins/qemu-plugins.symbols diff --git a/Makefile b/Makefile index 897246d77c..3dd74205b5 100644 --- a/Makefile +++ b/Makefile @@ -105,7 +105,6 @@ config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-b= ios $(SRC_PATH)/VERSION =20 # Force configure to re-run if the API symbols are updated ifeq ($(CONFIG_PLUGIN),y) -config-host.mak: $(SRC_PATH)/plugins/qemu-plugins.symbols =20 .PHONY: plugins plugins: diff --git a/configure b/configure index 49169ce289..5b1bc7850b 100755 --- a/configure +++ b/configure @@ -5434,61 +5434,6 @@ if compile_prog "" "" ; then atomic64=3Dyes fi =20 -######################################### -# See if --dynamic-list is supported by the linker -ld_dynamic_list=3D"no" -if test "$static" =3D "no" ; then - cat > $TMPTXT < $TMPC < -void foo(void); - -void foo(void) -{ - printf("foo\n"); -} - -int main(void) -{ - foo(); - return 0; -} -EOF - - if compile_prog "" "-Wl,--dynamic-list=3D$TMPTXT" ; then - ld_dynamic_list=3D"yes" - fi -fi - -######################################### -# See if -exported_symbols_list is supported by the linker - -ld_exported_symbols_list=3D"no" -if test "$static" =3D "no" ; then - cat > $TMPTXT <> $config_host_mak - # Copy the export object list to the build dir - if test "$ld_dynamic_list" =3D "yes" ; then - echo "CONFIG_HAS_LD_DYNAMIC_LIST=3Dyes" >> $config_host_mak - ld_symbols=3Dqemu-plugins-ld.symbols - cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols - elif test "$ld_exported_symbols_list" =3D "yes" ; then - echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=3Dyes" >> $config_host_mak - ld64_symbols=3Dqemu-plugins-ld64.symbols - echo "# Automatically generated by configure - do not modify" > $ld64_sym= bols - grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' |= \ - sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols - else - error_exit \ - "If \$plugins=3Dyes, either \$ld_dynamic_list or " \ - "\$ld_exported_symbols_list should have been set to 'yes'." - fi fi =20 if test -n "$gdb_bin" ; then diff --git a/contrib/plugins/hotblocks.c b/contrib/plugins/hotblocks.c index 37435a3fc7..286ebdd497 100644 --- a/contrib/plugins/hotblocks.c +++ b/contrib/plugins/hotblocks.c @@ -13,6 +13,7 @@ #include #include =20 +#define QEMU_PLUGIN_IMPLEMENTATION #include =20 QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; @@ -136,6 +137,7 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu= _info_t *info, if (argc && strcmp(argv[0], "inline") =3D=3D 0) { do_inline =3D true; } + qemu_plugin_init(info); =20 plugin_init(); =20 diff --git a/contrib/plugins/hotpages.c b/contrib/plugins/hotpages.c index ecd6c18732..941554439b 100644 --- a/contrib/plugins/hotpages.c +++ b/contrib/plugins/hotpages.c @@ -16,6 +16,7 @@ #include #include =20 +#define QEMU_PLUGIN_IMPLEMENTATION #include =20 QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; @@ -166,6 +167,7 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu= _info_t *info, int argc, char **argv) { int i; + qemu_plugin_init(info); =20 for (i =3D 0; i < argc; i++) { char *opt =3D argv[i]; diff --git a/contrib/plugins/howvec.c b/contrib/plugins/howvec.c index 3b9a6939f2..d832be9bef 100644 --- a/contrib/plugins/howvec.c +++ b/contrib/plugins/howvec.c @@ -18,6 +18,7 @@ #include #include =20 +#define QEMU_PLUGIN_IMPLEMENTATION #include =20 QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; @@ -320,6 +321,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_= id_t id, int argc, char **argv) { int i; + qemu_plugin_init(info); =20 /* Select a class table appropriate to the guest architecture */ for (i =3D 0; i < ARRAY_SIZE(class_tables); i++) { diff --git a/contrib/plugins/lockstep.c b/contrib/plugins/lockstep.c index a696673dff..5090aa8b10 100644 --- a/contrib/plugins/lockstep.c +++ b/contrib/plugins/lockstep.c @@ -31,6 +31,7 @@ #include #include =20 +#define QEMU_PLUGIN_IMPLEMENTATION #include =20 QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; @@ -316,6 +317,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_= id_t id, int argc, char **argv) { int i; + qemu_plugin_init(info); =20 if (!argc || !argv[0]) { qemu_plugin_outs("Need a socket path to talk to other instance."); diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h index bab8b0d4b3..83477b42e5 100644 --- a/include/qemu/qemu-plugin.h +++ b/include/qemu/qemu-plugin.h @@ -21,11 +21,7 @@ * https://gcc.gnu.org/wiki/Visibility */ #if defined _WIN32 || defined __CYGWIN__ - #ifdef BUILDING_DLL - #define QEMU_PLUGIN_EXPORT __declspec(dllexport) - #else - #define QEMU_PLUGIN_EXPORT __declspec(dllimport) - #endif + #define QEMU_PLUGIN_EXPORT __declspec(dllexport) #define QEMU_PLUGIN_LOCAL #else #if __GNUC__ >=3D 4 @@ -54,6 +50,8 @@ extern QEMU_PLUGIN_EXPORT int qemu_plugin_version; =20 #define QEMU_PLUGIN_VERSION 0 =20 +typedef void *(*qemu_plugin_global_dlsym_t)(void* context, const char *nam= e); + typedef struct { /* string describing architecture */ const char *target_name; @@ -73,6 +71,8 @@ typedef struct { int max_vcpus; } system; }; + void *context; + qemu_plugin_global_dlsym_t dlsym; } qemu_info_t; =20 /** @@ -96,6 +96,8 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id= _t id, const qemu_info_t *info, int argc, char **argv); =20 +int qemu_plugin_init(const qemu_info_t *info); + /* * Prototypes for the various callback styles we will be registering * in the following functions. @@ -121,7 +123,7 @@ typedef void (*qemu_plugin_vcpu_udata_cb_t)(unsigned in= t vcpu_index, * * Note: Calling this function from qemu_plugin_install() is a bug. */ -void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb= ); +typedef void (*qemu_plugin_uninstall_t)(qemu_plugin_id_t id, qemu_plugin_s= imple_cb_t cb); =20 /** * qemu_plugin_reset() - Reset a plugin @@ -134,7 +136,7 @@ void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_pl= ugin_simple_cb_t cb); * Plugins are reset asynchronously, and therefore the given plugin receiv= es * callbacks until @cb is called. */ -void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb); +typedef void (*qemu_plugin_reset_t)(qemu_plugin_id_t id, qemu_plugin_simpl= e_cb_t cb); =20 /** * qemu_plugin_register_vcpu_init_cb() - register a vCPU initialization ca= llback @@ -145,7 +147,7 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin= _simple_cb_t cb); * * See also: qemu_plugin_register_vcpu_exit_cb() */ -void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id, +typedef void (*qemu_plugin_register_vcpu_init_cb_t)(qemu_plugin_id_t id, qemu_plugin_vcpu_simple_cb_t cb); =20 /** @@ -157,7 +159,7 @@ void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t= id, * * See also: qemu_plugin_register_vcpu_init_cb() */ -void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id, +typedef void (*qemu_plugin_register_vcpu_exit_cb_t)(qemu_plugin_id_t id, qemu_plugin_vcpu_simple_cb_t cb); =20 /** @@ -167,7 +169,7 @@ void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t= id, * * The @cb function is called every time a vCPU idles. */ -void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id, +typedef void (*qemu_plugin_register_vcpu_idle_cb_t)(qemu_plugin_id_t id, qemu_plugin_vcpu_simple_cb_t cb); =20 /** @@ -177,7 +179,7 @@ void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t= id, * * The @cb function is called every time a vCPU resumes execution. */ -void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id, +typedef void (*qemu_plugin_register_vcpu_resume_cb_t)(qemu_plugin_id_t id, qemu_plugin_vcpu_simple_cb_t cb); =20 /* @@ -214,11 +216,11 @@ enum qemu_plugin_mem_rw { typedef void (*qemu_plugin_vcpu_tb_trans_cb_t)(qemu_plugin_id_t id, struct qemu_plugin_tb *tb); =20 -void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_id_t id, +typedef void (*qemu_plugin_register_vcpu_tb_trans_cb_t)(qemu_plugin_id_t i= d, qemu_plugin_vcpu_tb_trans_cb_t = cb); =20 /** - * qemu_plugin_register_vcpu_tb_trans_exec_cb() - register execution callb= ack + * qemu_plugin_register_vcpu_tb_exec_cb() - register execution callback * @tb: the opaque qemu_plugin_tb handle for the translation * @cb: callback function * @flags: does the plugin read or write the CPU's registers? @@ -226,7 +228,7 @@ void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_= id_t id, * * The @cb function is called every time a translated unit executes. */ -void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_plugin_tb *tb, +typedef void (*qemu_plugin_register_vcpu_tb_exec_cb_t)(struct qemu_plugin_= tb *tb, qemu_plugin_vcpu_udata_cb_t cb, enum qemu_plugin_cb_flags flags, void *userdata); @@ -236,7 +238,7 @@ enum qemu_plugin_op { }; =20 /** - * qemu_plugin_register_vcpu_tb_trans_exec_inline() - execution inline op + * qemu_plugin_register_vcpu_tb_exec_inline() - execution inline op * @tb: the opaque qemu_plugin_tb handle for the translation * @op: the type of qemu_plugin_op (e.g. ADD_U64) * @ptr: the target memory location for the op @@ -246,7 +248,7 @@ enum qemu_plugin_op { * Useful if you just want to increment a single counter somewhere in * memory. */ -void qemu_plugin_register_vcpu_tb_exec_inline(struct qemu_plugin_tb *tb, +typedef void (*qemu_plugin_register_vcpu_tb_exec_inline_t)(struct qemu_plu= gin_tb *tb, enum qemu_plugin_op op, void *ptr, uint64_t imm); =20 @@ -259,7 +261,7 @@ void qemu_plugin_register_vcpu_tb_exec_inline(struct qe= mu_plugin_tb *tb, * * The @cb function is called every time an instruction is executed */ -void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu_plugin_insn *insn, +typedef void (*qemu_plugin_register_vcpu_insn_exec_cb_t)(struct qemu_plugi= n_insn *insn, qemu_plugin_vcpu_udata_cb_t cb, enum qemu_plugin_cb_flags flag= s, void *userdata); @@ -275,26 +277,26 @@ void qemu_plugin_register_vcpu_insn_exec_cb(struct qe= mu_plugin_insn *insn, * Insert an inline op to every time an instruction executes. Useful * if you just want to increment a single counter somewhere in memory. */ -void qemu_plugin_register_vcpu_insn_exec_inline(struct qemu_plugin_insn *i= nsn, +typedef void (*qemu_plugin_register_vcpu_insn_exec_inline_t)(struct qemu_p= lugin_insn *insn, enum qemu_plugin_op op, void *ptr, uint64_t imm); =20 /* * Helpers to query information about the instructions in a block */ -size_t qemu_plugin_tb_n_insns(const struct qemu_plugin_tb *tb); +typedef size_t (*qemu_plugin_tb_n_insns_t)(const struct qemu_plugin_tb *tb= ); =20 -uint64_t qemu_plugin_tb_vaddr(const struct qemu_plugin_tb *tb); +typedef uint64_t (*qemu_plugin_tb_vaddr_t)(const struct qemu_plugin_tb *tb= ); =20 -struct qemu_plugin_insn * -qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *tb, size_t idx); +typedef struct qemu_plugin_insn * +(*qemu_plugin_tb_get_insn_t)(const struct qemu_plugin_tb *tb, size_t idx); =20 -const void *qemu_plugin_insn_data(const struct qemu_plugin_insn *insn); +typedef const void *(*qemu_plugin_insn_data_t)(const struct qemu_plugin_in= sn *insn); =20 -size_t qemu_plugin_insn_size(const struct qemu_plugin_insn *insn); +typedef size_t (*qemu_plugin_insn_size_t)(const struct qemu_plugin_insn *i= nsn); =20 -uint64_t qemu_plugin_insn_vaddr(const struct qemu_plugin_insn *insn); -void *qemu_plugin_insn_haddr(const struct qemu_plugin_insn *insn); +typedef uint64_t (*qemu_plugin_insn_vaddr_t)(const struct qemu_plugin_insn= *insn); +typedef void *(*qemu_plugin_insn_haddr_t)(const struct qemu_plugin_insn *i= nsn); =20 /* * Memory Instrumentation @@ -307,10 +309,10 @@ typedef uint32_t qemu_plugin_meminfo_t; struct qemu_plugin_hwaddr; =20 /* meminfo queries */ -unsigned int qemu_plugin_mem_size_shift(qemu_plugin_meminfo_t info); -bool qemu_plugin_mem_is_sign_extended(qemu_plugin_meminfo_t info); -bool qemu_plugin_mem_is_big_endian(qemu_plugin_meminfo_t info); -bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info); +typedef unsigned int (*qemu_plugin_mem_size_shift_t)(qemu_plugin_meminfo_t= info); +typedef bool (*qemu_plugin_mem_is_sign_extended_t)(qemu_plugin_meminfo_t i= nfo); +typedef bool (*qemu_plugin_mem_is_big_endian_t)(qemu_plugin_meminfo_t info= ); +typedef bool (*qemu_plugin_mem_is_store_t)(qemu_plugin_meminfo_t info); =20 /* * qemu_plugin_get_hwaddr(): @@ -324,7 +326,7 @@ bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t inf= o); * information about the handle should be recovered before the * callback returns. */ -struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qemu_plugin_meminfo_t in= fo, +typedef struct qemu_plugin_hwaddr *(*qemu_plugin_get_hwaddr_t)(qemu_plugin= _meminfo_t info, uint64_t vaddr); =20 /* @@ -332,21 +334,21 @@ struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qem= u_plugin_meminfo_t info, * to return information about it. For non-IO accesses the device * offset will be into the appropriate block of RAM. */ -bool qemu_plugin_hwaddr_is_io(const struct qemu_plugin_hwaddr *haddr); -uint64_t qemu_plugin_hwaddr_device_offset(const struct qemu_plugin_hwaddr = *haddr); +typedef bool (*qemu_plugin_hwaddr_is_io_t)(const struct qemu_plugin_hwaddr= *haddr); +typedef uint64_t (*qemu_plugin_hwaddr_device_offset_t)(const struct qemu_p= lugin_hwaddr *haddr); =20 typedef void (*qemu_plugin_vcpu_mem_cb_t)(unsigned int vcpu_index, qemu_plugin_meminfo_t info, uint64_t vaddr, void *userdata); =20 -void qemu_plugin_register_vcpu_mem_cb(struct qemu_plugin_insn *insn, +typedef void (*qemu_plugin_register_vcpu_mem_cb_t)(struct qemu_plugin_insn= *insn, qemu_plugin_vcpu_mem_cb_t cb, enum qemu_plugin_cb_flags flags, enum qemu_plugin_mem_rw rw, void *userdata); =20 -void qemu_plugin_register_vcpu_mem_inline(struct qemu_plugin_insn *insn, +typedef void (*qemu_plugin_register_vcpu_mem_inline_t)(struct qemu_plugin_= insn *insn, enum qemu_plugin_mem_rw rw, enum qemu_plugin_op op, void *pt= r, uint64_t imm); @@ -359,15 +361,15 @@ typedef void uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a8); =20 -void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id, +typedef void (*qemu_plugin_register_vcpu_syscall_cb_t)(qemu_plugin_id_t id, qemu_plugin_vcpu_syscall_cb_t cb= ); =20 typedef void (*qemu_plugin_vcpu_syscall_ret_cb_t)(qemu_plugin_id_t id, unsigned int vcp= u_idx, int64_t num, int64_t ret); =20 -void -qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_id_t id, +typedef void +(*qemu_plugin_register_vcpu_syscall_ret_cb_t)(qemu_plugin_id_t id, qemu_plugin_vcpu_syscall_ret_cb_t= cb); =20 =20 @@ -378,7 +380,7 @@ qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_id= _t id, * Returns an allocated string containing the disassembly */ =20 -char *qemu_plugin_insn_disas(const struct qemu_plugin_insn *insn); +typedef char *(*qemu_plugin_insn_disas_t)(const struct qemu_plugin_insn *i= nsn); =20 /** * qemu_plugin_vcpu_for_each() - iterate over the existing vCPU @@ -389,25 +391,117 @@ char *qemu_plugin_insn_disas(const struct qemu_plugi= n_insn *insn); * * See also: qemu_plugin_register_vcpu_init_cb() */ -void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id, +typedef void (*qemu_plugin_vcpu_for_each_t)(qemu_plugin_id_t id, qemu_plugin_vcpu_simple_cb_t cb); =20 -void qemu_plugin_register_flush_cb(qemu_plugin_id_t id, +typedef void (*qemu_plugin_register_flush_cb_t)(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb); =20 -void qemu_plugin_register_atexit_cb(qemu_plugin_id_t id, +typedef void (*qemu_plugin_register_atexit_cb_t)(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb, void *userd= ata); =20 /* returns -1 in user-mode */ -int qemu_plugin_n_vcpus(void); +typedef int (*qemu_plugin_n_vcpus_t)(void); =20 /* returns -1 in user-mode */ -int qemu_plugin_n_max_vcpus(void); +typedef int (*qemu_plugin_n_max_vcpus_t)(void); =20 /** * qemu_plugin_outs() - output string via QEMU's logging system * @string: a string */ -void qemu_plugin_outs(const char *string); +typedef void (*qemu_plugin_outs_t)(const char *string); + +#if !defined(QEMU_PLUGIN_API_IMPLEMENTATION) +#if defined(QEMU_PLUGIN_IMPLEMENTATION) +#define QEMU_PLUGIN_EXTERN +#else +#define QEMU_PLUGIN_EXTERN extern +#endif + +QEMU_PLUGIN_EXTERN qemu_plugin_uninstall_t qemu_plugin_uninstall; +QEMU_PLUGIN_EXTERN qemu_plugin_reset_t qemu_plugin_reset; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_init_cb_t qemu_plugin_registe= r_vcpu_init_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_exit_cb_t qemu_plugin_registe= r_vcpu_exit_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_idle_cb_t qemu_plugin_registe= r_vcpu_idle_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_resume_cb_t qemu_plugin_regis= ter_vcpu_resume_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_tb_trans_cb_t qemu_plugin_reg= ister_vcpu_tb_trans_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_tb_exec_cb_t qemu_plugin_regi= ster_vcpu_tb_exec_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_tb_exec_inline_t qemu_plugin_= register_vcpu_tb_exec_inline; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_insn_exec_cb_t qemu_plugin_re= gister_vcpu_insn_exec_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_insn_exec_inline_t qemu_plugi= n_register_vcpu_insn_exec_inline; +QEMU_PLUGIN_EXTERN qemu_plugin_tb_n_insns_t qemu_plugin_tb_n_insns; +QEMU_PLUGIN_EXTERN qemu_plugin_tb_vaddr_t qemu_plugin_tb_vaddr; +QEMU_PLUGIN_EXTERN qemu_plugin_tb_get_insn_t qemu_plugin_tb_get_insn; +QEMU_PLUGIN_EXTERN qemu_plugin_insn_data_t qemu_plugin_insn_data; +QEMU_PLUGIN_EXTERN qemu_plugin_insn_size_t qemu_plugin_insn_size; +QEMU_PLUGIN_EXTERN qemu_plugin_insn_vaddr_t qemu_plugin_insn_vaddr; +QEMU_PLUGIN_EXTERN qemu_plugin_insn_haddr_t qemu_plugin_insn_haddr; +QEMU_PLUGIN_EXTERN qemu_plugin_mem_size_shift_t qemu_plugin_mem_size_shift; +QEMU_PLUGIN_EXTERN qemu_plugin_mem_is_sign_extended_t qemu_plugin_mem_is_s= ign_extended; +QEMU_PLUGIN_EXTERN qemu_plugin_mem_is_big_endian_t qemu_plugin_mem_is_big_= endian; +QEMU_PLUGIN_EXTERN qemu_plugin_mem_is_store_t qemu_plugin_mem_is_store; +QEMU_PLUGIN_EXTERN qemu_plugin_get_hwaddr_t qemu_plugin_get_hwaddr; +QEMU_PLUGIN_EXTERN qemu_plugin_hwaddr_is_io_t qemu_plugin_hwaddr_is_io; +QEMU_PLUGIN_EXTERN qemu_plugin_hwaddr_device_offset_t qemu_plugin_hwaddr_d= evice_offset; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_mem_cb_t qemu_plugin_register= _vcpu_mem_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_mem_inline_t qemu_plugin_regi= ster_vcpu_mem_inline; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_syscall_cb_t qemu_plugin_regi= ster_vcpu_syscall_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_vcpu_syscall_ret_cb_t qemu_plugin_= register_vcpu_syscall_ret_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_insn_disas_t qemu_plugin_insn_disas; +QEMU_PLUGIN_EXTERN qemu_plugin_vcpu_for_each_t qemu_plugin_vcpu_for_each; +QEMU_PLUGIN_EXTERN qemu_plugin_register_flush_cb_t qemu_plugin_register_fl= ush_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_register_atexit_cb_t qemu_plugin_register_a= texit_cb; +QEMU_PLUGIN_EXTERN qemu_plugin_n_vcpus_t qemu_plugin_n_vcpus; +QEMU_PLUGIN_EXTERN qemu_plugin_n_max_vcpus_t qemu_plugin_n_max_vcpus; +QEMU_PLUGIN_EXTERN qemu_plugin_outs_t qemu_plugin_outs; + +#if defined(QEMU_PLUGIN_IMPLEMENTATION) + +int qemu_plugin_init(const qemu_info_t *info) +{ + qemu_plugin_uninstall =3D info->dlsym(info->context, "qemu_plugin_unin= stall"); + qemu_plugin_reset =3D info->dlsym(info->context, "qemu_plugin_reset"); + qemu_plugin_register_vcpu_init_cb =3D info->dlsym(info->context, "qemu= _plugin_register_vcpu_init_cb"); + qemu_plugin_register_vcpu_exit_cb =3D info->dlsym(info->context, "qemu= _plugin_register_vcpu_exit_cb"); + qemu_plugin_register_vcpu_idle_cb =3D info->dlsym(info->context, "qemu= _plugin_register_vcpu_idle_cb"); + qemu_plugin_register_vcpu_resume_cb =3D info->dlsym(info->context, "qe= mu_plugin_register_vcpu_resume_cb"); + qemu_plugin_register_vcpu_tb_trans_cb =3D info->dlsym(info->context, "= qemu_plugin_register_vcpu_tb_trans_cb"); + qemu_plugin_register_vcpu_tb_exec_cb =3D info->dlsym(info->context, "q= emu_plugin_register_vcpu_tb_exec_cb"); + qemu_plugin_register_vcpu_tb_exec_inline =3D info->dlsym(info->context= , "qemu_plugin_register_vcpu_tb_exec_inline"); + qemu_plugin_register_vcpu_insn_exec_cb =3D info->dlsym(info->context, = "qemu_plugin_register_vcpu_insn_exec_cb"); + qemu_plugin_register_vcpu_insn_exec_inline =3D info->dlsym(info->conte= xt, "qemu_plugin_register_vcpu_insn_exec_inline"); + qemu_plugin_tb_n_insns =3D info->dlsym(info->context, "qemu_plugin_tb_= n_insns"); + qemu_plugin_tb_vaddr =3D info->dlsym(info->context, "qemu_plugin_tb_va= ddr"); + qemu_plugin_tb_get_insn =3D info->dlsym(info->context, "qemu_plugin_tb= _get_insn"); + qemu_plugin_insn_data =3D info->dlsym(info->context, "qemu_plugin_insn= _data"); + qemu_plugin_insn_size =3D info->dlsym(info->context, "qemu_plugin_insn= _size"); + qemu_plugin_insn_vaddr =3D info->dlsym(info->context, "qemu_plugin_ins= n_vaddr"); + qemu_plugin_insn_haddr =3D info->dlsym(info->context, "qemu_plugin_ins= n_haddr"); + qemu_plugin_mem_size_shift =3D info->dlsym(info->context, "qemu_plugin= _mem_size_shift"); + qemu_plugin_mem_is_sign_extended =3D info->dlsym(info->context, "qemu_= plugin_mem_is_sign_extended"); + qemu_plugin_mem_is_big_endian =3D info->dlsym(info->context, "qemu_plu= gin_mem_is_big_endian"); + qemu_plugin_mem_is_store =3D info->dlsym(info->context, "qemu_plugin_m= em_is_store"); + qemu_plugin_get_hwaddr =3D info->dlsym(info->context, "qemu_plugin_get= _hwaddr"); + qemu_plugin_hwaddr_is_io =3D info->dlsym(info->context, "qemu_plugin_h= waddr_is_io"); + qemu_plugin_hwaddr_device_offset =3D info->dlsym(info->context, "qemu_= plugin_hwaddr_device_offset"); + qemu_plugin_register_vcpu_mem_cb =3D info->dlsym(info->context, "qemu_= plugin_register_vcpu_mem_cb"); + qemu_plugin_register_vcpu_mem_inline =3D info->dlsym(info->context, "q= emu_plugin_register_vcpu_mem_inline"); + qemu_plugin_register_vcpu_syscall_cb =3D info->dlsym(info->context, "q= emu_plugin_register_vcpu_syscall_cb"); + qemu_plugin_register_vcpu_syscall_ret_cb =3D info->dlsym(info->context= , "qemu_plugin_register_vcpu_syscall_ret_cb"); + qemu_plugin_insn_disas =3D info->dlsym(info->context, "qemu_plugin_ins= n_disas"); + qemu_plugin_vcpu_for_each =3D info->dlsym(info->context, "qemu_plugin_= vcpu_for_each"); + qemu_plugin_register_flush_cb =3D info->dlsym(info->context, "qemu_plu= gin_register_flush_cb"); + qemu_plugin_register_atexit_cb =3D info->dlsym(info->context, "qemu_pl= ugin_register_atexit_cb"); + qemu_plugin_n_vcpus =3D info->dlsym(info->context, "qemu_plugin_n_vcpu= s"); + qemu_plugin_n_max_vcpus =3D info->dlsym(info->context, "qemu_plugin_n_= max_vcpus"); + qemu_plugin_outs =3D info->dlsym(info->context, "qemu_plugin_outs"); + return 0; +} + +#endif + +#endif /* QEMU_PLUGIN_API_IMPLEMENTATION */ + =20 #endif /* QEMU_PLUGIN_API_H */ diff --git a/meson.build b/meson.build index 822aac0825..d79ff96bf7 100644 --- a/meson.build +++ b/meson.build @@ -243,7 +243,11 @@ endif rt =3D cc.find_library('rt', required: false) libdl =3D not_found if 'CONFIG_PLUGIN' in config_host - libdl =3D cc.find_library('dl', required: true) + if targetos =3D=3D 'windows' + libdl =3D declare_dependency(compile_args: [], link_args: []) + else + libdl =3D cc.find_library('dl', required: true) + endif endif libiscsi =3D not_found if 'CONFIG_LIBISCSI' in config_host diff --git a/plugins/api.c b/plugins/api.c index bbdc5a4eb4..99e393fba0 100644 --- a/plugins/api.c +++ b/plugins/api.c @@ -35,6 +35,7 @@ */ =20 #include "qemu/osdep.h" +#define QEMU_PLUGIN_API_IMPLEMENTATION #include "qemu/plugin.h" #include "cpu.h" #include "sysemu/sysemu.h" @@ -50,12 +51,12 @@ =20 /* Uninstall and Reset handlers */ =20 -void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb) +QEMU_PLUGIN_EXPORT void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_pl= ugin_simple_cb_t cb) { plugin_reset_uninstall(id, cb, false); } =20 -void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb) +QEMU_PLUGIN_EXPORT void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin= _simple_cb_t cb) { plugin_reset_uninstall(id, cb, true); } @@ -67,19 +68,19 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin= _simple_cb_t cb) * during the translation. */ =20 -void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t= id, qemu_plugin_vcpu_simple_cb_t cb) { plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_INIT, cb); } =20 -void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t= id, qemu_plugin_vcpu_simple_cb_t cb) { plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_EXIT, cb); } =20 -void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_plugin_tb *tb, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_p= lugin_tb *tb, qemu_plugin_vcpu_udata_cb_t cb, enum qemu_plugin_cb_flags flags, void *udata) @@ -88,14 +89,14 @@ void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_p= lugin_tb *tb, cb, flags, udata); } =20 -void qemu_plugin_register_vcpu_tb_exec_inline(struct qemu_plugin_tb *tb, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_tb_exec_inline(struct qe= mu_plugin_tb *tb, enum qemu_plugin_op op, void *ptr, uint64_t imm) { plugin_register_inline_op(&tb->cbs[PLUGIN_CB_INLINE], 0, op, ptr, imm); } =20 -void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu_plugin_insn *insn, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu= _plugin_insn *insn, qemu_plugin_vcpu_udata_cb_t cb, enum qemu_plugin_cb_flags flag= s, void *udata) @@ -104,7 +105,7 @@ void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu= _plugin_insn *insn, cb, flags, udata); } =20 -void qemu_plugin_register_vcpu_insn_exec_inline(struct qemu_plugin_insn *i= nsn, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_insn_exec_inline(struct = qemu_plugin_insn *insn, enum qemu_plugin_op op, void *ptr, uint64_t imm) { @@ -114,7 +115,7 @@ void qemu_plugin_register_vcpu_insn_exec_inline(struct = qemu_plugin_insn *insn, =20 =20 =20 -void qemu_plugin_register_vcpu_mem_cb(struct qemu_plugin_insn *insn, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_mem_cb(struct qemu_plugi= n_insn *insn, qemu_plugin_vcpu_mem_cb_t cb, enum qemu_plugin_cb_flags flags, enum qemu_plugin_mem_rw rw, @@ -124,7 +125,7 @@ void qemu_plugin_register_vcpu_mem_cb(struct qemu_plugi= n_insn *insn, cb, flags, rw, udata); } =20 -void qemu_plugin_register_vcpu_mem_inline(struct qemu_plugin_insn *insn, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_mem_inline(struct qemu_p= lugin_insn *insn, enum qemu_plugin_mem_rw rw, enum qemu_plugin_op op, void *pt= r, uint64_t imm) @@ -133,19 +134,19 @@ void qemu_plugin_register_vcpu_mem_inline(struct qemu= _plugin_insn *insn, rw, op, ptr, imm); } =20 -void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_id_t id, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_= id_t id, qemu_plugin_vcpu_tb_trans_cb_t = cb) { plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_TB_TRANS, cb); } =20 -void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_i= d_t id, qemu_plugin_vcpu_syscall_cb_t cb) { plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_SYSCALL, cb); } =20 -void +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_id_t id, qemu_plugin_vcpu_syscall_ret_cb_t= cb) { @@ -168,17 +169,17 @@ qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_= id_t id, * each translated instruction. */ =20 -size_t qemu_plugin_tb_n_insns(const struct qemu_plugin_tb *tb) +QEMU_PLUGIN_EXPORT size_t qemu_plugin_tb_n_insns(const struct qemu_plugin_= tb *tb) { return tb->n; } =20 -uint64_t qemu_plugin_tb_vaddr(const struct qemu_plugin_tb *tb) +QEMU_PLUGIN_EXPORT uint64_t qemu_plugin_tb_vaddr(const struct qemu_plugin_= tb *tb) { return tb->vaddr; } =20 -struct qemu_plugin_insn * +QEMU_PLUGIN_EXPORT struct qemu_plugin_insn * qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *tb, size_t idx) { if (unlikely(idx >=3D tb->n)) { @@ -194,27 +195,27 @@ qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *= tb, size_t idx) * instruction being translated. */ =20 -const void *qemu_plugin_insn_data(const struct qemu_plugin_insn *insn) +QEMU_PLUGIN_EXPORT const void *qemu_plugin_insn_data(const struct qemu_plu= gin_insn *insn) { return insn->data->data; } =20 -size_t qemu_plugin_insn_size(const struct qemu_plugin_insn *insn) +QEMU_PLUGIN_EXPORT size_t qemu_plugin_insn_size(const struct qemu_plugin_i= nsn *insn) { return insn->data->len; } =20 -uint64_t qemu_plugin_insn_vaddr(const struct qemu_plugin_insn *insn) +QEMU_PLUGIN_EXPORT uint64_t qemu_plugin_insn_vaddr(const struct qemu_plugi= n_insn *insn) { return insn->vaddr; } =20 -void *qemu_plugin_insn_haddr(const struct qemu_plugin_insn *insn) +QEMU_PLUGIN_EXPORT void *qemu_plugin_insn_haddr(const struct qemu_plugin_i= nsn *insn) { return insn->haddr; } =20 -char *qemu_plugin_insn_disas(const struct qemu_plugin_insn *insn) +QEMU_PLUGIN_EXPORT char *qemu_plugin_insn_disas(const struct qemu_plugin_i= nsn *insn) { CPUState *cpu =3D current_cpu; return plugin_disas(cpu, insn->vaddr, insn->data->len); @@ -225,22 +226,22 @@ char *qemu_plugin_insn_disas(const struct qemu_plugin= _insn *insn) * memory access. */ =20 -unsigned qemu_plugin_mem_size_shift(qemu_plugin_meminfo_t info) +QEMU_PLUGIN_EXPORT unsigned qemu_plugin_mem_size_shift(qemu_plugin_meminfo= _t info) { return info & TRACE_MEM_SZ_SHIFT_MASK; } =20 -bool qemu_plugin_mem_is_sign_extended(qemu_plugin_meminfo_t info) +QEMU_PLUGIN_EXPORT bool qemu_plugin_mem_is_sign_extended(qemu_plugin_memin= fo_t info) { return !!(info & TRACE_MEM_SE); } =20 -bool qemu_plugin_mem_is_big_endian(qemu_plugin_meminfo_t info) +QEMU_PLUGIN_EXPORT bool qemu_plugin_mem_is_big_endian(qemu_plugin_meminfo_= t info) { return !!(info & TRACE_MEM_BE); } =20 -bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info) +QEMU_PLUGIN_EXPORT bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t inf= o) { return !!(info & TRACE_MEM_ST); } @@ -252,7 +253,7 @@ bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t inf= o) #ifdef CONFIG_SOFTMMU static __thread struct qemu_plugin_hwaddr hwaddr_info; =20 -struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qemu_plugin_meminfo_t in= fo, +QEMU_PLUGIN_EXPORT struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qemu_= plugin_meminfo_t info, uint64_t vaddr) { CPUState *cpu =3D current_cpu; @@ -268,14 +269,14 @@ struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qem= u_plugin_meminfo_t info, return &hwaddr_info; } #else -struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qemu_plugin_meminfo_t in= fo, +QEMU_PLUGIN_EXPORT struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qemu_= plugin_meminfo_t info, uint64_t vaddr) { return NULL; } #endif =20 -bool qemu_plugin_hwaddr_is_io(const struct qemu_plugin_hwaddr *haddr) +QEMU_PLUGIN_EXPORT bool qemu_plugin_hwaddr_is_io(const struct qemu_plugin_= hwaddr *haddr) { #ifdef CONFIG_SOFTMMU return haddr->is_io; @@ -284,7 +285,7 @@ bool qemu_plugin_hwaddr_is_io(const struct qemu_plugin_= hwaddr *haddr) #endif } =20 -uint64_t qemu_plugin_hwaddr_device_offset(const struct qemu_plugin_hwaddr = *haddr) +QEMU_PLUGIN_EXPORT uint64_t qemu_plugin_hwaddr_device_offset(const struct = qemu_plugin_hwaddr *haddr) { #ifdef CONFIG_SOFTMMU if (haddr) { @@ -315,7 +316,7 @@ static MachineState * get_ms(void) } #endif =20 -int qemu_plugin_n_vcpus(void) +QEMU_PLUGIN_EXPORT int qemu_plugin_n_vcpus(void) { #ifdef CONFIG_USER_ONLY return -1; @@ -324,7 +325,7 @@ int qemu_plugin_n_vcpus(void) #endif } =20 -int qemu_plugin_n_max_vcpus(void) +QEMU_PLUGIN_EXPORT int qemu_plugin_n_max_vcpus(void) { #ifdef CONFIG_USER_ONLY return -1; @@ -336,7 +337,7 @@ int qemu_plugin_n_max_vcpus(void) /* * Plugin output */ -void qemu_plugin_outs(const char *string) +QEMU_PLUGIN_EXPORT void qemu_plugin_outs(const char *string) { qemu_log_mask(CPU_LOG_PLUGIN, "%s", string); } diff --git a/plugins/core.c b/plugins/core.c index 51bfc94787..93a4b83a65 100644 --- a/plugins/core.c +++ b/plugins/core.c @@ -12,6 +12,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "qemu/osdep.h" +#define QEMU_PLUGIN_API_IMPLEMENTATION #include "qemu/error-report.h" #include "qemu/config-file.h" #include "qapi/error.h" @@ -233,7 +234,7 @@ static void plugin_vcpu_for_each(gpointer k, gpointer v= , gpointer udata) args->cb(args->ctx->id, cpu_index); } =20 -void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id, +QEMU_PLUGIN_EXPORT void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id, qemu_plugin_vcpu_simple_cb_t cb) { struct plugin_for_each_args args; @@ -384,13 +385,13 @@ void qemu_plugin_vcpu_resume_cb(CPUState *cpu) plugin_vcpu_cb__simple(cpu, QEMU_PLUGIN_EV_VCPU_RESUME); } =20 -void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t= id, qemu_plugin_vcpu_simple_cb_t cb) { plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_IDLE, cb); } =20 -void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id, +QEMU_PLUGIN_EXPORT void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id= _t id, qemu_plugin_vcpu_simple_cb_t cb) { plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_RESUME, cb); diff --git a/plugins/loader.c b/plugins/loader.c index 8ac5dbc20f..c1d52dacc8 100644 --- a/plugins/loader.c +++ b/plugins/loader.c @@ -254,6 +254,17 @@ static void plugin_desc_free(struct qemu_plugin_desc *= desc) g_free(desc); } =20 +static void *qemu_plugin_global_dlsym(void* context, const char *name) +{ + GModule *global_handle =3D context; + gpointer sym =3D NULL; + if (!g_module_symbol(global_handle, name, &sym)) { + error_report("%s: %s", __func__, g_module_error()); + return NULL; + } + return sym; +} + /** * qemu_plugin_load_list - load a list of plugins * @head: head of the list of descriptors of the plugins to be loaded @@ -267,6 +278,7 @@ int qemu_plugin_load_list(QemuPluginList *head) { struct qemu_plugin_desc *desc, *next; g_autofree qemu_info_t *info =3D g_new0(qemu_info_t, 1); + GModule *global_handle =3D NULL; =20 info->target_name =3D TARGET_NAME; info->version.min =3D QEMU_PLUGIN_MIN_VERSION; @@ -276,6 +288,12 @@ int qemu_plugin_load_list(QemuPluginList *head) info->system_emulation =3D true; info->system.smp_vcpus =3D ms->smp.cpus; info->system.max_vcpus =3D ms->smp.max_cpus; + global_handle =3D g_module_open(NULL, G_MODULE_BIND_LOCAL); + if (global_handle =3D=3D NULL) { + goto err_dlopen; + } + info->dlsym =3D qemu_plugin_global_dlsym; + info->context =3D (void*)global_handle; #else info->system_emulation =3D false; #endif @@ -289,6 +307,8 @@ int qemu_plugin_load_list(QemuPluginList *head) } QTAILQ_REMOVE(head, desc, entry); } + +err_dlopen: return 0; } =20 diff --git a/plugins/meson.build b/plugins/meson.build index e77723010e..16af5d7ca3 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -1,13 +1,5 @@ -if 'CONFIG_HAS_LD_DYNAMIC_LIST' in config_host - plugin_ldflags =3D ['-Wl,--dynamic-list=3D' + (meson.build_root() / 'qem= u-plugins-ld.symbols')] -elif 'CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST' in config_host - plugin_ldflags =3D ['-Wl,-exported_symbols_list,' + (meson.build_root() = / 'qemu-plugins-ld64.symbols')] -else - plugin_ldflags =3D [] -endif - specific_ss.add(when: 'CONFIG_PLUGIN', if_true: [files( 'loader.c', 'core.c', 'api.c', -), declare_dependency(link_args: plugin_ldflags)]) +), declare_dependency(link_args: [], compile_args: ['-Wno-missing-prototyp= es'])]) diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols deleted file mode 100644 index 4bdb381f48..0000000000 --- a/plugins/qemu-plugins.symbols +++ /dev/null @@ -1,40 +0,0 @@ -{ - qemu_plugin_uninstall; - qemu_plugin_reset; - qemu_plugin_register_vcpu_init_cb; - qemu_plugin_register_vcpu_exit_cb; - qemu_plugin_register_vcpu_idle_cb; - qemu_plugin_register_vcpu_resume_cb; - qemu_plugin_register_vcpu_insn_exec_cb; - qemu_plugin_register_vcpu_insn_exec_inline; - qemu_plugin_register_vcpu_mem_cb; - qemu_plugin_register_vcpu_mem_haddr_cb; - qemu_plugin_register_vcpu_mem_inline; - qemu_plugin_ram_addr_from_host; - qemu_plugin_register_vcpu_tb_trans_cb; - qemu_plugin_register_vcpu_tb_exec_cb; - qemu_plugin_register_vcpu_tb_exec_inline; - qemu_plugin_register_flush_cb; - qemu_plugin_register_vcpu_syscall_cb; - qemu_plugin_register_vcpu_syscall_ret_cb; - qemu_plugin_register_atexit_cb; - qemu_plugin_tb_n_insns; - qemu_plugin_tb_get_insn; - qemu_plugin_tb_vaddr; - qemu_plugin_insn_data; - qemu_plugin_insn_size; - qemu_plugin_insn_vaddr; - qemu_plugin_insn_haddr; - qemu_plugin_insn_disas; - qemu_plugin_mem_size_shift; - qemu_plugin_mem_is_sign_extended; - qemu_plugin_mem_is_big_endian; - qemu_plugin_mem_is_store; - qemu_plugin_get_hwaddr; - qemu_plugin_hwaddr_is_io; - qemu_plugin_hwaddr_to_raddr; - qemu_plugin_vcpu_for_each; - qemu_plugin_n_vcpus; - qemu_plugin_n_max_vcpus; - qemu_plugin_outs; -}; diff --git a/tests/plugin/bb.c b/tests/plugin/bb.c index ef784be78f..5ee0bce39d 100644 --- a/tests/plugin/bb.c +++ b/tests/plugin/bb.c @@ -12,6 +12,7 @@ #include #include =20 +#define QEMU_PLUGIN_IMPLEMENTATION #include =20 QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; @@ -101,6 +102,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_= id_t id, int argc, char **argv) { int i; + qemu_plugin_init(info); =20 for (i =3D 0; i < argc; i++) { char *opt =3D argv[i]; diff --git a/tests/plugin/empty.c b/tests/plugin/empty.c index 8fa6bacd93..9e1e683fd6 100644 --- a/tests/plugin/empty.c +++ b/tests/plugin/empty.c @@ -11,6 +11,7 @@ #include #include =20 +#define QEMU_PLUGIN_IMPLEMENTATION #include =20 QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; @@ -27,6 +28,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id= _t id, const qemu_info_t *info, int argc, char **argv) { + qemu_plugin_init(info); qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans); return 0; } diff --git a/tests/plugin/insn.c b/tests/plugin/insn.c index a9a6e41237..ea848036bc 100644 --- a/tests/plugin/insn.c +++ b/tests/plugin/insn.c @@ -12,6 +12,7 @@ #include #include =20 +#define QEMU_PLUGIN_IMPLEMENTATION #include =20 QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; @@ -52,6 +53,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id= _t id, const qemu_info_t *info, int argc, char **argv) { + qemu_plugin_init(info); if (argc && !strcmp(argv[0], "inline")) { do_inline =3D true; } diff --git a/tests/plugin/mem.c b/tests/plugin/mem.c index 4725bd851d..ba3ce3a713 100644 --- a/tests/plugin/mem.c +++ b/tests/plugin/mem.c @@ -12,6 +12,7 @@ #include #include =20 +#define QEMU_PLUGIN_IMPLEMENTATION #include =20 QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; @@ -73,6 +74,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id= _t id, const qemu_info_t *info, int argc, char **argv) { + qemu_plugin_init(info); if (argc) { if (argc >=3D 3) { if (!strcmp(argv[2], "haddr")) { --=20 2.28.0.windows.1 From nobody Sun Oct 26 01:22:41 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1601129286; cv=none; d=zohomail.com; s=zohoarc; b=iozilJL17bK6y19ZQXFdAvZApgeOlU/H5LrIi+bL/ECXuFhUlpb+0JMXoHSy+3nqm6OUL0UGjZVckM+XzChHTpZQ9PoU08h45HgacZ9HJJrygnRE7Jzm2JcMySiO8DXtox35jvFGu8zzAXzQL5j8B8PA6lKWhYm8chLqb90rACM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601129286; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=9ZjByY0MppOyobXen+0uddzbK8uVuelULUAbb8n9Gk0=; b=jKO6tsU8Ujox2dDmfKUKiNxhzOCKBxC06TJDYd2dzGzrYLD8rcH3QsWdNLCkwk7xqBzha5VLxm8BWrX54QpXTklB+7/ECzFuSpydxtWkro2p0EuUa58Dtfh+k7WnzScDH6ReL59jo2/CYzmiMDWV1dXE5zSmEg39hf9h/+vE/nI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1601129286989134.7334494891502; Sat, 26 Sep 2020 07:08:06 -0700 (PDT) Received: from localhost ([::1]:60410 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kMArt-0003dY-Gu for importer@patchew.org; Sat, 26 Sep 2020 10:08:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54306) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kMAoj-0000eO-65 for qemu-devel@nongnu.org; Sat, 26 Sep 2020 10:04:49 -0400 Received: from mail-pj1-x1031.google.com ([2607:f8b0:4864:20::1031]:51362) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kMAod-0005Nl-K7 for qemu-devel@nongnu.org; Sat, 26 Sep 2020 10:04:48 -0400 Received: by mail-pj1-x1031.google.com with SMTP id a9so1006094pjg.1 for ; Sat, 26 Sep 2020 07:04:43 -0700 (PDT) Received: from localhost.localdomain ([222.95.248.6]) by smtp.googlemail.com with ESMTPSA id k3sm6091109pfp.41.2020.09.26.07.04.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 26 Sep 2020 07:04:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=9ZjByY0MppOyobXen+0uddzbK8uVuelULUAbb8n9Gk0=; b=f+8oAajkZ80oK2YqmqVhv7NBb0mYkhBkQUXSnR0DBvMyyHdMKaAQJpZ+IiDZYxhocf KBF8cw5phiBsn4OXTNzvEF6LYgSz2JrnFcmwD5O8CXiPP5o/XQuKeiHOs0OI4ZprlKzY mMiUxNcj2EuZXFlujATPQlZMGAvEvLeSWfNhFuUGIbPx7zLd4rlIwXLPo5+BYrCrEZsu X9DbQR9S8bk2ShsCKVShaJcjgVHM6D/jmksT0Qdv9b+mo0Ky/U84ddLEfpz7hb7q2chY 1sbn7IBeH61DWEkEOJ3SfSmztqJMcZE/zKho7bb1VnglWy+l4bXpPIN/zo871JYYjGcx jCEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=9ZjByY0MppOyobXen+0uddzbK8uVuelULUAbb8n9Gk0=; b=VKJf1Ytmk7JQRnL9f4rlVyiLEUDh2kZAPlAxuR8uTu5MX8nD60Fwgg14lGkZzZDayx BP5pvQC2DMewTNBzy5YL8ar2Anc6168h6PdH+FIvhyvC12oBkFbRx4NaBgijgUVRRXs/ +HipzO4HyVxXbHFSuHqhwmXxlMEmjh1KBUCWKe962yTmrAHEQeZA1twqDVQCK8osCxKS pondf4Ez55GSbtX8LQYijC+Bei0WI9C2wxSbT0UHa6ssyFDsTA01Mfoj0bibEhT9Rk7Q Y8g/jIkUc8rYGR7iK1EGRFJLTooVLmUG8rBpb+/rd5wyfBTdBGoy7yWfxQrshMdg62QY Hbbg== X-Gm-Message-State: AOAM532NTc9QK08vb2R73CpabJGmMVm8Z9xL955NddiWRhSPKr4IWUoA P3dR/WgDDAO0vvk4mPrvfNaTKl2JbooyfAum X-Google-Smtp-Source: ABdhPJwGDuxtU+7ekrQqaSik30G4NfyRUfJaRDQ2Hx9UIlpnTgyO+6eNvVH7+TvYRQCQebo+mKZzdw== X-Received: by 2002:a17:90b:1083:: with SMTP id gj3mr2175590pjb.126.1601129081810; Sat, 26 Sep 2020 07:04:41 -0700 (PDT) From: Yonggang Luo To: qemu-devel@nongnu.org Subject: [PATCH 4/4] cirrus: Enable plugin in cirrus for windows Date: Sat, 26 Sep 2020 22:04:15 +0800 Message-Id: <20200926140415.1286-5-luoyonggang@gmail.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20200926140415.1286-1-luoyonggang@gmail.com> References: <20200926140415.1286-1-luoyonggang@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::1031; envelope-from=luoyonggang@gmail.com; helo=mail-pj1-x1031.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. 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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Alex=20Benn=C3=A9e?= , Paolo Bonzini , Yonggang Luo , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Signed-off-by: Yonggang Luo --- .cirrus.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 86ea33926a..5363142373 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -104,7 +104,8 @@ windows_msys2_task: - C:\tools\msys64\usr\bin\bash.exe -lc "mkdir build" - C:\tools\msys64\usr\bin\bash.exe -lc "cd build && ../configure --python=3Dpython3 --ninja=3Dninja - --target-list-exclude=3Di386-softmmu,arm-softmmu,ppc-softmmu,mips-so= ftmmu" + --target-list-exclude=3Di386-softmmu,arm-softmmu,ppc-softmmu,mips-so= ftmmu + --enable-plugins" - C:\tools\msys64\usr\bin\bash.exe -lc "cd build && make -j$NUMBER_OF_= PROCESSORS" test_script: - C:\tools\msys64\usr\bin\bash.exe -lc "cd build && make V=3D1 check" --=20 2.28.0.windows.1