From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189845; cv=none; d=zohomail.com; s=zohoarc; b=nRHBREX7na9eBR4HG07H9uY/acO80LgzAL9esFFssHW012jaDvIT3a+juSVtgHwNtRgEMgU8XJCGu/AJ7zhQ5+qLIOPSa7OsHKDHunxGX4DwS+9Y/qkTFuxXZchf7RyygHEaC5BB82uf6Y0SBL/pRw4BdzrJivjSAYX6EMO1lro= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189845; h=Content-Type: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=l8GNY9Dk05aam1GteIe+5IhM8+EbOG/DMvh81Ar6L7Y=; b=ivdGLMIs1CvTCSdVgCRmeUkRZSqGFvJ0aAbN/4EMLQQZRQgsC0RLS71wjb0ZbCguFc7OE35rQ4lN+NTrJIE1lZ1LfcqeN2HhhZqfPIyfpR1t7MfiKIkCyp1U4pPzws2GWM7V/lf14FAmns8TI0DSuHn4J8otx0d/XyT62cWS3tA= 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 1671189845039453.8864038969069; Fri, 16 Dec 2022 03:24:05 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68n9-000234-1s; Fri, 16 Dec 2022 06:22:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68n5-00021D-DJ for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:11 -0500 Received: from mail-wr1-x430.google.com ([2a00:1450:4864:20::430]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1p68n3-00067M-So for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:11 -0500 Received: by mail-wr1-x430.google.com with SMTP id bx10so2225219wrb.0 for ; Fri, 16 Dec 2022 03:22:09 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id s13-20020a5d510d000000b00241e5b917d0sm2344490wrt.36.2022.12.16.03.22.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:07 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id F21D71FFB8; Fri, 16 Dec 2022 11:22:06 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=l8GNY9Dk05aam1GteIe+5IhM8+EbOG/DMvh81Ar6L7Y=; b=kfMFSb276+vELN6D+FKSq6d/kVhSIYYuZ+W/VRTxOqDFnzJGgmaCLcQ6tW1xLxCwO5 ZVOvpR32NetMQlPLhsutxgdEFLjwwjorfT9gnUOMB66b54NrDe39/durdgk6xkCyx88A +M5dy9IBU2Tf+7JOKVIjo01+1mj3/rnK/FDAc+IDGhEQ9PjQfoxFcvhoVCteIfcjSDAw kRJCJ5Jov9SfZH0PddNnb8r7nUp9ZySOccYmM0dqWyqqVuLN0txMsfsF7uD2A46f7UAb /iORxvHqiSwqNEjEXrY4sge9uR+N+uLVSIdmn9z8xj6MAkbnT32wPVi2mSENY5OSeye3 AHGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=l8GNY9Dk05aam1GteIe+5IhM8+EbOG/DMvh81Ar6L7Y=; b=2nF0fSE9wmx4oKOib1NV/bsYk2XbW6xIcNN1Cx2DzCnLhjAwom0FRquCD5PsoxDhRN FDbfSDEFxHYTUiATGDV1wSgXIKAm9gWDB/3Eyh+JEHE1pdak+7nNzr+NVM59HVCgX5yv lOjx6D9719ih56GUZBOO5UMv1b0t5kHt/gwbQkzOtEGY4xZIFwrtuc5wCOsYzeNO7M2H Ns/yzYFMSTQCqEZB5Z04ClD50EnBEq6Et7XTvEtVptmbfX2j355z6l9zt478tPARTdS3 dzjnqlDQ6MgI3FCXIYXSYFXEvzfOGzsuH/5t52sXGnPPlZqiAXoexYR/dFAUr8lxqoCA 0XHA== X-Gm-Message-State: ANoB5pmIYi0HG1Jw5JPxNNYXjS7J6wJUSatSrrRG0zpTyh0wUc4zQAEd 3L8RWKqfaizFscw/nY6tB0auEA== X-Google-Smtp-Source: AA0mqf4OujeFuM9y5HPk0N7v0ugUS6BS9b0QE2urs7IL8eeOryOE4g4P6kCpOZsOgzDcfW5kRWqM1w== X-Received: by 2002:a05:6000:1c18:b0:242:7594:c2f7 with SMTP id ba24-20020a0560001c1800b002427594c2f7mr24971271wrb.64.1671189727967; Fri, 16 Dec 2022 03:22:07 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v1 01/10] gdbstub/internals.h: clean up include guard Date: Fri, 16 Dec 2022 11:21:57 +0000 Message-Id: <20221216112206.3171578-2-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::430; envelope-from=alex.bennee@linaro.org; helo=mail-wr1-x430.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1671189845848100005 Use something more specific to avoid name clashes. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson --- gdbstub/internals.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gdbstub/internals.h b/gdbstub/internals.h index eabb0341d1..b444f24ef5 100644 --- a/gdbstub/internals.h +++ b/gdbstub/internals.h @@ -6,12 +6,12 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ =20 -#ifndef _INTERNALS_H_ -#define _INTERNALS_H_ +#ifndef GDBSTUB_INTERNALS_H +#define GDBSTUB_INTERNALS_H =20 bool gdb_supports_guest_debug(void); int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len); int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr len); void gdb_breakpoint_remove_all(CPUState *cs); =20 -#endif /* _INTERNALS_H_ */ +#endif /* GDBSTUB_INTERNALS_H */ --=20 2.34.1 From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189843; cv=none; d=zohomail.com; s=zohoarc; b=A9BlvjbfEBqgL4ByAWo9jVeH8OJTXyARomYBOPWDCk43acnTNzZXs43uB7td+R+j4JtfCAD72PJWfHG4u7LwSGLXhSqtWPyeBmJtyKfpLBL5/FL/pAWAOXjg7/sXqsKKvP41EOw4SyC2/tmA8oV3strIVbnIgq/SOSOkke+gIwc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189843; h=Content-Type: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=BgiiBb+yScI+SL2a4SbN56s5Ld04rpPxAdeXU8vVFIY=; b=AcalEi+FjKT4s1x8Cn6IuPIRn9ZUnanKs1p8StUnlM77oXHEA1lsCTwhn01zDO4z11gsD5a2BDPkDFx6ZiDstkrJm4AQ0TxktC6rREZz86mEmP2KMTNcJqg/3g/XdTTu0BlMZXDzb/A69zeHmubJStfZGArtzE9CdWhy/s1S/iE= 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 1671189843254910.5573633024766; Fri, 16 Dec 2022 03:24:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68n8-00022g-FY; Fri, 16 Dec 2022 06:22:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68n6-00021a-Jv for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:12 -0500 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1p68n3-00067Q-Ug for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:12 -0500 Received: by mail-wr1-x433.google.com with SMTP id o5so2186642wrm.1 for ; Fri, 16 Dec 2022 03:22:09 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id b4-20020a5d4d84000000b002423a5d7cb1sm1981521wru.113.2022.12.16.03.22.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:07 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 16CE41FFBA; Fri, 16 Dec 2022 11:22:07 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=BgiiBb+yScI+SL2a4SbN56s5Ld04rpPxAdeXU8vVFIY=; b=KnKehXyWDns0B5o5+TZgEZDYCXazjpeIgKhcKi4SK3WckClQHvZxxDcSTlteqQfHCx KAVqcRoXqMutoy2g+PiddBXp0VdXy+88Rc1nskuVEBeckXrCLR+DPGa0fDh1BkS9uT5x WGaVj9/kj2a0eI5i3G9k4wC+i9FpF60a+5Z8QXnhCBOmrnlkvFXrHHWla3RJJkRaNeNd JuBbSmAfCIfClYqp7nffZPZt2y4EjPHV5zDkfFHNBoAdUJIlImDR5PvU4MGgpJ6sXYpT vEZOvw5q9DvUyRz4Vz1y64ow7Xp+Pvu+rE8k0gRbtq1ApmrJGWtv7farGDhCYcnaAOfd Yciw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=BgiiBb+yScI+SL2a4SbN56s5Ld04rpPxAdeXU8vVFIY=; b=Ki7lpo8Xxqpu8CQZFZYD9QAWHz0UsgBWMhTkD05/iJoBavb7H+973CQiNXVprUvgju F1+SheBiH3y88NzGHGRbutO1dJV5lenaXE7g8S4MjcQAkDhfkQMVm/1qfLlARFmub+kN Gn+WkvAtCStaoiE7UCREBT38aTBYWcJDpQSvqa0Cv5KAx5/nzURkbKRYqvJcLO7q9VmQ pW1CSpcJ99ObA67dvHsmKspUOfUEAyoL1jgrq8zyB5ARpf7dSAQcqC0ZXJ6liH5DmNbk acZ+sFW4f4KCLGXR6jXXmX5YHfeZspFYE+8lr8Drowr1Cz2Cy8//WnxsGk1XMb5w0FT0 EF1g== X-Gm-Message-State: ANoB5pmBgJ40aI4uH7EsHa+e2AQs9eMis80eGBBqaCRcba7atcg35U91 WxjaAJepWovdOkd1bgW7VADsgA== X-Google-Smtp-Source: AA0mqf6UfIvwg9x2+D+2CAWrM9re2a24Y9M0/YxqdLhYP33CXjP1z6ebrdqkVN7FHWkZt+W1HU/QQg== X-Received: by 2002:a5d:4e06:0:b0:242:4f56:6b4b with SMTP id p6-20020a5d4e06000000b002424f566b4bmr19780600wrt.38.1671189728663; Fri, 16 Dec 2022 03:22:08 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v1 02/10] gdbstub: fix-up copyright and license files Date: Fri, 16 Dec 2022 11:21:58 +0000 Message-Id: <20221216112206.3171578-3-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::433; envelope-from=alex.bennee@linaro.org; helo=mail-wr1-x433.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1671189843842100001 When I started splitting gdbstub apart I was a little too boilerplate with my file headers. Fix up to carry over Fabrice's copyright and the LGPL license header. Fixes: ae7467b1ac (gdbstub: move breakpoint logic to accel ops) Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson --- gdbstub/softmmu.c | 3 ++- gdbstub/user.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gdbstub/softmmu.c b/gdbstub/softmmu.c index f208c6cf15..183dfb40e4 100644 --- a/gdbstub/softmmu.c +++ b/gdbstub/softmmu.c @@ -4,9 +4,10 @@ * Debug integration depends on support from the individual * accelerators so most of this involves calling the ops helpers. * + * Copyright (c) 2003-2005 Fabrice Bellard * Copyright (c) 2022 Linaro Ltd * - * SPDX-License-Identifier: GPL-2.0-or-later + * SPDX-License-Identifier: LGPL-2.0+ */ =20 #include "qemu/osdep.h" diff --git a/gdbstub/user.c b/gdbstub/user.c index 033e5fdd71..a5f370bcf9 100644 --- a/gdbstub/user.c +++ b/gdbstub/user.c @@ -3,9 +3,10 @@ * * We know for user-mode we are using TCG so we can call stuff directly. * + * Copyright (c) 2003-2005 Fabrice Bellard * Copyright (c) 2022 Linaro Ltd * - * SPDX-License-Identifier: GPL-2.0-or-later + * SPDX-License-Identifier: LGPL-2.0+ */ =20 #include "qemu/osdep.h" --=20 2.34.1 From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189820; cv=none; d=zohomail.com; s=zohoarc; b=KUOoZLxQOPkkyjgr3XxKP5AiGcMMaJe3KEK5gASeYuvH+A0WxSz1EaSdS86XqyKYciJVj8jc+glIbcwhrN8gsG1xc2z20O6BJIQegJDV4a08EvNMWUOJ93NXwAiRvfzbYVifhGa+kW5s3z+2bbACdGWjHVvDzpXyZ2K/3K2ONtg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189820; h=Content-Type: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=Gy0/zYZetKWbyUE6WFREVjvsOrbcepCm3I2qjMJQWPs=; b=T5ZvSAqnjmFHkM7Z+effbwCVL9EvOkHYDhUesWkeCx5d5jTm0wk1LKrcuynGJD2c+xaOdoHxiltGyPdBTEVOrrtULCmuaAzK+Ytz+0lnPt28oqqoJND32yvxGgK/9jZsJOmDjxzPzAvM0bYrQ0htkfGIGr3w9DNBbtZtJplPHW0= 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 16711898200911021.6176530959201; Fri, 16 Dec 2022 03:23:40 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68n9-000238-5F; Fri, 16 Dec 2022 06:22:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68n6-00021f-Qj for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:12 -0500 Received: from mail-wr1-x434.google.com ([2a00:1450: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 1p68n5-00067f-4i for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:12 -0500 Received: by mail-wr1-x434.google.com with SMTP id i7so2153263wrv.8 for ; Fri, 16 Dec 2022 03:22:10 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id bh10-20020a05600005ca00b00242442c8ebdsm2014931wrb.111.2022.12.16.03.22.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:08 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 2D4B41FFBB; Fri, 16 Dec 2022 11:22:07 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=Gy0/zYZetKWbyUE6WFREVjvsOrbcepCm3I2qjMJQWPs=; b=ppDJiOmHgtESgFUqdzTRWldALcCqZlXjSutua5UJYvMdt4LZC7wrjHwKle2ZVY8kIa NsuQxq1S+82jUQVvnusSgy6Wx4qVPSPzJHY8nUg9sD4AhWVrJlDadmAce4cOPjZnyuVT YkzZXmgigjR5zmsKcWn2kLSq11Y74bX5upZCYvNat8gEzCXClqNrKeEL/bV+bWoXNi2n bo9HUJRSE4xUWktOw3VRpickVKmQdxPWqk8axKTZJRMBxxFRzo+k8cgCBzIpVaF3mWNk JZCZdawRhWhPZ6ZIv0kiz1MOYdQGgh2cY+Uid80iaNZevutLoTBuVz7jmkaflVarP0Ie dADw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=Gy0/zYZetKWbyUE6WFREVjvsOrbcepCm3I2qjMJQWPs=; b=V1z1+2gA2gGyCN5X1jNIMLMKw6csE1hb5J+4p/FQwvPAVUPPW1W6ywnGouqN8+pqW+ O1hHsHflstvckGPC0RK2n8vXFuOS5LwecxNK4tx9CuFvK11WNAueNOclMVcGk8fzrqHK Www1OuSx1GD8UaQzEUZ90KWrwoWvXS3h2BJu81LF2Bth5KcidKylOlbNz0QwQxpKNcJi N7XvquVVO2wYlHqt64noivG5COmekRIhs90KCJY82wZRR2s88HWUNNoMwdwbtd8br2AB C9rZnrASzA9ZEYpScoKHUIURaEhM3zi4/eqgQXDO/Srzn2PAGYCtaLjCrk0jzdxzuHOd GqPA== X-Gm-Message-State: ANoB5plLugirq4or/XVLKT/JgbUmoVHpx0vqKOB76vvxh7CrUQ0H9Iba GfsOzSETGLnhcnnxiqFYuu5EnA== X-Google-Smtp-Source: AA0mqf50XgXvLyy+h4zImsHg3777kCyxFTqyeXkr2pEfa9sNx+apByCNAKg3N1aruotyxLPul91X5g== X-Received: by 2002:a5d:68c8:0:b0:242:15e1:5805 with SMTP id p8-20020a5d68c8000000b0024215e15805mr20414440wrw.55.1671189729617; Fri, 16 Dec 2022 03:22:09 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= Subject: [PATCH v1 03/10] gdbstub: Make syscall_complete/[gs]et_reg target-agnostic typedefs Date: Fri, 16 Dec 2022 11:21:59 +0000 Message-Id: <20221216112206.3171578-4-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::434; envelope-from=alex.bennee@linaro.org; helo=mail-wr1-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, 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 @linaro.org) X-ZM-MESSAGEID: 1671189821394100005 From: Philippe Mathieu-Daud=C3=A9 Prototypes using gdb_syscall_complete_cb() or gdb_?et_reg_cb() don't depend on "cpu.h", thus are not target-specific. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Richard Henderson Message-Id: <20221214143659.62133-1-philmd@linaro.org> Signed-off-by: Alex Benn=C3=A9e --- include/exec/gdbstub.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h index f667014888..1636fb3841 100644 --- a/include/exec/gdbstub.h +++ b/include/exec/gdbstub.h @@ -71,9 +71,6 @@ struct gdb_timeval { uint64_t tv_usec; /* microsecond */ } QEMU_PACKED; =20 -#ifdef NEED_CPU_H -#include "cpu.h" - typedef void (*gdb_syscall_complete_cb)(CPUState *cpu, uint64_t ret, int e= rr); =20 /** @@ -126,6 +123,7 @@ int gdb_handlesig(CPUState *, int); void gdb_signalled(CPUArchState *, int); void gdbserver_fork(CPUState *); #endif + /* Get or set a register. Returns the size of the register. */ typedef int (*gdb_get_reg_cb)(CPUArchState *env, GByteArray *buf, int reg); typedef int (*gdb_set_reg_cb)(CPUArchState *env, uint8_t *buf, int reg); @@ -133,6 +131,9 @@ void gdb_register_coprocessor(CPUState *cpu, gdb_get_reg_cb get_reg, gdb_set_reg_cb set_r= eg, int num_regs, const char *xml, int g_pos); =20 +#ifdef NEED_CPU_H +#include "cpu.h" + /* * The GDB remote protocol transfers values in target byte order. As * the gdbstub may be batching up several register values we always --=20 2.34.1 From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189821; cv=none; d=zohomail.com; s=zohoarc; b=aD2r6dki+GEfSgt4UeOhiWqZvlp/d4a+JalnhrTWU9mE8T9lhOwuyu4jkX0f1Hak00OmREyc6/KVFAMpYXXvvXP6BSTqK4O/pfpH0heZsqgG5oQjxoSwxZ1J8VHMXAgBp2c4ji1X4aFHbDyzs24OVB1PwO9hvbteWS8CEjL6neM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189821; h=Content-Type: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=o7ONNtZko/D7zxPBYYwgczl/QYapCZF+U7bzptFrlow=; b=Mp2+1+XUFBTjzqMhoOcuQ1bKdG1JTxtCeRPxreD2GYNzr/tTWfNMD48y/ZyZ2MfaOFBryUAkW6KKTu+H3l0pawWw7+ouao40/7k6p1hMCh8UsPlHgpQZPcOopIUi2EgCrP5Bujgv3hT3ADjtK/nrRnSNR4efS/iQroTWOzGkLbk= 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 167118982105445.142249083528895; Fri, 16 Dec 2022 03:23:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68nB-00024b-0D; Fri, 16 Dec 2022 06:22:17 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68n7-00021p-3h for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:13 -0500 Received: from mail-wm1-x32d.google.com ([2a00:1450:4864:20::32d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1p68n4-00067W-Ch for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:12 -0500 Received: by mail-wm1-x32d.google.com with SMTP id h8-20020a1c2108000000b003d1efd60b65so3930380wmh.0 for ; Fri, 16 Dec 2022 03:22:09 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id az13-20020a05600c600d00b003c6bd12ac27sm2329980wmb.37.2022.12.16.03.22.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:07 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 462D91FFBC; Fri, 16 Dec 2022 11:22:07 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=o7ONNtZko/D7zxPBYYwgczl/QYapCZF+U7bzptFrlow=; b=fmz19iOT/CC4P4/jKWqmobA+vICz6o4EG/SM2dnDCgkZa08kdYRLn53AH22Mpf4cc7 JuVZ2NIW11jQIqyv1CrBKgW/9metTqIkh7TB1vWo964pTMC2v+EROI/3dvN7dtXcvzmW pThL1bBodcyC/SaK9bfmale0YmyDgdIedFWCJqskbZ/jvC88DFtQE9RmQI11RsxIsagE 81EqwTetEvK+5WrK/2bmiahobQgT031ejH9gb77z95mstFP0meCzGYIE1B3IElRVHpqW SwuEejBCI1ofuRvvwh6Z8HWIwOD6oTKlu1FHNOrXYiCiONn3IMVZmR1ApQybpvVMqZ0D 32tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=o7ONNtZko/D7zxPBYYwgczl/QYapCZF+U7bzptFrlow=; b=SlqJjxMQ3M3DBQCST7ftZb3puYuQjhA9zKUPuhyGo/rzDcrRCdXi5TMWYjWE1/7IGv JahKSKoo3xNdYs3PaAd0DcsoRLv0p/avd5EFGbBZaJbnDSetTuaLonyOCO+TtqU/oHKr 0cQlArltQ9S0spdJzkF+z6Z6rB5vP8lbPKpgZGhJTtaF4ILWl6MAXlyJBXm0zp9pGWJe NbIAy5hpwQCTKW6nb2ukKFlHmcYvMeAGH5kNreifkCSEkES8U00LajV16lHPQnX1Bo62 uVWm/YnU0TFYEy/zcgu5fgNo/sypafgRW+7DWsHtW898bd/JxGJW+lEpYBdThHNsy6z9 wqjw== X-Gm-Message-State: ANoB5pnUMDoxPq3Ktv+rXJDeY1FvPlBRhamA7QR6l1NnXd5zf7LTq9Fm i5YhBzc02ZaEyfGEMmFlZOPFrA== X-Google-Smtp-Source: AA0mqf5nvky0erekedvBS0A/v0HeQuaJj/z1s52MSgZ+kdu7DSRh8eCa6Ba8WaOt+prBfDResEG7pQ== X-Received: by 2002:a05:600c:1d27:b0:3d2:27ba:dde0 with SMTP id l39-20020a05600c1d2700b003d227badde0mr15061502wms.33.1671189728918; Fri, 16 Dec 2022 03:22:08 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v1 04/10] gdbstub: split GDBConnection from main structure Date: Fri, 16 Dec 2022 11:22:00 +0000 Message-Id: <20221216112206.3171578-5-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::32d; envelope-from=alex.bennee@linaro.org; helo=mail-wm1-x32d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1671189823508100011 In preparation for moving user/softmmu specific bits from the main gdbstub file we need to separate the connection details to what will eventually become an anonymous pointer. Signed-off-by: Alex Benn=C3=A9e --- gdbstub/gdbstub.c | 99 +++++++++++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c index be88ca0d71..14ce911bf2 100644 --- a/gdbstub/gdbstub.c +++ b/gdbstub/gdbstub.c @@ -342,6 +342,20 @@ enum RSState { RS_CHKSUM1, RS_CHKSUM2, }; + +#ifdef CONFIG_USER_ONLY +typedef struct { + int fd; + char *socket_path; + int running_state; +} GDBConnection; +#else +typedef struct { + CharBackend chr; + Chardev *mon_chr; +} GDBConnection; +#endif + typedef struct GDBState { bool init; /* have we been initialised? */ CPUState *c_cpu; /* current CPU for step/continue ops */ @@ -354,14 +368,7 @@ typedef struct GDBState { int line_csum; /* checksum at the end of the packet */ GByteArray *last_packet; int signal; -#ifdef CONFIG_USER_ONLY - int fd; - char *socket_path; - int running_state; -#else - CharBackend chr; - Chardev *mon_chr; -#endif + GDBConnection *connection; bool multiprocess; GDBProcess *processes; int process_num; @@ -392,6 +399,12 @@ static void init_gdbserver_state(void) gdbserver_state.supported_sstep_flags =3D accel_supported_gdbstub_sste= p_flags(); gdbserver_state.sstep_flags =3D SSTEP_ENABLE | SSTEP_NOIRQ | SSTEP_NOT= IMER; gdbserver_state.sstep_flags &=3D gdbserver_state.supported_sstep_flags; + + /* + * The following is differs depending on USER/SOFTMMU, we just + * hid it in the typedef. + */ + gdbserver_state.connection =3D g_new(GDBConnection, 1); } =20 #ifndef CONFIG_USER_ONLY @@ -413,15 +426,17 @@ static int get_char(void) int ret; =20 for(;;) { - ret =3D recv(gdbserver_state.fd, &ch, 1, 0); + ret =3D recv(gdbserver_state.connection->fd, &ch, 1, 0); if (ret < 0) { - if (errno =3D=3D ECONNRESET) - gdbserver_state.fd =3D -1; - if (errno !=3D EINTR) + if (errno =3D=3D ECONNRESET) { + gdbserver_state.connection->fd =3D -1; + } + if (errno !=3D EINTR) { return -1; + } } else if (ret =3D=3D 0) { - close(gdbserver_state.fd); - gdbserver_state.fd =3D -1; + close(gdbserver_state.connection->fd); + gdbserver_state.connection->fd =3D -1; return -1; } else { break; @@ -480,7 +495,7 @@ static inline void gdb_continue(void) { =20 #ifdef CONFIG_USER_ONLY - gdbserver_state.running_state =3D 1; + gdbserver_state.connection->running_state =3D 1; trace_gdbstub_op_continue(); #else if (!runstate_needs_reset()) { @@ -509,7 +524,7 @@ static int gdb_continue_partial(char *newstates) cpu_single_step(cpu, gdbserver_state.sstep_flags); } } - gdbserver_state.running_state =3D 1; + gdbserver_state.connection->running_state =3D 1; #else int flag =3D 0; =20 @@ -561,7 +576,7 @@ static void put_buffer(const uint8_t *buf, int len) int ret; =20 while (len > 0) { - ret =3D send(gdbserver_state.fd, buf, len, 0); + ret =3D send(gdbserver_state.connection->fd, buf, len, 0); if (ret < 0) { if (errno !=3D EINTR) return; @@ -573,7 +588,7 @@ static void put_buffer(const uint8_t *buf, int len) #else /* XXX this blocks entire thread. Rewrite to use * qemu_chr_fe_write and background I/O callbacks */ - qemu_chr_fe_write_all(&gdbserver_state.chr, buf, len); + qemu_chr_fe_write_all(&gdbserver_state.connection->chr, buf, len); #endif } =20 @@ -2095,7 +2110,8 @@ static void handle_query_rcmd(GArray *params, void *u= ser_ctx) len =3D len / 2; hextomem(gdbserver_state.mem_buf, get_param(params, 0)->data, len); g_byte_array_append(gdbserver_state.mem_buf, &zero, 1); - qemu_chr_be_write(gdbserver_state.mon_chr, gdbserver_state.mem_buf->da= ta, + qemu_chr_be_write(gdbserver_state.connection->mon_chr, + gdbserver_state.mem_buf->data, gdbserver_state.mem_buf->len); put_packet("OK"); } @@ -3028,10 +3044,10 @@ void gdb_exit(int code) return; } #ifdef CONFIG_USER_ONLY - if (gdbserver_state.socket_path) { - unlink(gdbserver_state.socket_path); + if (gdbserver_state.connection->socket_path) { + unlink(gdbserver_state.connection->socket_path); } - if (gdbserver_state.fd < 0) { + if (gdbserver_state.connection->fd < 0) { return; } #endif @@ -3042,7 +3058,7 @@ void gdb_exit(int code) put_packet(buf); =20 #ifndef CONFIG_USER_ONLY - qemu_chr_fe_deinit(&gdbserver_state.chr, true); + qemu_chr_fe_deinit(&gdbserver_state.connection->chr, true); #endif } =20 @@ -3078,7 +3094,7 @@ gdb_handlesig(CPUState *cpu, int sig) char buf[256]; int n; =20 - if (!gdbserver_state.init || gdbserver_state.fd < 0) { + if (!gdbserver_state.init || gdbserver_state.connection->fd < 0) { return sig; } =20 @@ -3096,15 +3112,15 @@ gdb_handlesig(CPUState *cpu, int sig) } /* put_packet() might have detected that the peer terminated the connection. */ - if (gdbserver_state.fd < 0) { + if (gdbserver_state.connection->fd < 0) { return sig; } =20 sig =3D 0; gdbserver_state.state =3D RS_IDLE; - gdbserver_state.running_state =3D 0; - while (gdbserver_state.running_state =3D=3D 0) { - n =3D read(gdbserver_state.fd, buf, 256); + gdbserver_state.connection->running_state =3D 0; + while (gdbserver_state.connection->running_state =3D=3D 0) { + n =3D read(gdbserver_state.connection->fd, buf, 256); if (n > 0) { int i; =20 @@ -3115,9 +3131,9 @@ gdb_handlesig(CPUState *cpu, int sig) /* XXX: Connection closed. Should probably wait for another connection before continuing. */ if (n =3D=3D 0) { - close(gdbserver_state.fd); + close(gdbserver_state.connection->fd); } - gdbserver_state.fd =3D -1; + gdbserver_state.connection->fd =3D -1; return sig; } } @@ -3131,7 +3147,7 @@ void gdb_signalled(CPUArchState *env, int sig) { char buf[4]; =20 - if (!gdbserver_state.init || gdbserver_state.fd < 0) { + if (!gdbserver_state.init || gdbserver_state.connection->fd < 0) { return; } =20 @@ -3146,7 +3162,7 @@ static void gdb_accept_init(int fd) gdbserver_state.processes[0].attached =3D true; gdbserver_state.c_cpu =3D gdb_first_attached_cpu(); gdbserver_state.g_cpu =3D gdbserver_state.c_cpu; - gdbserver_state.fd =3D fd; + gdbserver_state.connection->fd =3D fd; gdb_has_xml =3D false; } =20 @@ -3278,7 +3294,7 @@ int gdbserver_start(const char *port_or_path) if (port > 0 && gdb_accept_tcp(gdb_fd)) { return 0; } else if (gdb_accept_socket(gdb_fd)) { - gdbserver_state.socket_path =3D g_strdup(port_or_path); + gdbserver_state.connection->socket_path =3D g_strdup(port_or_path); return 0; } =20 @@ -3290,11 +3306,11 @@ int gdbserver_start(const char *port_or_path) /* Disable gdb stub for child processes. */ void gdbserver_fork(CPUState *cpu) { - if (!gdbserver_state.init || gdbserver_state.fd < 0) { + if (!gdbserver_state.init || gdbserver_state.connection->fd < 0) { return; } - close(gdbserver_state.fd); - gdbserver_state.fd =3D -1; + close(gdbserver_state.connection->fd); + gdbserver_state.connection->fd =3D -1; cpu_breakpoint_remove_all(cpu, BP_GDB); cpu_watchpoint_remove_all(cpu, BP_GDB); } @@ -3488,21 +3504,22 @@ int gdbserver_start(const char *device) NULL, NULL, &error_abort); monitor_init_hmp(mon_chr, false, &error_abort); } else { - qemu_chr_fe_deinit(&gdbserver_state.chr, true); - mon_chr =3D gdbserver_state.mon_chr; + qemu_chr_fe_deinit(&gdbserver_state.connection->chr, true); + mon_chr =3D gdbserver_state.connection->mon_chr; reset_gdbserver_state(); } =20 create_processes(&gdbserver_state); =20 if (chr) { - qemu_chr_fe_init(&gdbserver_state.chr, chr, &error_abort); - qemu_chr_fe_set_handlers(&gdbserver_state.chr, gdb_chr_can_receive, + qemu_chr_fe_init(&gdbserver_state.connection->chr, chr, &error_abo= rt); + qemu_chr_fe_set_handlers(&gdbserver_state.connection->chr, + gdb_chr_can_receive, gdb_chr_receive, gdb_chr_event, NULL, &gdbserver_state, NULL, true); } gdbserver_state.state =3D chr ? RS_IDLE : RS_INACTIVE; - gdbserver_state.mon_chr =3D mon_chr; + gdbserver_state.connection->mon_chr =3D mon_chr; gdbserver_state.current_syscall_cb =3D NULL; =20 return 0; --=20 2.34.1 From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189838; cv=none; d=zohomail.com; s=zohoarc; b=eP3clvKpn17DBdkH13mLKIJ51kaKOMnfxZLcCmQmR4fq5V8bQvaL/aXO0p7ZndOstaT8M+CGjnkWYb3GbQhxcOqE+WqckYkI8P37eo/KXMejywf813YE3LcJzC3ezzeu5q8iAVI0zjW4OE3K7cm5pRebTnn0Md28F4bEl6vd6Sw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189838; h=Content-Type: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=82WvPkb7AS72H/SR2TFZc7iBeZJJjIKUngbd6FjrBjM=; b=NbbM1aogIHPVikQbXoIC9ONRwMl+0Z/6FsBCsOzSlS2pnWXzNqOUgfU37RjbtmFhyEE/53WI2YCHWinDmVTMI7HMUly31Xw2udnig9dYrMu7Iv/P46WVmmspjcmJX5vj8UoiCV2SWISqhNNgpRb1v1Ot8SwbtwilvhFEkIRLzBc= 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 167118983844824.932456333858113; Fri, 16 Dec 2022 03:23:58 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68n9-00023Z-Q2; Fri, 16 Dec 2022 06:22:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68n7-00022H-Jr for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:13 -0500 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1p68n5-00067p-Ox for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:13 -0500 Received: by mail-wr1-x435.google.com with SMTP id h12so2139262wrv.10 for ; Fri, 16 Dec 2022 03:22:11 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id l9-20020adfa389000000b00241c4bd6c09sm2088552wrb.33.2022.12.16.03.22.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:09 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 606811FFBD; Fri, 16 Dec 2022 11:22:07 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=82WvPkb7AS72H/SR2TFZc7iBeZJJjIKUngbd6FjrBjM=; b=MQPzy9zoCX2J08DHzsUEzEXjEzA1n1GqPtNwWhnNN/Bcq8YqlAimwap0vs5ToKnP91 IrWZUukpkLzoxLs2rIVraKbBMCyJz3AmmLNtwWrePx9t8Rse3pZSmNOX7cwTN8H7S7hm 0eTzLkyR5feWSjIj6Ctns/CusEECY+WR7JqTjzwFLa6jLCv5N0j9jzaAipRh0RXk9abU aGSH1S6zi0CKpE3t/+TaSvnR3Y49seTaLDyEZkmjHLPZd8hQNQwQPyoYRCw3rcG7u9Tf 8ntGq6SEURQpCvvviK76ilpKIYDCVfBChP94upBr4aMFe04OLPVIkLh4Fpy3OxThB3Qp FD5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=82WvPkb7AS72H/SR2TFZc7iBeZJJjIKUngbd6FjrBjM=; b=SHraNYatK6Xqz31wUxM4hk5C18ghGtsFHHkVIqB/6RLW1IUwWlaM6WInqqO/BdeukM x1Y62wJ54obaYwDCJYD5P7jawQvLhOHjmy41LSvhpkH1avcEg/rWzLqfFzfV76S6jCsY Ki7hs03WvMe9vGkd0mjcNcPV4Wl37WRNp+JBCXxyLQf8G9RcBJ8Y/Bloprtj+0+S6082 FT8qrQqLy1jM5RIPCIt8cMqddlPuE2jPPrNmsVx2aibsuU1Z7F4bF4pGehlmK+TxuFKo ooJ3NPfHR7/B5mBqb+bacyI7Igu5j6LwdVQtkB1QFxNCpxIstn+dC3YAf08PDzV8zLOO x0Aw== X-Gm-Message-State: ANoB5plhFOPdiJl5iMXSxpGtTcShhvF6v9HlumuVam6KMCX3FakgbBWi 0ilvWetlPvlbddVnYViRTGxTng== X-Google-Smtp-Source: AA0mqf5Rt9r/XOwRAJyvfQrV/nQvzxZqlqwwYWU6RS9dxEQ5olb8JaNSdKOhQJUT+t5h++YoRVzMlQ== X-Received: by 2002:adf:e708:0:b0:242:728a:fa7 with SMTP id c8-20020adfe708000000b00242728a0fa7mr21641873wrm.61.1671189730292; Fri, 16 Dec 2022 03:22:10 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v1 05/10] gdbstub: move GDBState to shared internals header Date: Fri, 16 Dec 2022 11:22:01 +0000 Message-Id: <20221216112206.3171578-6-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::435; envelope-from=alex.bennee@linaro.org; helo=mail-wr1-x435.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1671189839819100005 We are about to split softmmu and user mode helpers into different files. To facilitate this we will need to share access to the GDBState between those files. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson --- gdbstub/internals.h | 53 +++++++++++++++++++++++++++++++++++++++++++++ gdbstub/gdbstub.c | 47 ++-------------------------------------- 2 files changed, 55 insertions(+), 45 deletions(-) diff --git a/gdbstub/internals.h b/gdbstub/internals.h index b444f24ef5..462a93e41c 100644 --- a/gdbstub/internals.h +++ b/gdbstub/internals.h @@ -9,6 +9,59 @@ #ifndef GDBSTUB_INTERNALS_H #define GDBSTUB_INTERNALS_H =20 +#define MAX_PACKET_LENGTH 4096 + +/* + * Shared structures and definitions + */ + +typedef struct GDBProcess { + uint32_t pid; + bool attached; + + char target_xml[1024]; +} GDBProcess; + +enum RSState { + RS_INACTIVE, + RS_IDLE, + RS_GETLINE, + RS_GETLINE_ESC, + RS_GETLINE_RLE, + RS_CHKSUM1, + RS_CHKSUM2, +}; + +typedef struct GDBConnection GDBConnection; + +typedef struct GDBState { + bool init; /* have we been initialised? */ + CPUState *c_cpu; /* current CPU for step/continue ops */ + CPUState *g_cpu; /* current CPU for other ops */ + CPUState *query_cpu; /* for q{f|s}ThreadInfo */ + enum RSState state; /* parsing state */ + char line_buf[MAX_PACKET_LENGTH]; + int line_buf_index; + int line_sum; /* running checksum */ + int line_csum; /* checksum at the end of the packet */ + GByteArray *last_packet; + int signal; + GDBConnection *connection; + bool multiprocess; + GDBProcess *processes; + int process_num; + char syscall_buf[256]; + gdb_syscall_complete_cb current_syscall_cb; + GString *str_buf; + GByteArray *mem_buf; + int sstep_flags; + int supported_sstep_flags; +} GDBState; + +/* + * Break/Watch point support - there is an implementation for softmmu + * and user mode. + */ bool gdb_supports_guest_debug(void); int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len); int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr len); diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c index 14ce911bf2..bc43aaf825 100644 --- a/gdbstub/gdbstub.c +++ b/gdbstub/gdbstub.c @@ -41,8 +41,6 @@ #include "hw/boards.h" #endif =20 -#define MAX_PACKET_LENGTH 4096 - #include "qemu/sockets.h" #include "sysemu/hw_accel.h" #include "sysemu/runstate.h" @@ -326,60 +324,19 @@ typedef struct GDBRegisterState { struct GDBRegisterState *next; } GDBRegisterState; =20 -typedef struct GDBProcess { - uint32_t pid; - bool attached; - - char target_xml[1024]; -} GDBProcess; - -enum RSState { - RS_INACTIVE, - RS_IDLE, - RS_GETLINE, - RS_GETLINE_ESC, - RS_GETLINE_RLE, - RS_CHKSUM1, - RS_CHKSUM2, -}; - #ifdef CONFIG_USER_ONLY -typedef struct { +typedef struct GDBConnection { int fd; char *socket_path; int running_state; } GDBConnection; #else -typedef struct { +typedef struct GDBConnection { CharBackend chr; Chardev *mon_chr; } GDBConnection; #endif =20 -typedef struct GDBState { - bool init; /* have we been initialised? */ - CPUState *c_cpu; /* current CPU for step/continue ops */ - CPUState *g_cpu; /* current CPU for other ops */ - CPUState *query_cpu; /* for q{f|s}ThreadInfo */ - enum RSState state; /* parsing state */ - char line_buf[MAX_PACKET_LENGTH]; - int line_buf_index; - int line_sum; /* running checksum */ - int line_csum; /* checksum at the end of the packet */ - GByteArray *last_packet; - int signal; - GDBConnection *connection; - bool multiprocess; - GDBProcess *processes; - int process_num; - char syscall_buf[256]; - gdb_syscall_complete_cb current_syscall_cb; - GString *str_buf; - GByteArray *mem_buf; - int sstep_flags; - int supported_sstep_flags; -} GDBState; - static GDBState gdbserver_state; =20 static void init_gdbserver_state(void) --=20 2.34.1 From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189844; cv=none; d=zohomail.com; s=zohoarc; b=LFrIWEbYhATwX0pYRdy/VhN2ScNGMxTdgP5gV8nCgwPTnY5iLh37wWEiYTmK2UmOgIQ87VIN5hTwWwwHCqsWEHguY0L8L3yNLrkJdfd2W4lLRXSVf2WMzRsnpoza+LQtr/ghC4lyt/6eitQf6dJb+fXbdCDL3e1T2MlQQkPHtqg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189844; h=Content-Type: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=2SnyGDlnuhSa055HYEbK0Sz9hf/vlp1eR2l+Jrskvn4=; b=hrMTsyxxPq6ALXKfwpV695bN0pRI8Psosmphzji3noLgP6vega3Ozft6RP2J5fj77AX3e7qLVf6vzfXAOnyETEN8ggvPZdv2j3ztiPr19AbhWTendEoMFSxMDnOK+gHTMMmwDZxbSRhbehuz+JxJrOv0nPMNiIkaCPSqkdOCL/E= 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 1671189844167784.8728864556263; Fri, 16 Dec 2022 03:24:04 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68nB-00024z-LA; Fri, 16 Dec 2022 06:22:17 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68n9-00023O-Bg for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:15 -0500 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1p68n7-00068L-5E for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:15 -0500 Received: by mail-wm1-x32f.google.com with SMTP id f13-20020a1cc90d000000b003d08c4cf679so1493183wmb.5 for ; Fri, 16 Dec 2022 03:22:12 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id y18-20020a5d4ad2000000b002365cd93d05sm2037892wrs.102.2022.12.16.03.22.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:09 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 9609F1FFBE; Fri, 16 Dec 2022 11:22:07 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=2SnyGDlnuhSa055HYEbK0Sz9hf/vlp1eR2l+Jrskvn4=; b=toU0Z5Hy8gTq7fEgcVP5qKn9iNVH4hXTYVexolQQ5czTj17ajtOfYlf3PiuT6ZwzaF LmCE+siDDG+g9iU9kbgDu+WQlOt3Sk2VT6M4tv0Xs3FuKgxXtjDeBrBDL5fS+Hkus0Zo Hom19g7tRo/NOiIoN+R5pGmpRqH1mrDqY1/Pf2HfRY+ge82xyEjgAbvbGZ76EnA26rzB SvzA4JmZlbZ2gp8VQUUrgGUiF2xeVemhJypZCc+gSp6+koveBb/HnFqL5P4rz3NfJsOK AoTiRbSPk0MYpctkRlZTEA4u1If8EHemxw85Lde5PaJtn3qXDyEeShYvvbuja5AV3jk1 40vA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=2SnyGDlnuhSa055HYEbK0Sz9hf/vlp1eR2l+Jrskvn4=; b=P6GGWyaUDjIVjmCx/peLdQSBFDmLaMw4+hOLPckrLTHM0F16QvomLbN36igDWBbIhC LsjAKW8hvvEUuFSUo+8W/nVfjhdVnLzyAdgGYO59DAG5cB88aDsEPblxw69aNzRt/xw+ Bd1sWGdqwdMZljs0RDTK8sDjMfodCJ3aEyvfYPHaOnp2nQlXwtpAUATVNf/dOwYa06wM 36En8k8ir9et1OWWDRJY8u80whVyAWNLSy1kPb+FxzSXbMiqCw2eeHdnqHteX8TfsFWd JJHGFRoMJzeS6tAa2K8lfdq9C+uHXdWgAOJUVZLFGoSZ4ld4xB20HalTTFdIax3cVS/d lGLw== X-Gm-Message-State: AFqh2kqs314Sz6zJYsYEmJcmHDRGlbG4lB1WEBOG41/5yiINETWmPH4v gc7H2fu4t38P0BqQiUeoIIXSng== X-Google-Smtp-Source: AMrXdXvAMmjDH59U59uabmcl3Ymbtz8IdY22Cgkp6ejaaF+apdNDrZqm04F2VBtMf4j5u4mGGFfpLQ== X-Received: by 2002:a1c:f710:0:b0:3d3:3a9d:2fe with SMTP id v16-20020a1cf710000000b003d33a9d02femr4452727wmh.6.1671189731517; Fri, 16 Dec 2022 03:22:11 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Richard Henderson , Paolo Bonzini , Eduardo Habkost , Marcel Apfelbaum , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yanan Wang , Daniel Henrique Barboza , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , David Gibson , Greg Kurz , Laurent Vivier , Alexandre Iooss , Mahmoud Mandour , Palmer Dabbelt , Alistair Francis , Bin Meng , qemu-ppc@nongnu.org (open list:sPAPR (pseries)), qemu-riscv@nongnu.org (open list:RISC-V TCG CPUs) Subject: [PATCH v1 06/10] includes: move tb_flush into its own header Date: Fri, 16 Dec 2022 11:22:02 +0000 Message-Id: <20221216112206.3171578-7-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::32f; envelope-from=alex.bennee@linaro.org; helo=mail-wm1-x32f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1671189845856100006 This aids subsystems (like gdbstub) that want to trigger a flush without pulling target specific headers. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson --- v2 - actually include the header and rename to tb-flush.h --- include/exec/exec-all.h | 1 - include/exec/tb-flush.h | 19 +++++++++++++++++++ linux-user/user-internals.h | 1 + accel/stubs/tcg-stub.c | 1 + accel/tcg/tb-maint.c | 1 + accel/tcg/translate-all.c | 1 + cpu.c | 1 + gdbstub/gdbstub.c | 1 + hw/ppc/spapr_hcall.c | 1 + plugins/core.c | 1 + plugins/loader.c | 2 +- target/alpha/sys_helper.c | 1 + target/riscv/csr.c | 1 + 13 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 include/exec/tb-flush.h diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index 9b7bfbf09a..6be541a85f 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -648,7 +648,6 @@ void tb_invalidate_phys_addr(target_ulong addr); #else void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs att= rs); #endif -void tb_flush(CPUState *cpu); void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr); void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end); void tb_set_jmp_target(TranslationBlock *tb, int n, uintptr_t addr); diff --git a/include/exec/tb-flush.h b/include/exec/tb-flush.h new file mode 100644 index 0000000000..fb094a9502 --- /dev/null +++ b/include/exec/tb-flush.h @@ -0,0 +1,19 @@ +/* + * tb-flush prototype for use by the rest of the system. + * + * Copyright (c) 2022 Linaro Ltd + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef _TB_FLUSH_H_ +#define _TB_FLUSH_H_ + +/* + * The following tb helpers don't require the caller to have any + * target specific knowledge (CPUState can be treated as an anonymous + * pointer for most). + */ + +void tb_flush(CPUState *cpu); + +#endif /* _TB_FLUSH_H_ */ diff --git a/linux-user/user-internals.h b/linux-user/user-internals.h index 0280e76add..ea11549c41 100644 --- a/linux-user/user-internals.h +++ b/linux-user/user-internals.h @@ -20,6 +20,7 @@ =20 #include "exec/user/thunk.h" #include "exec/exec-all.h" +#include "exec/tb-flush.h" #include "qemu/log.h" =20 extern char *exec_path; diff --git a/accel/stubs/tcg-stub.c b/accel/stubs/tcg-stub.c index c1b05767c0..e0d371c3a7 100644 --- a/accel/stubs/tcg-stub.c +++ b/accel/stubs/tcg-stub.c @@ -11,6 +11,7 @@ */ =20 #include "qemu/osdep.h" +#include "exec/tb-flush.h" #include "exec/exec-all.h" =20 void tb_flush(CPUState *cpu) diff --git a/accel/tcg/tb-maint.c b/accel/tcg/tb-maint.c index 0cdb35548c..4610208fe8 100644 --- a/accel/tcg/tb-maint.c +++ b/accel/tcg/tb-maint.c @@ -21,6 +21,7 @@ #include "exec/cputlb.h" #include "exec/log.h" #include "exec/exec-all.h" +#include "exec/tb-flush.h" #include "exec/translate-all.h" #include "sysemu/tcg.h" #include "tcg/tcg.h" diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index ac3ee3740c..eb8853a50c 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -47,6 +47,7 @@ #include "exec/cputlb.h" #include "exec/translate-all.h" #include "exec/translator.h" +#include "exec/tb-flush.h" #include "qemu/bitmap.h" #include "qemu/qemu-print.h" #include "qemu/timer.h" diff --git a/cpu.c b/cpu.c index 4a7d865427..1a374ac4a8 100644 --- a/cpu.c +++ b/cpu.c @@ -36,6 +36,7 @@ #include "sysemu/replay.h" #include "exec/cpu-common.h" #include "exec/exec-all.h" +#include "exec/tb-flush.h" #include "exec/translate-all.h" #include "exec/log.h" #include "hw/core/accel-cpu.h" diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c index bc43aaf825..28f97a55ea 100644 --- a/gdbstub/gdbstub.c +++ b/gdbstub/gdbstub.c @@ -46,6 +46,7 @@ #include "sysemu/runstate.h" #include "semihosting/semihost.h" #include "exec/exec-all.h" +#include "exec/tb-flush.h" #include "exec/hwaddr.h" #include "sysemu/replay.h" =20 diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 925ff523cc..ec4def62f8 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -8,6 +8,7 @@ #include "qemu/module.h" #include "qemu/error-report.h" #include "exec/exec-all.h" +#include "exec/tb-flush.h" #include "helper_regs.h" #include "hw/ppc/ppc.h" #include "hw/ppc/spapr.h" diff --git a/plugins/core.c b/plugins/core.c index ccb770a485..584b5f3c5e 100644 --- a/plugins/core.c +++ b/plugins/core.c @@ -24,6 +24,7 @@ #include "exec/cpu-common.h" =20 #include "exec/exec-all.h" +#include "exec/tb-flush.h" #include "exec/helper-proto.h" #include "tcg/tcg.h" #include "tcg/tcg-op.h" diff --git a/plugins/loader.c b/plugins/loader.c index 88c30bde2d..809f3f9b13 100644 --- a/plugins/loader.c +++ b/plugins/loader.c @@ -29,7 +29,7 @@ #include "qemu/plugin.h" #include "qemu/memalign.h" #include "hw/core/cpu.h" -#include "exec/exec-all.h" +#include "exec/tb-flush.h" #ifndef CONFIG_USER_ONLY #include "hw/boards.h" #endif diff --git a/target/alpha/sys_helper.c b/target/alpha/sys_helper.c index 25f6cb8894..c83c92dd4c 100644 --- a/target/alpha/sys_helper.c +++ b/target/alpha/sys_helper.c @@ -20,6 +20,7 @@ #include "qemu/osdep.h" #include "cpu.h" #include "exec/exec-all.h" +#include "exec/tb-flush.h" #include "exec/helper-proto.h" #include "sysemu/runstate.h" #include "sysemu/sysemu.h" diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 5c9a7ee287..b02a536bbc 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -25,6 +25,7 @@ #include "time_helper.h" #include "qemu/main-loop.h" #include "exec/exec-all.h" +#include "exec/tb-flush.h" #include "sysemu/cpu-timers.h" #include "qemu/guest-random.h" #include "qapi/error.h" --=20 2.34.1 From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189871; cv=none; d=zohomail.com; s=zohoarc; b=IshdPOIDv4JOTflwJnBA35DxunPVUEhKwPyr6QMLNAO33DWF6rWoJ5qtv2Byr7jH+/LEVGYH1orrdvZ6K4gLZHhukqXy7VhR+w3F2GqbRRFuV01xKMSuRLp6DnHwODeDmYLFw8mMxlwyVqF0lhKO3Gqu57d0qiMWQNbuF1VvzW8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189871; h=Content-Type: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=/7dX4oW2bf7HAdMmJshzEuL5X8vSI7l3I3jBaCAsCrI=; b=RzJU7NTbtaWVfvrmz3AdEDFBrGr7raIgM9UYcbEaAYc0CehiYYQInEdSR7/pPHjO/a4YNiXdEYCc8zTWn/dH+1n8VacrNIDPRAnKC7/g9eT/kqpxQfa6T4ZKcJZmMwsJ/prEaYWaZtdxdHmVq3RzC9l++1U/1b0bIBkqOufANBk= 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 1671189871396348.09714991640055; Fri, 16 Dec 2022 03:24:31 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68nA-000247-Li; Fri, 16 Dec 2022 06:22:16 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68n8-00022e-AK for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:14 -0500 Received: from mail-wm1-x32b.google.com ([2a00:1450:4864:20::32b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1p68n6-00067r-1K for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:13 -0500 Received: by mail-wm1-x32b.google.com with SMTP id ay14-20020a05600c1e0e00b003cf6ab34b61so3888783wmb.2 for ; Fri, 16 Dec 2022 03:22:11 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id k11-20020a05600c0b4b00b003c5571c27a1sm2590112wmr.32.2022.12.16.03.22.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:09 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id B216B1FFBF; Fri, 16 Dec 2022 11:22:07 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=/7dX4oW2bf7HAdMmJshzEuL5X8vSI7l3I3jBaCAsCrI=; b=NvjmaokLKYzq3cR4NhKE1XQGU1VPnimJzc3atR9iUrVWhZ9eS8NJRzK17mCOhlPgy6 TscSF/mNWdM7KF6jPnClFspFv1Rax8epYlghzNqTFqg3uNdaN3QgAloeGdvRy71GuNUv m/GOY7fVN0+CaWpjs6otwTL98pwtJxi5FxxNFXUpkcqZUm/S6dgK3i62y0hUxMiG7769 iGJB3NG3ivHfGfyS3IwRkYEYSxsqhskngXun50Bh7rPmRAwdZtal0Sh7OV4jSEVNzuqW PjWrrPvpi2D9wCepEIL3EVQ8VHkc4EPNzUN9aBrn/hA0rnW3Tf5NKdC9I2cK31jBrirj jTjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=/7dX4oW2bf7HAdMmJshzEuL5X8vSI7l3I3jBaCAsCrI=; b=ifsHIEoWi4hkzOuX/kXqCkr9aKXY71FKInHfn4WbnBOF3/w9ZZcbS4HAN/fxhP8AxH 4l6LH70j77FPvEDbLd5kgS8eOeS605VXee5UFi6sU2EjaIqp2BTzdIR15Lu69BhsFV8e PmzaIWVd7M8DJ58XdmBhuS89j9us9X8wMTYgpY1CToviE6unP6dnNf7LWcpNA8q/64Fh twXeSG0kjWuYLSqOpNP/qEa2yNHKdYQVTnJlfLhf/NGs5PW7cQtLujIu/LfGTUeFv5HP NRFsfe7qdtha7MDgnpnPuh4d5lOxsiaaOuwTZ1ksva69vhJjAOPSKLt/l4KUBiTHGhLM 5jjQ== X-Gm-Message-State: ANoB5pmJicLiwyI2/oHF39E3s+WNYKhKevEgOj0Tm0jy68cLBATyot6U g4SuJGWdcoQ7bMS4sc2y+xhG+rZ0k5+Xp2ip X-Google-Smtp-Source: AA0mqf4HIPgMKauT7D3a4g7/Gi4SujLEfQeXhEPZNKXrvL0kEVuRE4k4ymU3hFHo3ainWg3wsn33eQ== X-Received: by 2002:a05:600c:4f51:b0:3cf:d18e:528b with SMTP id m17-20020a05600c4f5100b003cfd18e528bmr25603833wmq.39.1671189730544; Fri, 16 Dec 2022 03:22:10 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v1 07/10] includes: add new gdbstub include directory Date: Fri, 16 Dec 2022 11:22:03 +0000 Message-Id: <20221216112206.3171578-8-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::32b; envelope-from=alex.bennee@linaro.org; helo=mail-wm1-x32b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1671189871961100001 To avoid having a messy set of include files containing system and user APIs lets prepare for a cleaner layout. Signed-off-by: Alex Benn=C3=A9e --- include/gdbstub/common.h | 14 ++++++++++++++ include/gdbstub/user.h | 14 ++++++++++++++ MAINTAINERS | 1 + 3 files changed, 29 insertions(+) create mode 100644 include/gdbstub/common.h create mode 100644 include/gdbstub/user.h diff --git a/include/gdbstub/common.h b/include/gdbstub/common.h new file mode 100644 index 0000000000..f928dbc487 --- /dev/null +++ b/include/gdbstub/common.h @@ -0,0 +1,14 @@ +/* + * gdbstub common APIs + * + * Copyright (c) 2022 Linaro Ltd + * + * SPDX-License-Identifier: LGPL-2.0+ + */ + +#ifndef GDBSTUB_COMMON_H +#define GDBSTUB_COMMON_H + + + +#endif /* GDBSTUB_COMMON_H */ diff --git a/include/gdbstub/user.h b/include/gdbstub/user.h new file mode 100644 index 0000000000..53baba65ff --- /dev/null +++ b/include/gdbstub/user.h @@ -0,0 +1,14 @@ +/* + * gdbstub user-mode only APIs + * + * Copyright (c) 2022 Linaro Ltd + * + * SPDX-License-Identifier: LGPL-2.0+ + */ + +#ifndef GDBSTUB_USER_H +#define GDBSTUB_USER_H + + + +#endif /* GDBSTUB_USER_H */ diff --git a/MAINTAINERS b/MAINTAINERS index 6966490c94..c84d9299c3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2698,6 +2698,7 @@ R: Philippe Mathieu-Daud=C3=A9 S: Maintained F: gdbstub/* F: include/exec/gdbstub.h +F: include/gdbstub/* F: gdb-xml/ F: tests/tcg/multiarch/gdbstub/ F: scripts/feature_to_c.sh --=20 2.34.1 From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189838; cv=none; d=zohomail.com; s=zohoarc; b=SvLDhG3fYm0fIXRVj8CH8kOrXaZr1afLRIARoL1Qa3W5E4ij8FYbhKtxtshjC2KiIebM2IMucIdFcSvt+SUltZgZg0EAcPlxtCNCnzMQJ42/KTaKmyUE6yGJDr7inLkh0v/+/udDa+3LNUBUfe8wLlwe5pNKq4Lmr3WgAGrUgio= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189838; h=Content-Type: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=zn2qZ2ED+XJpJJ6BWb3XW+ZOzHNM7ZYpmytU1qsqmpY=; b=G/8MAuhBIPJedB8BKT9AFPMCbhh6Kzzqh9KWNDK0D3AGs+zl6SEK/P/cq/4OLwv/fqzUu3QA62EpLINt/sjVhSFmZLq4AZldNbq96w4gSsK7ZUTiY7iiPJjiCqnqlDcProcrAloQnhuWjVE1nZ6J4/TCpQhKZ7jrp51T7TBdEq8= 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 1671189838979918.2911197357045; Fri, 16 Dec 2022 03:23:58 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68nE-00026e-Hm; Fri, 16 Dec 2022 06:22:20 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68nC-00025T-82 for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:18 -0500 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1p68n7-00068q-L8 for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:18 -0500 Received: by mail-wr1-x42a.google.com with SMTP id h12so2139348wrv.10 for ; Fri, 16 Dec 2022 03:22:13 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id w12-20020adff9cc000000b0023c8026841csm2041836wrr.23.2022.12.16.03.22.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:09 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id DE52A1FFB7; Fri, 16 Dec 2022 11:22:07 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=zn2qZ2ED+XJpJJ6BWb3XW+ZOzHNM7ZYpmytU1qsqmpY=; b=UHxmpCFdv1E1LxXT1pErtesi58tkFKwwmb/54xYMkorg9Ts+867FhVPw+/yUOtbG/X cgZqcWppUeV4PAXjHTph4rpk9bZlNE3gMLra7biQqYBvQNBJZOqWnsVaqvg09sKtKl80 5tX1TTAU9MSpCHFNeF4fkS8YGcRwRL/YV7RR/YKegH8FE6MFpItu9LgKwjcSl7da0I/+ usOMz2Fq2yaj8v5pbKVw4Djjfi0LpZJ0O6Sw4TsJDfPbDBDOBJIQ+qexyb1OHTAifEY4 hIC3Tl0LcgsKQDnl/X0uWtDugdGiYd/g1at99sdkEE9l/7jWtnNQd88GwpEsTMwPzYd5 9Qng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=zn2qZ2ED+XJpJJ6BWb3XW+ZOzHNM7ZYpmytU1qsqmpY=; b=RNBIZcXnQRV89tGqvdpmq1Q9qTVr+b6BjZkCsa27q68wDU+bZwgroAJxai3dESsOVB vxboIPyltkB55ynUNanAg9KKsm+OZbqdZyv6LZIZHYtQc02G/B9YdCJDFDGam7TbBQzh uQA+BRRY2hQG1/PuzizX3onf+HPG53KBO4aBhfgey6EwIMTlq/hrVvZOBYHKuYlVYxFf 3t5RMGcQRTwfxhR8ABE/j4zMUAYBXA6Pd2ZNWmgPeCMiiX7os5P7WnYmuOkX4pJIGgmG YfvskRpBDa2CcpTIVec+UDlAwGtom82MYUOGtnZm1X7H7hIaarP0pD4/agvHfiqsTxoJ JsAw== X-Gm-Message-State: ANoB5plSPP+nKXf3lcKuKQYpgbuDkWUXES6ZazC+pRfxk8+yW64CPqT/ 0Opf41lGLFFfOrnyVfSUQCGwXQ== X-Google-Smtp-Source: AA0mqf4XeZnuWcwpJW5RUixoUBRP7BOr78HAL765uG632sN2bufrgXV81JWLjlOjWedHMG1ckPqMVA== X-Received: by 2002:a5d:66c9:0:b0:242:5878:291e with SMTP id k9-20020a5d66c9000000b002425878291emr20107028wrw.51.1671189731791; Fri, 16 Dec 2022 03:22:11 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v1 08/10] gdbstub: move chunk of softmmu functionality to own file Date: Fri, 16 Dec 2022 11:22:04 +0000 Message-Id: <20221216112206.3171578-9-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::42a; envelope-from=alex.bennee@linaro.org; helo=mail-wr1-x42a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1671189839882100006 This is mostly code motion but a number of things needed to be done for this minimal patch set: - move shared structures to internals.h - convert some helpers to public gdb_ functions (via internals.h) - splitting some functions into user and softmmu versions - fixing a few casting issues to keep softmmu common More CONFIG_USER_ONLY stuff will be handled in a following patches. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Fabiano Rosas --- gdbstub/internals.h | 60 +++++ gdbstub/gdbstub.c | 618 ++++++++----------------------------------- gdbstub/softmmu.c | 420 +++++++++++++++++++++++++++++ gdbstub/trace-events | 4 +- 4 files changed, 595 insertions(+), 507 deletions(-) diff --git a/gdbstub/internals.h b/gdbstub/internals.h index 462a93e41c..50eac269c8 100644 --- a/gdbstub/internals.h +++ b/gdbstub/internals.h @@ -15,6 +15,18 @@ * Shared structures and definitions */ =20 +enum { + GDB_SIGNAL_0 =3D 0, + GDB_SIGNAL_INT =3D 2, + GDB_SIGNAL_QUIT =3D 3, + GDB_SIGNAL_TRAP =3D 5, + GDB_SIGNAL_ABRT =3D 6, + GDB_SIGNAL_ALRM =3D 14, + GDB_SIGNAL_IO =3D 23, + GDB_SIGNAL_XCPU =3D 24, + GDB_SIGNAL_UNKNOWN =3D 143 +}; + typedef struct GDBProcess { uint32_t pid; bool attached; @@ -34,6 +46,9 @@ enum RSState { =20 typedef struct GDBConnection GDBConnection; =20 +/* mode helper to initialise structure */ +GDBConnection *gdb_init_connection_data(void); + typedef struct GDBState { bool init; /* have we been initialised? */ CPUState *c_cpu; /* current CPU for step/continue ops */ @@ -58,6 +73,51 @@ typedef struct GDBState { int supported_sstep_flags; } GDBState; =20 +/* + * Connection helpers for both softmmu and user backends + */ +void gdb_put_buffer(const uint8_t *buf, int len); +int gdb_put_packet(const char *buf); +void gdb_hextomem(GByteArray *mem, const char *buf, int len); +void gdb_memtohex(GString *buf, const uint8_t *mem, int len); +void gdb_read_byte(uint8_t ch); + +/* utility helpers */ +CPUState *gdb_first_attached_cpu(void); +void gdb_append_thread_id(CPUState *cpu, GString *buf); +int gdb_get_cpu_index(CPUState *cpu); + +void gdb_create_default_process(GDBState *s); + +/* + * Command handlers - either softmmu or user only + */ +void gdb_init_gdbserver_state(void); + +typedef enum GDBThreadIdKind { + GDB_ONE_THREAD =3D 0, + GDB_ALL_THREADS, /* One process, all threads */ + GDB_ALL_PROCESSES, + GDB_READ_THREAD_ERR +} GDBThreadIdKind; + +typedef union GdbCmdVariant { + const char *data; + uint8_t opcode; + unsigned long val_ul; + unsigned long long val_ull; + struct { + GDBThreadIdKind kind; + uint32_t pid; + uint32_t tid; + } thread_id; +} GdbCmdVariant; + +#define get_param(p, i) (&g_array_index(p, GdbCmdVariant, i)) + +void gdb_handle_query_rcmd(GArray *params, void *user_ctx); /* softmmu */ + + /* * Break/Watch point support - there is an implementation for softmmu * and user mode. diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c index 28f97a55ea..ec4b6ac4e4 100644 --- a/gdbstub/gdbstub.c +++ b/gdbstub/gdbstub.c @@ -24,8 +24,6 @@ */ =20 #include "qemu/osdep.h" -#include "qapi/error.h" -#include "qemu/error-report.h" #include "qemu/ctype.h" #include "qemu/cutils.h" #include "qemu/module.h" @@ -34,9 +32,6 @@ #ifdef CONFIG_USER_ONLY #include "qemu.h" #else -#include "monitor/monitor.h" -#include "chardev/char.h" -#include "chardev/char-fe.h" #include "hw/cpu/cluster.h" #include "hw/boards.h" #endif @@ -85,32 +80,18 @@ static inline int target_memory_rw_debug(CPUState *cpu,= target_ulong addr, return cpu_memory_rw_debug(cpu, addr, buf, len, is_write); } =20 -/* Return the GDB index for a given vCPU state. +/* + * Return the GDB index for a given vCPU state. * - * For user mode this is simply the thread id. In system mode GDB - * numbers CPUs from 1 as 0 is reserved as an "any cpu" index. + * For user mode this is simply the thread id. */ -static inline int cpu_gdb_index(CPUState *cpu) -{ #if defined(CONFIG_USER_ONLY) +int gdb_get_cpu_index(CPUState *cpu) +{ TaskState *ts =3D (TaskState *) cpu->opaque; return ts ? ts->ts_tid : -1; -#else - return cpu->cpu_index + 1; -#endif } - -enum { - GDB_SIGNAL_0 =3D 0, - GDB_SIGNAL_INT =3D 2, - GDB_SIGNAL_QUIT =3D 3, - GDB_SIGNAL_TRAP =3D 5, - GDB_SIGNAL_ABRT =3D 6, - GDB_SIGNAL_ALRM =3D 14, - GDB_SIGNAL_IO =3D 23, - GDB_SIGNAL_XCPU =3D 24, - GDB_SIGNAL_UNKNOWN =3D 143 -}; +#endif =20 #ifdef CONFIG_USER_ONLY =20 @@ -331,16 +312,11 @@ typedef struct GDBConnection { char *socket_path; int running_state; } GDBConnection; -#else -typedef struct GDBConnection { - CharBackend chr; - Chardev *mon_chr; -} GDBConnection; #endif =20 -static GDBState gdbserver_state; +GDBState gdbserver_state; =20 -static void init_gdbserver_state(void) +void gdb_init_gdbserver_state(void) { g_assert(!gdbserver_state.init); memset(&gdbserver_state, 0, sizeof(GDBState)); @@ -362,17 +338,12 @@ static void init_gdbserver_state(void) * The following is differs depending on USER/SOFTMMU, we just * hid it in the typedef. */ +#ifdef CONFIG_USER_ONLY gdbserver_state.connection =3D g_new(GDBConnection, 1); -} - -#ifndef CONFIG_USER_ONLY -static void reset_gdbserver_state(void) -{ - g_free(gdbserver_state.processes); - gdbserver_state.processes =3D NULL; - gdbserver_state.process_num =3D 0; -} +#else + gdbserver_state.connection =3D gdb_init_connection_data(); #endif +} =20 bool gdb_has_xml; =20 @@ -528,9 +499,9 @@ static int gdb_continue_partial(char *newstates) return res; } =20 -static void put_buffer(const uint8_t *buf, int len) -{ #ifdef CONFIG_USER_ONLY +void gdb_put_buffer(const uint8_t *buf, int len) +{ int ret; =20 while (len > 0) { @@ -543,12 +514,8 @@ static void put_buffer(const uint8_t *buf, int len) len -=3D ret; } } -#else - /* XXX this blocks entire thread. Rewrite to use - * qemu_chr_fe_write and background I/O callbacks */ - qemu_chr_fe_write_all(&gdbserver_state.connection->chr, buf, len); -#endif } +#endif =20 static inline int fromhex(int v) { @@ -571,7 +538,7 @@ static inline int tohex(int v) } =20 /* writes 2*len+1 bytes in buf */ -static void memtohex(GString *buf, const uint8_t *mem, int len) +void gdb_memtohex(GString *buf, const uint8_t *mem, int len) { int i, c; for(i =3D 0; i < len; i++) { @@ -582,7 +549,7 @@ static void memtohex(GString *buf, const uint8_t *mem, = int len) g_string_append_c(buf, '\0'); } =20 -static void hextomem(GByteArray *mem, const char *buf, int len) +void gdb_hextomem(GByteArray *mem, const char *buf, int len) { int i; =20 @@ -651,7 +618,7 @@ static int put_packet_binary(const char *buf, int len, = bool dump) footer[2] =3D tohex((csum) & 0xf); g_byte_array_append(gdbserver_state.last_packet, footer, 3); =20 - put_buffer(gdbserver_state.last_packet->data, + gdb_put_buffer(gdbserver_state.last_packet->data, gdbserver_state.last_packet->len); =20 #ifdef CONFIG_USER_ONLY @@ -668,7 +635,7 @@ static int put_packet_binary(const char *buf, int len, = bool dump) } =20 /* return -1 if error, 0 if OK */ -static int put_packet(const char *buf) +int gdb_put_packet(const char *buf) { trace_gdbstub_io_reply(buf); =20 @@ -677,7 +644,7 @@ static int put_packet(const char *buf) =20 static void put_strbuf(void) { - put_packet(gdbserver_state.str_buf->str); + gdb_put_packet(gdbserver_state.str_buf->str); } =20 /* Encode data using the encoding for 'x' packets. */ @@ -738,7 +705,7 @@ static CPUState *find_cpu(uint32_t thread_id) CPUState *cpu; =20 CPU_FOREACH(cpu) { - if (cpu_gdb_index(cpu) =3D=3D thread_id) { + if (gdb_get_cpu_index(cpu) =3D=3D thread_id) { return cpu; } } @@ -792,7 +759,7 @@ static CPUState *gdb_next_attached_cpu(CPUState *cpu) } =20 /* Return the first attached cpu */ -static CPUState *gdb_first_attached_cpu(void) +CPUState *gdb_first_attached_cpu(void) { CPUState *cpu =3D first_cpu; GDBProcess *process =3D gdb_get_cpu_process(cpu); @@ -1006,23 +973,16 @@ static void gdb_set_cpu_pc(target_ulong pc) cpu_set_pc(cpu, pc); } =20 -static void gdb_append_thread_id(CPUState *cpu, GString *buf) +void gdb_append_thread_id(CPUState *cpu, GString *buf) { if (gdbserver_state.multiprocess) { g_string_append_printf(buf, "p%02x.%02x", - gdb_get_cpu_pid(cpu), cpu_gdb_index(cpu)); + gdb_get_cpu_pid(cpu), gdb_get_cpu_index(cpu= )); } else { - g_string_append_printf(buf, "%02x", cpu_gdb_index(cpu)); + g_string_append_printf(buf, "%02x", gdb_get_cpu_index(cpu)); } } =20 -typedef enum GDBThreadIdKind { - GDB_ONE_THREAD =3D 0, - GDB_ALL_THREADS, /* One process, all threads */ - GDB_ALL_PROCESSES, - GDB_READ_THREAD_ERR -} GDBThreadIdKind; - static GDBThreadIdKind read_thread_id(const char *buf, const char **end_bu= f, uint32_t *pid, uint32_t *tid) { @@ -1203,20 +1163,6 @@ out: return res; } =20 -typedef union GdbCmdVariant { - const char *data; - uint8_t opcode; - unsigned long val_ul; - unsigned long long val_ull; - struct { - GDBThreadIdKind kind; - uint32_t pid; - uint32_t tid; - } thread_id; -} GdbCmdVariant; - -#define get_param(p, i) (&g_array_index(p, GdbCmdVariant, i)) - static const char *cmd_next_param(const char *param, const char delimiter) { static const char all_delimiters[] =3D ",;:=3D"; @@ -1383,7 +1329,7 @@ static void run_cmd_parser(const char *data, const Gd= bCmdParseEntry *cmd) /* In case there was an error during the command parsing we must * send a NULL packet to indicate the command is not supported */ if (process_string_cmd(NULL, data, cmd, 1)) { - put_packet(""); + gdb_put_packet(""); } } =20 @@ -1394,7 +1340,7 @@ static void handle_detach(GArray *params, void *user_= ctx) =20 if (gdbserver_state.multiprocess) { if (!params->len) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 @@ -1418,7 +1364,7 @@ static void handle_detach(GArray *params, void *user_= ctx) gdb_syscall_mode =3D GDB_SYS_DISABLED; gdb_continue(); } - put_packet("OK"); + gdb_put_packet("OK"); } =20 static void handle_thread_alive(GArray *params, void *user_ctx) @@ -1426,23 +1372,23 @@ static void handle_thread_alive(GArray *params, voi= d *user_ctx) CPUState *cpu; =20 if (!params->len) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 if (get_param(params, 0)->thread_id.kind =3D=3D GDB_READ_THREAD_ERR) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 cpu =3D gdb_get_cpu(get_param(params, 0)->thread_id.pid, get_param(params, 0)->thread_id.tid); if (!cpu) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 - put_packet("OK"); + gdb_put_packet("OK"); } =20 static void handle_continue(GArray *params, void *user_ctx) @@ -1479,24 +1425,24 @@ static void handle_set_thread(GArray *params, void = *user_ctx) CPUState *cpu; =20 if (params->len !=3D 2) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 if (get_param(params, 1)->thread_id.kind =3D=3D GDB_READ_THREAD_ERR) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 if (get_param(params, 1)->thread_id.kind !=3D GDB_ONE_THREAD) { - put_packet("OK"); + gdb_put_packet("OK"); return; } =20 cpu =3D gdb_get_cpu(get_param(params, 1)->thread_id.pid, get_param(params, 1)->thread_id.tid); if (!cpu) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 @@ -1507,14 +1453,14 @@ static void handle_set_thread(GArray *params, void = *user_ctx) switch (get_param(params, 0)->opcode) { case 'c': gdbserver_state.c_cpu =3D cpu; - put_packet("OK"); + gdb_put_packet("OK"); break; case 'g': gdbserver_state.g_cpu =3D cpu; - put_packet("OK"); + gdb_put_packet("OK"); break; default: - put_packet("E22"); + gdb_put_packet("E22"); break; } } @@ -1524,7 +1470,7 @@ static void handle_insert_bp(GArray *params, void *us= er_ctx) int res; =20 if (params->len !=3D 3) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 @@ -1533,14 +1479,14 @@ static void handle_insert_bp(GArray *params, void *= user_ctx) get_param(params, 1)->val_ull, get_param(params, 2)->val_ull); if (res >=3D 0) { - put_packet("OK"); + gdb_put_packet("OK"); return; } else if (res =3D=3D -ENOSYS) { - put_packet(""); + gdb_put_packet(""); return; } =20 - put_packet("E22"); + gdb_put_packet("E22"); } =20 static void handle_remove_bp(GArray *params, void *user_ctx) @@ -1548,7 +1494,7 @@ static void handle_remove_bp(GArray *params, void *us= er_ctx) int res; =20 if (params->len !=3D 3) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 @@ -1557,14 +1503,14 @@ static void handle_remove_bp(GArray *params, void *= user_ctx) get_param(params, 1)->val_ull, get_param(params, 2)->val_ull); if (res >=3D 0) { - put_packet("OK"); + gdb_put_packet("OK"); return; } else if (res =3D=3D -ENOSYS) { - put_packet(""); + gdb_put_packet(""); return; } =20 - put_packet("E22"); + gdb_put_packet("E22"); } =20 /* @@ -1583,20 +1529,20 @@ static void handle_set_reg(GArray *params, void *us= er_ctx) int reg_size; =20 if (!gdb_has_xml) { - put_packet(""); + gdb_put_packet(""); return; } =20 if (params->len !=3D 2) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 reg_size =3D strlen(get_param(params, 1)->data) / 2; - hextomem(gdbserver_state.mem_buf, get_param(params, 1)->data, reg_size= ); + gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 1)->data, reg_= size); gdb_write_register(gdbserver_state.g_cpu, gdbserver_state.mem_buf->dat= a, get_param(params, 0)->val_ull); - put_packet("OK"); + gdb_put_packet("OK"); } =20 static void handle_get_reg(GArray *params, void *user_ctx) @@ -1604,12 +1550,12 @@ static void handle_get_reg(GArray *params, void *us= er_ctx) int reg_size; =20 if (!gdb_has_xml) { - put_packet(""); + gdb_put_packet(""); return; } =20 if (!params->len) { - put_packet("E14"); + gdb_put_packet("E14"); return; } =20 @@ -1617,53 +1563,53 @@ static void handle_get_reg(GArray *params, void *us= er_ctx) gdbserver_state.mem_buf, get_param(params, 0)->val_ull); if (!reg_size) { - put_packet("E14"); + gdb_put_packet("E14"); return; } else { g_byte_array_set_size(gdbserver_state.mem_buf, reg_size); } =20 - memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, reg_s= ize); + gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, r= eg_size); put_strbuf(); } =20 static void handle_write_mem(GArray *params, void *user_ctx) { if (params->len !=3D 3) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 - /* hextomem() reads 2*len bytes */ + /* gdb_hextomem() reads 2*len bytes */ if (get_param(params, 1)->val_ull > strlen(get_param(params, 2)->data) / 2) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 - hextomem(gdbserver_state.mem_buf, get_param(params, 2)->data, + gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 2)->data, get_param(params, 1)->val_ull); if (target_memory_rw_debug(gdbserver_state.g_cpu, get_param(params, 0)->val_ull, gdbserver_state.mem_buf->data, gdbserver_state.mem_buf->len, true)) { - put_packet("E14"); + gdb_put_packet("E14"); return; } =20 - put_packet("OK"); + gdb_put_packet("OK"); } =20 static void handle_read_mem(GArray *params, void *user_ctx) { if (params->len !=3D 2) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 - /* memtohex() doubles the required space */ + /* gdb_memtohex() doubles the required space */ if (get_param(params, 1)->val_ull > MAX_PACKET_LENGTH / 2) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 @@ -1674,11 +1620,11 @@ static void handle_read_mem(GArray *params, void *u= ser_ctx) get_param(params, 0)->val_ull, gdbserver_state.mem_buf->data, gdbserver_state.mem_buf->len, false)) { - put_packet("E14"); + gdb_put_packet("E14"); return; } =20 - memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, + gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, gdbserver_state.mem_buf->len); put_strbuf(); } @@ -1695,7 +1641,7 @@ static void handle_write_all_regs(GArray *params, voi= d *user_ctx) =20 cpu_synchronize_state(gdbserver_state.g_cpu); len =3D strlen(get_param(params, 0)->data) / 2; - hextomem(gdbserver_state.mem_buf, get_param(params, 0)->data, len); + gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 0)->data, len); registers =3D gdbserver_state.mem_buf->data; for (addr =3D 0; addr < gdbserver_state.g_cpu->gdb_num_g_regs && len >= 0; addr++) { @@ -1703,7 +1649,7 @@ static void handle_write_all_regs(GArray *params, voi= d *user_ctx) len -=3D reg_size; registers +=3D reg_size; } - put_packet("OK"); + gdb_put_packet("OK"); } =20 static void handle_read_all_regs(GArray *params, void *user_ctx) @@ -1720,7 +1666,7 @@ static void handle_read_all_regs(GArray *params, void= *user_ctx) } g_assert(len =3D=3D gdbserver_state.mem_buf->len); =20 - memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, len); + gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, l= en); put_strbuf(); } =20 @@ -1772,7 +1718,7 @@ static void handle_file_io(GArray *params, void *user= _ctx) } =20 if (params->len >=3D 3 && get_param(params, 2)->opcode =3D=3D (uint8_t= )'C') { - put_packet("T02"); + gdb_put_packet("T02"); return; } =20 @@ -1792,7 +1738,7 @@ static void handle_step(GArray *params, void *user_ct= x) static void handle_backward(GArray *params, void *user_ctx) { if (!stub_can_reverse()) { - put_packet("E22"); + gdb_put_packet("E22"); } if (params->len =3D=3D 1) { switch (get_param(params, 0)->opcode) { @@ -1800,26 +1746,26 @@ static void handle_backward(GArray *params, void *u= ser_ctx) if (replay_reverse_step()) { gdb_continue(); } else { - put_packet("E14"); + gdb_put_packet("E14"); } return; case 'c': if (replay_reverse_continue()) { gdb_continue(); } else { - put_packet("E14"); + gdb_put_packet("E14"); } return; } } =20 /* Default invalid command */ - put_packet(""); + gdb_put_packet(""); } =20 static void handle_v_cont_query(GArray *params, void *user_ctx) { - put_packet("vCont;c;C;s;S"); + gdb_put_packet("vCont;c;C;s;S"); } =20 static void handle_v_cont(GArray *params, void *user_ctx) @@ -1832,9 +1778,9 @@ static void handle_v_cont(GArray *params, void *user_= ctx) =20 res =3D gdb_handle_vcont(get_param(params, 0)->data); if ((res =3D=3D -EINVAL) || (res =3D=3D -ERANGE)) { - put_packet("E22"); + gdb_put_packet("E22"); } else if (res) { - put_packet(""); + gdb_put_packet(""); } } =20 @@ -1872,7 +1818,7 @@ cleanup: static void handle_v_kill(GArray *params, void *user_ctx) { /* Kill the target */ - put_packet("OK"); + gdb_put_packet("OK"); error_report("QEMU: Terminated via GDBstub"); gdb_exit(0); exit(0); @@ -1913,7 +1859,7 @@ static void handle_v_commands(GArray *params, void *u= ser_ctx) if (process_string_cmd(NULL, get_param(params, 0)->data, gdb_v_commands_table, ARRAY_SIZE(gdb_v_commands_table))) { - put_packet(""); + gdb_put_packet(""); } } =20 @@ -1945,12 +1891,12 @@ static void handle_set_qemu_sstep(GArray *params, v= oid *user_ctx) new_sstep_flags =3D get_param(params, 0)->val_ul; =20 if (new_sstep_flags & ~gdbserver_state.supported_sstep_flags) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 gdbserver_state.sstep_flags =3D new_sstep_flags; - put_packet("OK"); + gdb_put_packet("OK"); } =20 static void handle_query_qemu_sstep(GArray *params, void *user_ctx) @@ -1980,7 +1926,7 @@ static void handle_query_curr_tid(GArray *params, voi= d *user_ctx) static void handle_query_threads(GArray *params, void *user_ctx) { if (!gdbserver_state.query_cpu) { - put_packet("l"); + gdb_put_packet("l"); return; } =20 @@ -2003,7 +1949,7 @@ static void handle_query_thread_extra(GArray *params,= void *user_ctx) =20 if (!params->len || get_param(params, 0)->thread_id.kind =3D=3D GDB_READ_THREAD_ERR) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 @@ -2028,7 +1974,7 @@ static void handle_query_thread_extra(GArray *params,= void *user_ctx) cpu->halted ? "halted " : "running"); } trace_gdbstub_op_extra_info(rs->str); - memtohex(gdbserver_state.str_buf, (uint8_t *)rs->str, rs->len); + gdb_memtohex(gdbserver_state.str_buf, (uint8_t *)rs->str, rs->len); put_strbuf(); } =20 @@ -2047,32 +1993,6 @@ static void handle_query_offsets(GArray *params, voi= d *user_ctx) ts->info->data_offset); put_strbuf(); } -#else -static void handle_query_rcmd(GArray *params, void *user_ctx) -{ - const guint8 zero =3D 0; - int len; - - if (!params->len) { - put_packet("E22"); - return; - } - - len =3D strlen(get_param(params, 0)->data); - if (len % 2) { - put_packet("E01"); - return; - } - - g_assert(gdbserver_state.mem_buf->len =3D=3D 0); - len =3D len / 2; - hextomem(gdbserver_state.mem_buf, get_param(params, 0)->data, len); - g_byte_array_append(gdbserver_state.mem_buf, &zero, 1); - qemu_chr_be_write(gdbserver_state.connection->mon_chr, - gdbserver_state.mem_buf->data, - gdbserver_state.mem_buf->len); - put_packet("OK"); -} #endif =20 static void handle_query_supported(GArray *params, void *user_ctx) @@ -2114,14 +2034,14 @@ static void handle_query_xfer_features(GArray *para= ms, void *user_ctx) const char *p; =20 if (params->len < 3) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 process =3D gdb_get_cpu_process(gdbserver_state.g_cpu); cc =3D CPU_GET_CLASS(gdbserver_state.g_cpu); if (!cc->gdb_core_xml_file) { - put_packet(""); + gdb_put_packet(""); return; } =20 @@ -2129,7 +2049,7 @@ static void handle_query_xfer_features(GArray *params= , void *user_ctx) p =3D get_param(params, 0)->data; xml =3D get_feature_xml(p, &p, process); if (!xml) { - put_packet("E00"); + gdb_put_packet("E00"); return; } =20 @@ -2137,7 +2057,7 @@ static void handle_query_xfer_features(GArray *params= , void *user_ctx) len =3D get_param(params, 2)->val_ul; total_len =3D strlen(xml); if (addr > total_len) { - put_packet("E00"); + gdb_put_packet("E00"); return; } =20 @@ -2164,7 +2084,7 @@ static void handle_query_xfer_auxv(GArray *params, vo= id *user_ctx) unsigned long offset, len, saved_auxv, auxv_len; =20 if (params->len < 2) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 @@ -2175,7 +2095,7 @@ static void handle_query_xfer_auxv(GArray *params, vo= id *user_ctx) auxv_len =3D ts->info->auxv_len; =20 if (offset >=3D auxv_len) { - put_packet("E00"); + gdb_put_packet("E00"); return; } =20 @@ -2193,7 +2113,7 @@ static void handle_query_xfer_auxv(GArray *params, vo= id *user_ctx) g_byte_array_set_size(gdbserver_state.mem_buf, len); if (target_memory_rw_debug(gdbserver_state.g_cpu, saved_auxv + offset, gdbserver_state.mem_buf->data, len, false))= { - put_packet("E14"); + gdb_put_packet("E14"); return; } =20 @@ -2206,7 +2126,7 @@ static void handle_query_xfer_auxv(GArray *params, vo= id *user_ctx) =20 static void handle_query_attached(GArray *params, void *user_ctx) { - put_packet(GDB_ATTACHED); + gdb_put_packet(GDB_ATTACHED); } =20 static void handle_query_qemu_supported(GArray *params, void *user_ctx) @@ -2229,7 +2149,7 @@ static void handle_query_qemu_phy_mem_mode(GArray *pa= rams, static void handle_set_qemu_phy_mem_mode(GArray *params, void *user_ctx) { if (!params->len) { - put_packet("E22"); + gdb_put_packet("E22"); return; } =20 @@ -2238,7 +2158,7 @@ static void handle_set_qemu_phy_mem_mode(GArray *para= ms, void *user_ctx) } else { phy_memory_mode =3D 1; } - put_packet("OK"); + gdb_put_packet("OK"); } #endif =20 @@ -2286,7 +2206,7 @@ static const GdbCmdParseEntry gdb_gen_query_table[] = =3D { }, #else { - .handler =3D handle_query_rcmd, + .handler =3D gdb_handle_query_rcmd, .cmd =3D "Rcmd,", .cmd_startswith =3D 1, .schema =3D "s0" @@ -2371,7 +2291,7 @@ static void handle_gen_query(GArray *params, void *us= er_ctx) if (process_string_cmd(NULL, get_param(params, 0)->data, gdb_gen_query_table, ARRAY_SIZE(gdb_gen_query_table))) { - put_packet(""); + gdb_put_packet(""); } } =20 @@ -2390,7 +2310,7 @@ static void handle_gen_set(GArray *params, void *user= _ctx) if (process_string_cmd(NULL, get_param(params, 0)->data, gdb_gen_set_table, ARRAY_SIZE(gdb_gen_set_table))) { - put_packet(""); + gdb_put_packet(""); } } =20 @@ -2416,7 +2336,7 @@ static int gdb_handle_packet(const char *line_buf) =20 switch (line_buf[0]) { case '!': - put_packet("OK"); + gdb_put_packet("OK"); break; case '?': { @@ -2643,7 +2563,7 @@ static int gdb_handle_packet(const char *line_buf) break; default: /* put empty packet */ - put_packet(""); + gdb_put_packet(""); break; } =20 @@ -2670,100 +2590,6 @@ void gdb_set_stop_cpu(CPUState *cpu) gdbserver_state.g_cpu =3D cpu; } =20 -#ifndef CONFIG_USER_ONLY -static void gdb_vm_state_change(void *opaque, bool running, RunState state) -{ - CPUState *cpu =3D gdbserver_state.c_cpu; - g_autoptr(GString) buf =3D g_string_new(NULL); - g_autoptr(GString) tid =3D g_string_new(NULL); - const char *type; - int ret; - - if (running || gdbserver_state.state =3D=3D RS_INACTIVE) { - return; - } - /* Is there a GDB syscall waiting to be sent? */ - if (gdbserver_state.current_syscall_cb) { - put_packet(gdbserver_state.syscall_buf); - return; - } - - if (cpu =3D=3D NULL) { - /* No process attached */ - return; - } - - gdb_append_thread_id(cpu, tid); - - switch (state) { - case RUN_STATE_DEBUG: - if (cpu->watchpoint_hit) { - switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) { - case BP_MEM_READ: - type =3D "r"; - break; - case BP_MEM_ACCESS: - type =3D "a"; - break; - default: - type =3D ""; - break; - } - trace_gdbstub_hit_watchpoint(type, cpu_gdb_index(cpu), - (target_ulong)cpu->watchpoint_hit->vaddr); - g_string_printf(buf, "T%02xthread:%s;%swatch:" TARGET_FMT_lx "= ;", - GDB_SIGNAL_TRAP, tid->str, type, - (target_ulong)cpu->watchpoint_hit->vaddr); - cpu->watchpoint_hit =3D NULL; - goto send_packet; - } else { - trace_gdbstub_hit_break(); - } - tb_flush(cpu); - ret =3D GDB_SIGNAL_TRAP; - break; - case RUN_STATE_PAUSED: - trace_gdbstub_hit_paused(); - ret =3D GDB_SIGNAL_INT; - break; - case RUN_STATE_SHUTDOWN: - trace_gdbstub_hit_shutdown(); - ret =3D GDB_SIGNAL_QUIT; - break; - case RUN_STATE_IO_ERROR: - trace_gdbstub_hit_io_error(); - ret =3D GDB_SIGNAL_IO; - break; - case RUN_STATE_WATCHDOG: - trace_gdbstub_hit_watchdog(); - ret =3D GDB_SIGNAL_ALRM; - break; - case RUN_STATE_INTERNAL_ERROR: - trace_gdbstub_hit_internal_error(); - ret =3D GDB_SIGNAL_ABRT; - break; - case RUN_STATE_SAVE_VM: - case RUN_STATE_RESTORE_VM: - return; - case RUN_STATE_FINISH_MIGRATE: - ret =3D GDB_SIGNAL_XCPU; - break; - default: - trace_gdbstub_hit_unknown(state); - ret =3D GDB_SIGNAL_UNKNOWN; - break; - } - gdb_set_stop_cpu(cpu); - g_string_printf(buf, "T%02xthread:%s;", ret, tid->str); - -send_packet: - put_packet(buf->str); - - /* disable single step if it was enabled */ - cpu_single_step(cpu, 0); -} -#endif - /* Send a gdb syscall request. This accepts limited printf-style format specifiers, specifically: %x - target_ulong argument printed in hex. @@ -2818,7 +2644,7 @@ void gdb_do_syscallv(gdb_syscall_complete_cb cb, cons= t char *fmt, va_list va) } *p =3D 0; #ifdef CONFIG_USER_ONLY - put_packet(gdbserver_state.syscall_buf); + gdb_put_packet(gdbserver_state.syscall_buf); /* Return control to gdb for it to process the syscall request. * Since the protocol requires that gdb hands control back to us * using a "here are the results" F packet, we don't need to check @@ -2846,7 +2672,7 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const= char *fmt, ...) va_end(va); } =20 -static void gdb_read_byte(uint8_t ch) +void gdb_read_byte(uint8_t ch) { uint8_t reply; =20 @@ -2856,7 +2682,7 @@ static void gdb_read_byte(uint8_t ch) of a new command then abandon the previous response. */ if (ch =3D=3D '-') { trace_gdbstub_err_got_nack(); - put_buffer(gdbserver_state.last_packet->data, + gdb_put_buffer(gdbserver_state.last_packet->data, gdbserver_state.last_packet->len); } else if (ch =3D=3D '+') { trace_gdbstub_io_got_ack(); @@ -2978,12 +2804,12 @@ static void gdb_read_byte(uint8_t ch) trace_gdbstub_err_checksum_incorrect(gdbserver_state.line_= sum, gdbserver_state.line_csum); /* send NAK reply */ reply =3D '-'; - put_buffer(&reply, 1); + gdb_put_buffer(&reply, 1); gdbserver_state.state =3D RS_IDLE; } else { /* send ACK reply */ reply =3D '+'; - put_buffer(&reply, 1); + gdb_put_buffer(&reply, 1); gdbserver_state.state =3D gdb_handle_packet(gdbserver_stat= e.line_buf); } break; @@ -2993,6 +2819,7 @@ static void gdb_read_byte(uint8_t ch) } } =20 +#ifdef CONFIG_USER_ONLY /* Tell the remote gdb that the process has exited. */ void gdb_exit(int code) { @@ -3001,31 +2828,26 @@ void gdb_exit(int code) if (!gdbserver_state.init) { return; } -#ifdef CONFIG_USER_ONLY if (gdbserver_state.connection->socket_path) { unlink(gdbserver_state.connection->socket_path); } if (gdbserver_state.connection->fd < 0) { return; } -#endif =20 trace_gdbstub_op_exiting((uint8_t)code); =20 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code); - put_packet(buf); - -#ifndef CONFIG_USER_ONLY - qemu_chr_fe_deinit(&gdbserver_state.connection->chr, true); -#endif + gdb_put_packet(buf); } +#endif =20 /* * Create the process that will contain all the "orphan" CPUs (that are not * part of a CPU cluster). Note that if this process contains no CPUs, it = won't * be attachable and thus will be invisible to the user. */ -static void create_default_process(GDBState *s) +void gdb_create_default_process(GDBState *s) { GDBProcess *process; int max_pid =3D 0; @@ -3068,7 +2890,7 @@ gdb_handlesig(CPUState *cpu, int sig) g_string_append_c(gdbserver_state.str_buf, ';'); put_strbuf(); } - /* put_packet() might have detected that the peer terminated the + /* gdb_put_packet() might have detected that the peer terminated the connection. */ if (gdbserver_state.connection->fd < 0) { return sig; @@ -3110,13 +2932,13 @@ void gdb_signalled(CPUArchState *env, int sig) } =20 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig)); - put_packet(buf); + gdb_put_packet(buf); } =20 static void gdb_accept_init(int fd) { - init_gdbserver_state(); - create_default_process(&gdbserver_state); + gdb_init_gdbserver_state(); + gdb_create_default_process(&gdbserver_state); gdbserver_state.processes[0].attached =3D true; gdbserver_state.c_cpu =3D gdb_first_attached_cpu(); gdbserver_state.g_cpu =3D gdbserver_state.c_cpu; @@ -3273,220 +3095,4 @@ void gdbserver_fork(CPUState *cpu) cpu_watchpoint_remove_all(cpu, BP_GDB); } #else -static int gdb_chr_can_receive(void *opaque) -{ - /* We can handle an arbitrarily large amount of data. - Pick the maximum packet size, which is as good as anything. */ - return MAX_PACKET_LENGTH; -} - -static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size) -{ - int i; - - for (i =3D 0; i < size; i++) { - gdb_read_byte(buf[i]); - } -} - -static void gdb_chr_event(void *opaque, QEMUChrEvent event) -{ - int i; - GDBState *s =3D (GDBState *) opaque; - - switch (event) { - case CHR_EVENT_OPENED: - /* Start with first process attached, others detached */ - for (i =3D 0; i < s->process_num; i++) { - s->processes[i].attached =3D !i; - } - - s->c_cpu =3D gdb_first_attached_cpu(); - s->g_cpu =3D s->c_cpu; - - vm_stop(RUN_STATE_PAUSED); - replay_gdb_attached(); - gdb_has_xml =3D false; - break; - default: - break; - } -} - -static int gdb_monitor_write(Chardev *chr, const uint8_t *buf, int len) -{ - g_autoptr(GString) hex_buf =3D g_string_new("O"); - memtohex(hex_buf, buf, len); - put_packet(hex_buf->str); - return len; -} - -#ifndef _WIN32 -static void gdb_sigterm_handler(int signal) -{ - if (runstate_is_running()) { - vm_stop(RUN_STATE_PAUSED); - } -} -#endif - -static void gdb_monitor_open(Chardev *chr, ChardevBackend *backend, - bool *be_opened, Error **errp) -{ - *be_opened =3D false; -} - -static void char_gdb_class_init(ObjectClass *oc, void *data) -{ - ChardevClass *cc =3D CHARDEV_CLASS(oc); - - cc->internal =3D true; - cc->open =3D gdb_monitor_open; - cc->chr_write =3D gdb_monitor_write; -} - -#define TYPE_CHARDEV_GDB "chardev-gdb" - -static const TypeInfo char_gdb_type_info =3D { - .name =3D TYPE_CHARDEV_GDB, - .parent =3D TYPE_CHARDEV, - .class_init =3D char_gdb_class_init, -}; - -static int find_cpu_clusters(Object *child, void *opaque) -{ - if (object_dynamic_cast(child, TYPE_CPU_CLUSTER)) { - GDBState *s =3D (GDBState *) opaque; - CPUClusterState *cluster =3D CPU_CLUSTER(child); - GDBProcess *process; - - s->processes =3D g_renew(GDBProcess, s->processes, ++s->process_nu= m); - - process =3D &s->processes[s->process_num - 1]; - - /* - * GDB process IDs -1 and 0 are reserved. To avoid subtle errors at - * runtime, we enforce here that the machine does not use a cluste= r ID - * that would lead to PID 0. - */ - assert(cluster->cluster_id !=3D UINT32_MAX); - process->pid =3D cluster->cluster_id + 1; - process->attached =3D false; - process->target_xml[0] =3D '\0'; - - return 0; - } - - return object_child_foreach(child, find_cpu_clusters, opaque); -} - -static int pid_order(const void *a, const void *b) -{ - GDBProcess *pa =3D (GDBProcess *) a; - GDBProcess *pb =3D (GDBProcess *) b; - - if (pa->pid < pb->pid) { - return -1; - } else if (pa->pid > pb->pid) { - return 1; - } else { - return 0; - } -} - -static void create_processes(GDBState *s) -{ - object_child_foreach(object_get_root(), find_cpu_clusters, s); - - if (gdbserver_state.processes) { - /* Sort by PID */ - qsort(gdbserver_state.processes, gdbserver_state.process_num, size= of(gdbserver_state.processes[0]), pid_order); - } - - create_default_process(s); -} - -int gdbserver_start(const char *device) -{ - trace_gdbstub_op_start(device); - - char gdbstub_device_name[128]; - Chardev *chr =3D NULL; - Chardev *mon_chr; - - if (!first_cpu) { - error_report("gdbstub: meaningless to attach gdb to a " - "machine without any CPU."); - return -1; - } - - if (!gdb_supports_guest_debug()) { - error_report("gdbstub: current accelerator doesn't support guest d= ebugging"); - return -1; - } - - if (!device) - return -1; - if (strcmp(device, "none") !=3D 0) { - if (strstart(device, "tcp:", NULL)) { - /* enforce required TCP attributes */ - snprintf(gdbstub_device_name, sizeof(gdbstub_device_name), - "%s,wait=3Doff,nodelay=3Don,server=3Don", device); - device =3D gdbstub_device_name; - } -#ifndef _WIN32 - else if (strcmp(device, "stdio") =3D=3D 0) { - struct sigaction act; - - memset(&act, 0, sizeof(act)); - act.sa_handler =3D gdb_sigterm_handler; - sigaction(SIGINT, &act, NULL); - } -#endif - /* - * FIXME: it's a bit weird to allow using a mux chardev here - * and implicitly setup a monitor. We may want to break this. - */ - chr =3D qemu_chr_new_noreplay("gdb", device, true, NULL); - if (!chr) - return -1; - } - - if (!gdbserver_state.init) { - init_gdbserver_state(); - - qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL); - - /* Initialize a monitor terminal for gdb */ - mon_chr =3D qemu_chardev_new(NULL, TYPE_CHARDEV_GDB, - NULL, NULL, &error_abort); - monitor_init_hmp(mon_chr, false, &error_abort); - } else { - qemu_chr_fe_deinit(&gdbserver_state.connection->chr, true); - mon_chr =3D gdbserver_state.connection->mon_chr; - reset_gdbserver_state(); - } - - create_processes(&gdbserver_state); - - if (chr) { - qemu_chr_fe_init(&gdbserver_state.connection->chr, chr, &error_abo= rt); - qemu_chr_fe_set_handlers(&gdbserver_state.connection->chr, - gdb_chr_can_receive, - gdb_chr_receive, gdb_chr_event, - NULL, &gdbserver_state, NULL, true); - } - gdbserver_state.state =3D chr ? RS_IDLE : RS_INACTIVE; - gdbserver_state.connection->mon_chr =3D mon_chr; - gdbserver_state.current_syscall_cb =3D NULL; - - return 0; -} - -static void register_types(void) -{ - type_register_static(&char_gdb_type_info); -} - -type_init(register_types); #endif diff --git a/gdbstub/softmmu.c b/gdbstub/softmmu.c index 183dfb40e4..b7a335b183 100644 --- a/gdbstub/softmmu.c +++ b/gdbstub/softmmu.c @@ -11,11 +11,431 @@ */ =20 #include "qemu/osdep.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "qemu/cutils.h" #include "exec/gdbstub.h" #include "exec/hwaddr.h" +#include "exec/tb-flush.h" #include "sysemu/cpus.h" +#include "sysemu/runstate.h" +#include "sysemu/replay.h" +#include "hw/core/cpu.h" +#include "hw/cpu/cluster.h" +#include "hw/boards.h" +#include "chardev/char.h" +#include "chardev/char-fe.h" +#include "monitor/monitor.h" +#include "trace.h" #include "internals.h" =20 +/* system emulation connection details */ +typedef struct GDBConnection { + CharBackend chr; + Chardev *mon_chr; +} GDBConnection; + +extern GDBState gdbserver_state; + +GDBConnection *gdb_init_connection_data(void) +{ + return g_new(GDBConnection, 1); +} + +static void reset_gdbserver_state(void) +{ + g_free(gdbserver_state.processes); + gdbserver_state.processes =3D NULL; + gdbserver_state.process_num =3D 0; +} + +/* + * Return the GDB index for a given vCPU state. + * + * In system mode GDB numbers CPUs from 1 as 0 is reserved as an "any + * cpu" index. + */ +int gdb_get_cpu_index(CPUState *cpu) +{ + return cpu->cpu_index + 1; +} + +/* + * GDB Connection management. For system emulation we do all of this + * via our existing Chardev infrastructure which allows us to support + * network and unix sockets. + */ + +void gdb_put_buffer(const uint8_t *buf, int len) +{ + /* XXX this blocks entire thread. Rewrite to use + * qemu_chr_fe_write and background I/O callbacks */ + qemu_chr_fe_write_all(&gdbserver_state.connection->chr, buf, len); +} + +static void gdb_chr_event(void *opaque, QEMUChrEvent event) +{ + int i; + GDBState *s =3D (GDBState *) opaque; + + switch (event) { + case CHR_EVENT_OPENED: + /* Start with first process attached, others detached */ + for (i =3D 0; i < s->process_num; i++) { + s->processes[i].attached =3D !i; + } + + s->c_cpu =3D gdb_first_attached_cpu(); + s->g_cpu =3D s->c_cpu; + + vm_stop(RUN_STATE_PAUSED); + replay_gdb_attached(); + gdb_has_xml =3D false; + break; + default: + break; + } +} + +static void gdb_vm_state_change(void *opaque, bool running, RunState state) +{ + CPUState *cpu =3D gdbserver_state.c_cpu; + g_autoptr(GString) buf =3D g_string_new(NULL); + g_autoptr(GString) tid =3D g_string_new(NULL); + const char *type; + int ret; + + if (running || gdbserver_state.state =3D=3D RS_INACTIVE) { + return; + } + /* Is there a GDB syscall waiting to be sent? */ + if (gdbserver_state.current_syscall_cb) { + gdb_put_packet(gdbserver_state.syscall_buf); + return; + } + + if (cpu =3D=3D NULL) { + /* No process attached */ + return; + } + + gdb_append_thread_id(cpu, tid); + + switch (state) { + case RUN_STATE_DEBUG: + if (cpu->watchpoint_hit) { + switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) { + case BP_MEM_READ: + type =3D "r"; + break; + case BP_MEM_ACCESS: + type =3D "a"; + break; + default: + type =3D ""; + break; + } + trace_gdbstub_hit_watchpoint(type, + gdb_get_cpu_index(cpu), + cpu->watchpoint_hit->vaddr); + g_string_printf(buf, "T%02xthread:%s;%swatch:%" VADDR_PRIx ";", + GDB_SIGNAL_TRAP, tid->str, type, + cpu->watchpoint_hit->vaddr); + cpu->watchpoint_hit =3D NULL; + goto send_packet; + } else { + trace_gdbstub_hit_break(); + } + tb_flush(cpu); + ret =3D GDB_SIGNAL_TRAP; + break; + case RUN_STATE_PAUSED: + trace_gdbstub_hit_paused(); + ret =3D GDB_SIGNAL_INT; + break; + case RUN_STATE_SHUTDOWN: + trace_gdbstub_hit_shutdown(); + ret =3D GDB_SIGNAL_QUIT; + break; + case RUN_STATE_IO_ERROR: + trace_gdbstub_hit_io_error(); + ret =3D GDB_SIGNAL_IO; + break; + case RUN_STATE_WATCHDOG: + trace_gdbstub_hit_watchdog(); + ret =3D GDB_SIGNAL_ALRM; + break; + case RUN_STATE_INTERNAL_ERROR: + trace_gdbstub_hit_internal_error(); + ret =3D GDB_SIGNAL_ABRT; + break; + case RUN_STATE_SAVE_VM: + case RUN_STATE_RESTORE_VM: + return; + case RUN_STATE_FINISH_MIGRATE: + ret =3D GDB_SIGNAL_XCPU; + break; + default: + trace_gdbstub_hit_unknown(state); + ret =3D GDB_SIGNAL_UNKNOWN; + break; + } + gdb_set_stop_cpu(cpu); + g_string_printf(buf, "T%02xthread:%s;", ret, tid->str); + +send_packet: + gdb_put_packet(buf->str); + + /* disable single step if it was enabled */ + cpu_single_step(cpu, 0); +} + +#ifndef _WIN32 +static void gdb_sigterm_handler(int signal) +{ + if (runstate_is_running()) { + vm_stop(RUN_STATE_PAUSED); + } +} +#endif + +static int gdb_monitor_write(Chardev *chr, const uint8_t *buf, int len) +{ + g_autoptr(GString) hex_buf =3D g_string_new("O"); + gdb_memtohex(hex_buf, buf, len); + gdb_put_packet(hex_buf->str); + return len; +} + +static void gdb_monitor_open(Chardev *chr, ChardevBackend *backend, + bool *be_opened, Error **errp) +{ + *be_opened =3D false; +} + +static void char_gdb_class_init(ObjectClass *oc, void *data) +{ + ChardevClass *cc =3D CHARDEV_CLASS(oc); + + cc->internal =3D true; + cc->open =3D gdb_monitor_open; + cc->chr_write =3D gdb_monitor_write; +} + +#define TYPE_CHARDEV_GDB "chardev-gdb" + +static const TypeInfo char_gdb_type_info =3D { + .name =3D TYPE_CHARDEV_GDB, + .parent =3D TYPE_CHARDEV, + .class_init =3D char_gdb_class_init, +}; + +static int gdb_chr_can_receive(void *opaque) +{ + /* We can handle an arbitrarily large amount of data. + Pick the maximum packet size, which is as good as anything. */ + return MAX_PACKET_LENGTH; +} + +static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size) +{ + int i; + + for (i =3D 0; i < size; i++) { + gdb_read_byte(buf[i]); + } +} + +static int find_cpu_clusters(Object *child, void *opaque) +{ + if (object_dynamic_cast(child, TYPE_CPU_CLUSTER)) { + GDBState *s =3D (GDBState *) opaque; + CPUClusterState *cluster =3D CPU_CLUSTER(child); + GDBProcess *process; + + s->processes =3D g_renew(GDBProcess, s->processes, ++s->process_nu= m); + + process =3D &s->processes[s->process_num - 1]; + + /* + * GDB process IDs -1 and 0 are reserved. To avoid subtle errors at + * runtime, we enforce here that the machine does not use a cluste= r ID + * that would lead to PID 0. + */ + assert(cluster->cluster_id !=3D UINT32_MAX); + process->pid =3D cluster->cluster_id + 1; + process->attached =3D false; + process->target_xml[0] =3D '\0'; + + return 0; + } + + return object_child_foreach(child, find_cpu_clusters, opaque); +} + +static int pid_order(const void *a, const void *b) +{ + GDBProcess *pa =3D (GDBProcess *) a; + GDBProcess *pb =3D (GDBProcess *) b; + + if (pa->pid < pb->pid) { + return -1; + } else if (pa->pid > pb->pid) { + return 1; + } else { + return 0; + } +} + +static void create_processes(GDBState *s) +{ + object_child_foreach(object_get_root(), find_cpu_clusters, s); + + if (gdbserver_state.processes) { + /* Sort by PID */ + qsort(gdbserver_state.processes, + gdbserver_state.process_num, + sizeof(gdbserver_state.processes[0]), + pid_order); + } + + gdb_create_default_process(s); +} + +int gdbserver_start(const char *device) +{ + trace_gdbstub_op_start(device); + + char gdbstub_device_name[128]; + Chardev *chr =3D NULL; + Chardev *mon_chr; + + if (!first_cpu) { + error_report("gdbstub: meaningless to attach gdb to a " + "machine without any CPU."); + return -1; + } + + if (!gdb_supports_guest_debug()) { + error_report("gdbstub: current accelerator doesn't support guest d= ebugging"); + return -1; + } + + if (!device) + return -1; + if (strcmp(device, "none") !=3D 0) { + if (strstart(device, "tcp:", NULL)) { + /* enforce required TCP attributes */ + snprintf(gdbstub_device_name, sizeof(gdbstub_device_name), + "%s,wait=3Doff,nodelay=3Don,server=3Don", device); + device =3D gdbstub_device_name; + } +#ifndef _WIN32 + else if (strcmp(device, "stdio") =3D=3D 0) { + struct sigaction act; + + memset(&act, 0, sizeof(act)); + act.sa_handler =3D gdb_sigterm_handler; + sigaction(SIGINT, &act, NULL); + } +#endif + /* + * FIXME: it's a bit weird to allow using a mux chardev here + * and implicitly setup a monitor. We may want to break this. + */ + chr =3D qemu_chr_new_noreplay("gdb", device, true, NULL); + if (!chr) + return -1; + } + + if (!gdbserver_state.init) { + gdb_init_gdbserver_state(); + + qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL); + + /* Initialize a monitor terminal for gdb */ + mon_chr =3D qemu_chardev_new(NULL, TYPE_CHARDEV_GDB, + NULL, NULL, &error_abort); + monitor_init_hmp(mon_chr, false, &error_abort); + } else { + qemu_chr_fe_deinit(&gdbserver_state.connection->chr, true); + mon_chr =3D gdbserver_state.connection->mon_chr; + reset_gdbserver_state(); + } + + create_processes(&gdbserver_state); + + if (chr) { + qemu_chr_fe_init(&gdbserver_state.connection->chr, chr, &error_abo= rt); + qemu_chr_fe_set_handlers(&gdbserver_state.connection->chr, + gdb_chr_can_receive, + gdb_chr_receive, gdb_chr_event, + NULL, &gdbserver_state, NULL, true); + } + gdbserver_state.state =3D chr ? RS_IDLE : RS_INACTIVE; + gdbserver_state.connection->mon_chr =3D mon_chr; + gdbserver_state.current_syscall_cb =3D NULL; + + return 0; +} + +static void register_types(void) +{ + type_register_static(&char_gdb_type_info); +} + +type_init(register_types); + +/* Tell the remote gdb that the process has exited. */ +void gdb_exit(int code) +{ + char buf[4]; + + if (!gdbserver_state.init) { + return; + } + + trace_gdbstub_op_exiting((uint8_t)code); + + snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code); + gdb_put_packet(buf); + + qemu_chr_fe_deinit(&gdbserver_state.connection->chr, true); +} + +/* + * Softmmu specific command helpers + */ +void gdb_handle_query_rcmd(GArray *params, void *user_ctx) +{ + const guint8 zero =3D 0; + int len; + + if (!params->len) { + gdb_put_packet("E22"); + return; + } + + len =3D strlen(get_param(params, 0)->data); + if (len % 2) { + gdb_put_packet("E01"); + return; + } + + g_assert(gdbserver_state.mem_buf->len =3D=3D 0); + len =3D len / 2; + gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 0)->data, len); + g_byte_array_append(gdbserver_state.mem_buf, &zero, 1); + qemu_chr_be_write(gdbserver_state.connection->mon_chr, + gdbserver_state.mem_buf->data, + gdbserver_state.mem_buf->len); + gdb_put_packet("OK"); +} + +/* + * Break/Watch point helpers + */ + bool gdb_supports_guest_debug(void) { const AccelOpsClass *ops =3D cpus_get_accel(); diff --git a/gdbstub/trace-events b/gdbstub/trace-events index 03f0c303bf..0c18a4d70a 100644 --- a/gdbstub/trace-events +++ b/gdbstub/trace-events @@ -7,7 +7,6 @@ gdbstub_op_continue(void) "Continuing all CPUs" gdbstub_op_continue_cpu(int cpu_index) "Continuing CPU %d" gdbstub_op_stepping(int cpu_index) "Stepping CPU %d" gdbstub_op_extra_info(const char *info) "Thread extra info: %s" -gdbstub_hit_watchpoint(const char *type, int cpu_gdb_index, uint64_t vaddr= ) "Watchpoint hit, type=3D\"%s\" cpu=3D%d, vaddr=3D0x%" PRIx64 "" gdbstub_hit_internal_error(void) "RUN_STATE_INTERNAL_ERROR" gdbstub_hit_break(void) "RUN_STATE_DEBUG" gdbstub_hit_paused(void) "RUN_STATE_PAUSED" @@ -27,3 +26,6 @@ gdbstub_err_invalid_repeat(uint8_t ch) "got invalid RLE c= ount: 0x%02x" gdbstub_err_invalid_rle(void) "got invalid RLE sequence" gdbstub_err_checksum_invalid(uint8_t ch) "got invalid command checksum dig= it: 0x%02x" gdbstub_err_checksum_incorrect(uint8_t expected, uint8_t got) "got command= packet with incorrect checksum, expected=3D0x%02x, received=3D0x%02x" + +# softmmu.c +gdbstub_hit_watchpoint(const char *type, int cpu_gdb_index, uint64_t vaddr= ) "Watchpoint hit, type=3D\"%s\" cpu=3D%d, vaddr=3D0x%" PRIx64 "" --=20 2.34.1 From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189819; cv=none; d=zohomail.com; s=zohoarc; b=Q62AXtcNljR18jsvCplwnYUvYF7y6kyePg/JVg/T13SJMHiSMWu52wiCZvp+N5+cFbCxmMX5xNXz8xnTuP1w6gNZMXSGM/gIZnSoRRuecuCO4YvGfo2mY83GAQB4rvtpE8Hsre3t6XtjqD7MsWlRrjf5cDeWRsmmEVvb1TopN3Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189819; h=Content-Type: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=9aKOu7kTGaWQQxuXEdSD36/hlY5mYKHfrE/OifwOH2Q=; b=PTJQjyDqqQFvNf4ewbCbl9lFwCLd2kXjrKUNHOKsycYJLEVd8drh9Lc5JKVGL1Xj9BVLfNK/ufJ/oNWIlUphTf39EJMsJV8wNeIuEBxcpCM5NX95hUB9U5ZnIJrIb2wQZrn9e8QN+UjW2BKDRwuVaMBz3RPypW56uV8xxKCdhrk= 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 1671189819787699.7128256600115; Fri, 16 Dec 2022 03:23:39 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68nF-00026p-1w; Fri, 16 Dec 2022 06:22:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68nD-00025t-F8 for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:19 -0500 Received: from mail-wm1-x329.google.com ([2a00:1450:4864:20::329]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1p68n8-000699-F9 for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:19 -0500 Received: by mail-wm1-x329.google.com with SMTP id bi26-20020a05600c3d9a00b003d3404a89faso1230542wmb.1 for ; Fri, 16 Dec 2022 03:22:13 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id t16-20020a1c7710000000b003c21ba7d7d6sm2194948wmi.44.2022.12.16.03.22.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:09 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 261491FFB8; Fri, 16 Dec 2022 11:22:08 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=9aKOu7kTGaWQQxuXEdSD36/hlY5mYKHfrE/OifwOH2Q=; b=yuoXVbXZD1mE1JVl1uU54M1DmWZBK6OcXY1Sl3sn8KE+ZXNGBF4Opk2zbUMejiZtTm IAQghPtYodE+UyOV62eOEslZHJ8WxYRFLObJ7ALO+KRCyA7V1ziFcVV/AeYwlRnaoDmu Xp/VOPpXyTNCWxhkkVVqa3C+EHgnFlerdMTSFgX/0gYbVEPaPFhzHi6UKj1zLnyIB4bv KOoZra76Ze7ljr9cbtTa8unOZz4NwkC+k33DzgbUHRLQTrxkufnqSKmOcUjvQaAJoRuL wu37mv5UQzONtxuRSeRVgvs3rXDiLOVlXWNWNSCYZoagwHHA/oLAF/m1DNfZ9J6cvuPo Bh3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=9aKOu7kTGaWQQxuXEdSD36/hlY5mYKHfrE/OifwOH2Q=; b=zvwCe1kJkGVC34sCVuZ+U8Kirnan83keSg0qj8bBOMkxAJpnw8eg5crAIKTaR12Rlm dsqLZRQnEEqaANuw//byS0YZFqh2irGraTuCqOYnLpzZO4CbDovC57Sb36qe82NkhogV dw2s51P4eQj5ZR6hkK555471JOHlNOVrbbNJjSIoh7HsNmlmRlt058l8Zxmf5qQ4G4X5 0evaPv6tYbKrleX3I4N/qJUAn/ilwZ4HglhtbL5WiD0DIs45JDCM9tsroLoh1UKdS5Qa 7sSmW7geCH9dodfVz6kxR3AuAzWwJ4H33sOMG88+PlgdddNAheFkOt3UWT8fH0sVPE6O eutQ== X-Gm-Message-State: ANoB5pkJ0UPAoWF7JoOOaEd+E2TMjnL1hF6aW1mHYMRAsh1Jc+p2/0k9 wrwVMEBcxuaY1o4T2evO4udSvA== X-Google-Smtp-Source: AA0mqf5p/s1lUdfpgeV4MoA2/3drtzbJaYPQm8ZJf+taqktoUeUamQYdwnX0k6lpD62Wm8y2TjUJIA== X-Received: by 2002:a05:600c:3b8f:b0:3d2:2830:b8bb with SMTP id n15-20020a05600c3b8f00b003d22830b8bbmr14236813wms.34.1671189732362; Fri, 16 Dec 2022 03:22:12 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Laurent Vivier Subject: [PATCH v1 09/10] gdbstub: move chunks of user code into own files Date: Fri, 16 Dec 2022 11:22:05 +0000 Message-Id: <20221216112206.3171578-10-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::329; envelope-from=alex.bennee@linaro.org; helo=mail-wm1-x329.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1671189821541100007 The process was pretty similar to the softmmu move except we take the time to split stuff between user.c and user-target.c to avoid as much target specific compilation as possible. We also start to make use of our shiny new header scheme so the user-only helpers can be included without the rest of the exec/gsbstub.h cruft. As before we: - convert some helpers to public gdb_ functions (via internals.h) - splitting some functions into user and softmmu versions Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Fabiano Rosas --- gdbstub/internals.h | 22 +- include/exec/gdbstub.h | 18 -- include/gdbstub/user.h | 29 ++ gdbstub/gdbstub.c | 720 ++--------------------------------------- gdbstub/softmmu.c | 89 +++++ gdbstub/user-target.c | 283 ++++++++++++++++ gdbstub/user.c | 343 ++++++++++++++++++++ linux-user/main.c | 1 + linux-user/signal.c | 2 +- gdbstub/meson.build | 2 + 10 files changed, 793 insertions(+), 716 deletions(-) create mode 100644 gdbstub/user-target.c diff --git a/gdbstub/internals.h b/gdbstub/internals.h index 50eac269c8..4c3b0d7b64 100644 --- a/gdbstub/internals.h +++ b/gdbstub/internals.h @@ -77,9 +77,12 @@ typedef struct GDBState { * Connection helpers for both softmmu and user backends */ void gdb_put_buffer(const uint8_t *buf, int len); +void gdb_put_strbuf(void); int gdb_put_packet(const char *buf); +int gdb_put_packet_binary(const char *buf, int len, bool dump); void gdb_hextomem(GByteArray *mem, const char *buf, int len); void gdb_memtohex(GString *buf, const uint8_t *mem, int len); +void gdb_memtox(GString *buf, const char *mem, int len); void gdb_read_byte(uint8_t ch); =20 /* utility helpers */ @@ -89,6 +92,22 @@ int gdb_get_cpu_index(CPUState *cpu); =20 void gdb_create_default_process(GDBState *s); =20 +/* signal mapping, common for softmmu, specialised for user-mode */ +int gdb_signal_to_target(int sig); +int gdb_target_signal_to_gdb(int sig); + +int gdb_get_char(void); /* user only */ + +/** + * gdb_continue() - handle continue in mode specific way. + */ +void gdb_continue(void); + +/** + * gdb_continue_partial() - handle partial continue in mode specific way. + */ +int gdb_continue_partial(char *newstates); + /* * Command handlers - either softmmu or user only */ @@ -116,7 +135,8 @@ typedef union GdbCmdVariant { #define get_param(p, i) (&g_array_index(p, GdbCmdVariant, i)) =20 void gdb_handle_query_rcmd(GArray *params, void *user_ctx); /* softmmu */ - +void gdb_handle_query_offsets(GArray *params, void *user_ctx); /* user */ +void gdb_handle_query_xfer_auxv(GArray *params, void *user_ctx); /*user */ =20 /* * Break/Watch point support - there is an implementation for softmmu diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h index 1636fb3841..d1eb96f807 100644 --- a/include/exec/gdbstub.h +++ b/include/exec/gdbstub.h @@ -104,24 +104,6 @@ void gdb_do_syscallv(gdb_syscall_complete_cb cb, const= char *fmt, va_list va); int use_gdb_syscalls(void); =20 #ifdef CONFIG_USER_ONLY -/** - * gdb_handlesig: yield control to gdb - * @cpu: CPU - * @sig: if non-zero, the signal number which caused us to stop - * - * This function yields control to gdb, when a user-mode-only target - * needs to stop execution. If @sig is non-zero, then we will send a - * stop packet to tell gdb that we have stopped because of this signal. - * - * This function will block (handling protocol requests from gdb) - * until gdb tells us to continue target execution. When it does - * return, the return value is a signal to deliver to the target, - * or 0 if no signal should be delivered, ie the signal that caused - * us to stop should be ignored. - */ -int gdb_handlesig(CPUState *, int); -void gdb_signalled(CPUArchState *, int); -void gdbserver_fork(CPUState *); #endif =20 /* Get or set a register. Returns the size of the register. */ diff --git a/include/gdbstub/user.h b/include/gdbstub/user.h index 53baba65ff..d392e510c5 100644 --- a/include/gdbstub/user.h +++ b/include/gdbstub/user.h @@ -9,6 +9,35 @@ #ifndef GDBSTUB_USER_H #define GDBSTUB_USER_H =20 +/** + * gdb_handlesig() - yield control to gdb + * @cpu: CPU + * @sig: if non-zero, the signal number which caused us to stop + * + * This function yields control to gdb, when a user-mode-only target + * needs to stop execution. If @sig is non-zero, then we will send a + * stop packet to tell gdb that we have stopped because of this signal. + * + * This function will block (handling protocol requests from gdb) + * until gdb tells us to continue target execution. When it does + * return, the return value is a signal to deliver to the target, + * or 0 if no signal should be delivered, ie the signal that caused + * us to stop should be ignored. + */ +int gdb_handlesig(CPUState *, int); + +/** + * gdb_signalled() - inform remote gdb of sig exit + * @as: current CPUArchState + * @sig: signal number + */ +void gdb_signalled(CPUArchState *as, int sig); + +/** + * gdbserver_fork() - disable gdb stub for child processes. + * @cs: CPU + */ +void gdbserver_fork(CPUState *cs); =20 =20 #endif /* GDBSTUB_USER_H */ diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c index ec4b6ac4e4..fa68a77066 100644 --- a/gdbstub/gdbstub.c +++ b/gdbstub/gdbstub.c @@ -30,13 +30,12 @@ #include "trace.h" #include "exec/gdbstub.h" #ifdef CONFIG_USER_ONLY -#include "qemu.h" +#include "gdbstub/user.h" #else #include "hw/cpu/cluster.h" #include "hw/boards.h" #endif =20 -#include "qemu/sockets.h" #include "sysemu/hw_accel.h" #include "sysemu/runstate.h" #include "semihosting/semihost.h" @@ -80,223 +79,6 @@ static inline int target_memory_rw_debug(CPUState *cpu,= target_ulong addr, return cpu_memory_rw_debug(cpu, addr, buf, len, is_write); } =20 -/* - * Return the GDB index for a given vCPU state. - * - * For user mode this is simply the thread id. - */ -#if defined(CONFIG_USER_ONLY) -int gdb_get_cpu_index(CPUState *cpu) -{ - TaskState *ts =3D (TaskState *) cpu->opaque; - return ts ? ts->ts_tid : -1; -} -#endif - -#ifdef CONFIG_USER_ONLY - -/* Map target signal numbers to GDB protocol signal numbers and vice - * versa. For user emulation's currently supported systems, we can - * assume most signals are defined. - */ - -static int gdb_signal_table[] =3D { - 0, - TARGET_SIGHUP, - TARGET_SIGINT, - TARGET_SIGQUIT, - TARGET_SIGILL, - TARGET_SIGTRAP, - TARGET_SIGABRT, - -1, /* SIGEMT */ - TARGET_SIGFPE, - TARGET_SIGKILL, - TARGET_SIGBUS, - TARGET_SIGSEGV, - TARGET_SIGSYS, - TARGET_SIGPIPE, - TARGET_SIGALRM, - TARGET_SIGTERM, - TARGET_SIGURG, - TARGET_SIGSTOP, - TARGET_SIGTSTP, - TARGET_SIGCONT, - TARGET_SIGCHLD, - TARGET_SIGTTIN, - TARGET_SIGTTOU, - TARGET_SIGIO, - TARGET_SIGXCPU, - TARGET_SIGXFSZ, - TARGET_SIGVTALRM, - TARGET_SIGPROF, - TARGET_SIGWINCH, - -1, /* SIGLOST */ - TARGET_SIGUSR1, - TARGET_SIGUSR2, -#ifdef TARGET_SIGPWR - TARGET_SIGPWR, -#else - -1, -#endif - -1, /* SIGPOLL */ - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, -#ifdef __SIGRTMIN - __SIGRTMIN + 1, - __SIGRTMIN + 2, - __SIGRTMIN + 3, - __SIGRTMIN + 4, - __SIGRTMIN + 5, - __SIGRTMIN + 6, - __SIGRTMIN + 7, - __SIGRTMIN + 8, - __SIGRTMIN + 9, - __SIGRTMIN + 10, - __SIGRTMIN + 11, - __SIGRTMIN + 12, - __SIGRTMIN + 13, - __SIGRTMIN + 14, - __SIGRTMIN + 15, - __SIGRTMIN + 16, - __SIGRTMIN + 17, - __SIGRTMIN + 18, - __SIGRTMIN + 19, - __SIGRTMIN + 20, - __SIGRTMIN + 21, - __SIGRTMIN + 22, - __SIGRTMIN + 23, - __SIGRTMIN + 24, - __SIGRTMIN + 25, - __SIGRTMIN + 26, - __SIGRTMIN + 27, - __SIGRTMIN + 28, - __SIGRTMIN + 29, - __SIGRTMIN + 30, - __SIGRTMIN + 31, - -1, /* SIGCANCEL */ - __SIGRTMIN, - __SIGRTMIN + 32, - __SIGRTMIN + 33, - __SIGRTMIN + 34, - __SIGRTMIN + 35, - __SIGRTMIN + 36, - __SIGRTMIN + 37, - __SIGRTMIN + 38, - __SIGRTMIN + 39, - __SIGRTMIN + 40, - __SIGRTMIN + 41, - __SIGRTMIN + 42, - __SIGRTMIN + 43, - __SIGRTMIN + 44, - __SIGRTMIN + 45, - __SIGRTMIN + 46, - __SIGRTMIN + 47, - __SIGRTMIN + 48, - __SIGRTMIN + 49, - __SIGRTMIN + 50, - __SIGRTMIN + 51, - __SIGRTMIN + 52, - __SIGRTMIN + 53, - __SIGRTMIN + 54, - __SIGRTMIN + 55, - __SIGRTMIN + 56, - __SIGRTMIN + 57, - __SIGRTMIN + 58, - __SIGRTMIN + 59, - __SIGRTMIN + 60, - __SIGRTMIN + 61, - __SIGRTMIN + 62, - __SIGRTMIN + 63, - __SIGRTMIN + 64, - __SIGRTMIN + 65, - __SIGRTMIN + 66, - __SIGRTMIN + 67, - __SIGRTMIN + 68, - __SIGRTMIN + 69, - __SIGRTMIN + 70, - __SIGRTMIN + 71, - __SIGRTMIN + 72, - __SIGRTMIN + 73, - __SIGRTMIN + 74, - __SIGRTMIN + 75, - __SIGRTMIN + 76, - __SIGRTMIN + 77, - __SIGRTMIN + 78, - __SIGRTMIN + 79, - __SIGRTMIN + 80, - __SIGRTMIN + 81, - __SIGRTMIN + 82, - __SIGRTMIN + 83, - __SIGRTMIN + 84, - __SIGRTMIN + 85, - __SIGRTMIN + 86, - __SIGRTMIN + 87, - __SIGRTMIN + 88, - __SIGRTMIN + 89, - __SIGRTMIN + 90, - __SIGRTMIN + 91, - __SIGRTMIN + 92, - __SIGRTMIN + 93, - __SIGRTMIN + 94, - __SIGRTMIN + 95, - -1, /* SIGINFO */ - -1, /* UNKNOWN */ - -1, /* DEFAULT */ - -1, - -1, - -1, - -1, - -1, - -1 -#endif -}; -#else -/* In system mode we only need SIGINT and SIGTRAP; other signals - are not yet supported. */ - -enum { - TARGET_SIGINT =3D 2, - TARGET_SIGTRAP =3D 5 -}; - -static int gdb_signal_table[] =3D { - -1, - -1, - TARGET_SIGINT, - -1, - -1, - TARGET_SIGTRAP -}; -#endif - -#ifdef CONFIG_USER_ONLY -static int target_signal_to_gdb (int sig) -{ - int i; - for (i =3D 0; i < ARRAY_SIZE (gdb_signal_table); i++) - if (gdb_signal_table[i] =3D=3D sig) - return i; - return GDB_SIGNAL_UNKNOWN; -} -#endif - -static int gdb_signal_to_target (int sig) -{ - if (sig < ARRAY_SIZE (gdb_signal_table)) - return gdb_signal_table[sig]; - else - return -1; -} - typedef struct GDBRegisterState { int base_reg; int num_regs; @@ -306,14 +88,6 @@ typedef struct GDBRegisterState { struct GDBRegisterState *next; } GDBRegisterState; =20 -#ifdef CONFIG_USER_ONLY -typedef struct GDBConnection { - int fd; - char *socket_path; - int running_state; -} GDBConnection; -#endif - GDBState gdbserver_state; =20 void gdb_init_gdbserver_state(void) @@ -338,43 +112,11 @@ void gdb_init_gdbserver_state(void) * The following is differs depending on USER/SOFTMMU, we just * hid it in the typedef. */ -#ifdef CONFIG_USER_ONLY - gdbserver_state.connection =3D g_new(GDBConnection, 1); -#else gdbserver_state.connection =3D gdb_init_connection_data(); -#endif } =20 bool gdb_has_xml; =20 -#ifdef CONFIG_USER_ONLY - -static int get_char(void) -{ - uint8_t ch; - int ret; - - for(;;) { - ret =3D recv(gdbserver_state.connection->fd, &ch, 1, 0); - if (ret < 0) { - if (errno =3D=3D ECONNRESET) { - gdbserver_state.connection->fd =3D -1; - } - if (errno !=3D EINTR) { - return -1; - } - } else if (ret =3D=3D 0) { - close(gdbserver_state.connection->fd); - gdbserver_state.connection->fd =3D -1; - return -1; - } else { - break; - } - } - return ch; -} -#endif - /* * Return true if there is a GDB currently connected to the stub * and attached to a CPU @@ -419,104 +161,6 @@ static bool stub_can_reverse(void) #endif } =20 -/* Resume execution. */ -static inline void gdb_continue(void) -{ - -#ifdef CONFIG_USER_ONLY - gdbserver_state.connection->running_state =3D 1; - trace_gdbstub_op_continue(); -#else - if (!runstate_needs_reset()) { - trace_gdbstub_op_continue(); - vm_start(); - } -#endif -} - -/* - * Resume execution, per CPU actions. For user-mode emulation it's - * equivalent to gdb_continue. - */ -static int gdb_continue_partial(char *newstates) -{ - CPUState *cpu; - int res =3D 0; -#ifdef CONFIG_USER_ONLY - /* - * This is not exactly accurate, but it's an improvement compared to t= he - * previous situation, where only one CPU would be single-stepped. - */ - CPU_FOREACH(cpu) { - if (newstates[cpu->cpu_index] =3D=3D 's') { - trace_gdbstub_op_stepping(cpu->cpu_index); - cpu_single_step(cpu, gdbserver_state.sstep_flags); - } - } - gdbserver_state.connection->running_state =3D 1; -#else - int flag =3D 0; - - if (!runstate_needs_reset()) { - bool step_requested =3D false; - CPU_FOREACH(cpu) { - if (newstates[cpu->cpu_index] =3D=3D 's') { - step_requested =3D true; - break; - } - } - - if (vm_prepare_start(step_requested)) { - return 0; - } - - CPU_FOREACH(cpu) { - switch (newstates[cpu->cpu_index]) { - case 0: - case 1: - break; /* nothing to do here */ - case 's': - trace_gdbstub_op_stepping(cpu->cpu_index); - cpu_single_step(cpu, gdbserver_state.sstep_flags); - cpu_resume(cpu); - flag =3D 1; - break; - case 'c': - trace_gdbstub_op_continue_cpu(cpu->cpu_index); - cpu_resume(cpu); - flag =3D 1; - break; - default: - res =3D -1; - break; - } - } - } - if (flag) { - qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); - } -#endif - return res; -} - -#ifdef CONFIG_USER_ONLY -void gdb_put_buffer(const uint8_t *buf, int len) -{ - int ret; - - while (len > 0) { - ret =3D send(gdbserver_state.connection->fd, buf, len, 0); - if (ret < 0) { - if (errno !=3D EINTR) - return; - } else { - buf +=3D ret; - len -=3D ret; - } - } -} -#endif - static inline int fromhex(int v) { if (v >=3D '0' && v <=3D '9') @@ -594,7 +238,7 @@ static void hexdump(const char *buf, int len, } =20 /* return -1 if error, 0 if OK */ -static int put_packet_binary(const char *buf, int len, bool dump) +int gdb_put_packet_binary(const char *buf, int len, bool dump) { int csum, i; uint8_t footer[3]; @@ -622,7 +266,7 @@ static int put_packet_binary(const char *buf, int len, = bool dump) gdbserver_state.last_packet->len); =20 #ifdef CONFIG_USER_ONLY - i =3D get_char(); + i =3D gdb_get_char(); if (i < 0) return -1; if (i =3D=3D '+') @@ -639,16 +283,16 @@ int gdb_put_packet(const char *buf) { trace_gdbstub_io_reply(buf); =20 - return put_packet_binary(buf, strlen(buf), false); + return gdb_put_packet_binary(buf, strlen(buf), false); } =20 -static void put_strbuf(void) +void gdb_put_strbuf(void) { gdb_put_packet(gdbserver_state.str_buf->str); } =20 /* Encode data using the encoding for 'x' packets. */ -static void memtox(GString *buf, const char *mem, int len) +void gdb_memtox(GString *buf, const char *mem, int len) { char c; =20 @@ -1570,7 +1214,7 @@ static void handle_get_reg(GArray *params, void *user= _ctx) } =20 gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, r= eg_size); - put_strbuf(); + gdb_put_strbuf(); } =20 static void handle_write_mem(GArray *params, void *user_ctx) @@ -1626,7 +1270,7 @@ static void handle_read_mem(GArray *params, void *use= r_ctx) =20 gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, gdbserver_state.mem_buf->len); - put_strbuf(); + gdb_put_strbuf(); } =20 static void handle_write_all_regs(GArray *params, void *user_ctx) @@ -1667,7 +1311,7 @@ static void handle_read_all_regs(GArray *params, void= *user_ctx) g_assert(len =3D=3D gdbserver_state.mem_buf->len); =20 gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, l= en); - put_strbuf(); + gdb_put_strbuf(); } =20 static void handle_file_io(GArray *params, void *user_ctx) @@ -1812,7 +1456,7 @@ static void handle_v_attach(GArray *params, void *use= r_ctx) gdb_append_thread_id(cpu, gdbserver_state.str_buf); g_string_append_c(gdbserver_state.str_buf, ';'); cleanup: - put_strbuf(); + gdb_put_strbuf(); } =20 static void handle_v_kill(GArray *params, void *user_ctx) @@ -1877,7 +1521,7 @@ static void handle_query_qemu_sstepbits(GArray *param= s, void *user_ctx) SSTEP_NOTIMER); } =20 - put_strbuf(); + gdb_put_strbuf(); } =20 static void handle_set_qemu_sstep(GArray *params, void *user_ctx) @@ -1903,7 +1547,7 @@ static void handle_query_qemu_sstep(GArray *params, v= oid *user_ctx) { g_string_printf(gdbserver_state.str_buf, "0x%x", gdbserver_state.sstep_flags); - put_strbuf(); + gdb_put_strbuf(); } =20 static void handle_query_curr_tid(GArray *params, void *user_ctx) @@ -1920,7 +1564,7 @@ static void handle_query_curr_tid(GArray *params, voi= d *user_ctx) cpu =3D get_first_cpu_in_process(process); g_string_assign(gdbserver_state.str_buf, "QC"); gdb_append_thread_id(cpu, gdbserver_state.str_buf); - put_strbuf(); + gdb_put_strbuf(); } =20 static void handle_query_threads(GArray *params, void *user_ctx) @@ -1932,7 +1576,7 @@ static void handle_query_threads(GArray *params, void= *user_ctx) =20 g_string_assign(gdbserver_state.str_buf, "m"); gdb_append_thread_id(gdbserver_state.query_cpu, gdbserver_state.str_bu= f); - put_strbuf(); + gdb_put_strbuf(); gdbserver_state.query_cpu =3D gdb_next_attached_cpu(gdbserver_state.qu= ery_cpu); } =20 @@ -1975,25 +1619,8 @@ static void handle_query_thread_extra(GArray *params= , void *user_ctx) } trace_gdbstub_op_extra_info(rs->str); gdb_memtohex(gdbserver_state.str_buf, (uint8_t *)rs->str, rs->len); - put_strbuf(); -} - -#ifdef CONFIG_USER_ONLY -static void handle_query_offsets(GArray *params, void *user_ctx) -{ - TaskState *ts; - - ts =3D gdbserver_state.c_cpu->opaque; - g_string_printf(gdbserver_state.str_buf, - "Text=3D" TARGET_ABI_FMT_lx - ";Data=3D" TARGET_ABI_FMT_lx - ";Bss=3D" TARGET_ABI_FMT_lx, - ts->info->code_offset, - ts->info->data_offset, - ts->info->data_offset); - put_strbuf(); + gdb_put_strbuf(); } -#endif =20 static void handle_query_supported(GArray *params, void *user_ctx) { @@ -2022,7 +1649,7 @@ static void handle_query_supported(GArray *params, vo= id *user_ctx) } =20 g_string_append(gdbserver_state.str_buf, ";vContSupported+;multiproces= s+"); - put_strbuf(); + gdb_put_strbuf(); } =20 static void handle_query_xfer_features(GArray *params, void *user_ctx) @@ -2067,63 +1694,16 @@ static void handle_query_xfer_features(GArray *para= ms, void *user_ctx) =20 if (len < total_len - addr) { g_string_assign(gdbserver_state.str_buf, "m"); - memtox(gdbserver_state.str_buf, xml + addr, len); + gdb_memtox(gdbserver_state.str_buf, xml + addr, len); } else { g_string_assign(gdbserver_state.str_buf, "l"); - memtox(gdbserver_state.str_buf, xml + addr, total_len - addr); + gdb_memtox(gdbserver_state.str_buf, xml + addr, total_len - addr); } =20 - put_packet_binary(gdbserver_state.str_buf->str, + gdb_put_packet_binary(gdbserver_state.str_buf->str, gdbserver_state.str_buf->len, true); } =20 -#if defined(CONFIG_USER_ONLY) && defined(CONFIG_LINUX_USER) -static void handle_query_xfer_auxv(GArray *params, void *user_ctx) -{ - TaskState *ts; - unsigned long offset, len, saved_auxv, auxv_len; - - if (params->len < 2) { - gdb_put_packet("E22"); - return; - } - - offset =3D get_param(params, 0)->val_ul; - len =3D get_param(params, 1)->val_ul; - ts =3D gdbserver_state.c_cpu->opaque; - saved_auxv =3D ts->info->saved_auxv; - auxv_len =3D ts->info->auxv_len; - - if (offset >=3D auxv_len) { - gdb_put_packet("E00"); - return; - } - - if (len > (MAX_PACKET_LENGTH - 5) / 2) { - len =3D (MAX_PACKET_LENGTH - 5) / 2; - } - - if (len < auxv_len - offset) { - g_string_assign(gdbserver_state.str_buf, "m"); - } else { - g_string_assign(gdbserver_state.str_buf, "l"); - len =3D auxv_len - offset; - } - - g_byte_array_set_size(gdbserver_state.mem_buf, len); - if (target_memory_rw_debug(gdbserver_state.g_cpu, saved_auxv + offset, - gdbserver_state.mem_buf->data, len, false))= { - gdb_put_packet("E14"); - return; - } - - memtox(gdbserver_state.str_buf, - (const char *)gdbserver_state.mem_buf->data, len); - put_packet_binary(gdbserver_state.str_buf->str, - gdbserver_state.str_buf->len, true); -} -#endif - static void handle_query_attached(GArray *params, void *user_ctx) { gdb_put_packet(GDB_ATTACHED); @@ -2135,7 +1715,7 @@ static void handle_query_qemu_supported(GArray *param= s, void *user_ctx) #ifndef CONFIG_USER_ONLY g_string_append(gdbserver_state.str_buf, ";PhyMemMode"); #endif - put_strbuf(); + gdb_put_strbuf(); } =20 #ifndef CONFIG_USER_ONLY @@ -2143,7 +1723,7 @@ static void handle_query_qemu_phy_mem_mode(GArray *pa= rams, void *user_ctx) { g_string_printf(gdbserver_state.str_buf, "%d", phy_memory_mode); - put_strbuf(); + gdb_put_strbuf(); } =20 static void handle_set_qemu_phy_mem_mode(GArray *params, void *user_ctx) @@ -2201,7 +1781,7 @@ static const GdbCmdParseEntry gdb_gen_query_table[] = =3D { }, #ifdef CONFIG_USER_ONLY { - .handler =3D handle_query_offsets, + .handler =3D gdb_handle_query_offsets, .cmd =3D "Offsets", }, #else @@ -2231,7 +1811,7 @@ static const GdbCmdParseEntry gdb_gen_query_table[] = =3D { }, #if defined(CONFIG_USER_ONLY) && defined(CONFIG_LINUX_USER) { - .handler =3D handle_query_xfer_auxv, + .handler =3D gdb_handle_query_xfer_auxv, .cmd =3D "Xfer:auxv:read::", .cmd_startswith =3D 1, .schema =3D "l,l0" @@ -2319,7 +1899,7 @@ static void handle_target_halt(GArray *params, void *= user_ctx) g_string_printf(gdbserver_state.str_buf, "T%02xthread:", GDB_SIGNAL_TR= AP); gdb_append_thread_id(gdbserver_state.c_cpu, gdbserver_state.str_buf); g_string_append_c(gdbserver_state.str_buf, ';'); - put_strbuf(); + gdb_put_strbuf(); /* * Remove all the breakpoints when this query is issued, * because gdb is doing an initial connect and the state @@ -2819,29 +2399,6 @@ void gdb_read_byte(uint8_t ch) } } =20 -#ifdef CONFIG_USER_ONLY -/* Tell the remote gdb that the process has exited. */ -void gdb_exit(int code) -{ - char buf[4]; - - if (!gdbserver_state.init) { - return; - } - if (gdbserver_state.connection->socket_path) { - unlink(gdbserver_state.connection->socket_path); - } - if (gdbserver_state.connection->fd < 0) { - return; - } - - trace_gdbstub_op_exiting((uint8_t)code); - - snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code); - gdb_put_packet(buf); -} -#endif - /* * Create the process that will contain all the "orphan" CPUs (that are not * part of a CPU cluster). Note that if this process contains no CPUs, it = won't @@ -2867,232 +2424,3 @@ void gdb_create_default_process(GDBState *s) process->target_xml[0] =3D '\0'; } =20 -#ifdef CONFIG_USER_ONLY -int -gdb_handlesig(CPUState *cpu, int sig) -{ - char buf[256]; - int n; - - if (!gdbserver_state.init || gdbserver_state.connection->fd < 0) { - return sig; - } - - /* disable single step if it was enabled */ - cpu_single_step(cpu, 0); - tb_flush(cpu); - - if (sig !=3D 0) { - gdb_set_stop_cpu(cpu); - g_string_printf(gdbserver_state.str_buf, - "T%02xthread:", target_signal_to_gdb(sig)); - gdb_append_thread_id(cpu, gdbserver_state.str_buf); - g_string_append_c(gdbserver_state.str_buf, ';'); - put_strbuf(); - } - /* gdb_put_packet() might have detected that the peer terminated the - connection. */ - if (gdbserver_state.connection->fd < 0) { - return sig; - } - - sig =3D 0; - gdbserver_state.state =3D RS_IDLE; - gdbserver_state.connection->running_state =3D 0; - while (gdbserver_state.connection->running_state =3D=3D 0) { - n =3D read(gdbserver_state.connection->fd, buf, 256); - if (n > 0) { - int i; - - for (i =3D 0; i < n; i++) { - gdb_read_byte(buf[i]); - } - } else { - /* XXX: Connection closed. Should probably wait for another - connection before continuing. */ - if (n =3D=3D 0) { - close(gdbserver_state.connection->fd); - } - gdbserver_state.connection->fd =3D -1; - return sig; - } - } - sig =3D gdbserver_state.signal; - gdbserver_state.signal =3D 0; - return sig; -} - -/* Tell the remote gdb that the process has exited due to SIG. */ -void gdb_signalled(CPUArchState *env, int sig) -{ - char buf[4]; - - if (!gdbserver_state.init || gdbserver_state.connection->fd < 0) { - return; - } - - snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig)); - gdb_put_packet(buf); -} - -static void gdb_accept_init(int fd) -{ - gdb_init_gdbserver_state(); - gdb_create_default_process(&gdbserver_state); - gdbserver_state.processes[0].attached =3D true; - gdbserver_state.c_cpu =3D gdb_first_attached_cpu(); - gdbserver_state.g_cpu =3D gdbserver_state.c_cpu; - gdbserver_state.connection->fd =3D fd; - gdb_has_xml =3D false; -} - -static bool gdb_accept_socket(int gdb_fd) -{ - int fd; - - for(;;) { - fd =3D accept(gdb_fd, NULL, NULL); - if (fd < 0 && errno !=3D EINTR) { - perror("accept socket"); - return false; - } else if (fd >=3D 0) { - qemu_set_cloexec(fd); - break; - } - } - - gdb_accept_init(fd); - return true; -} - -static int gdbserver_open_socket(const char *path) -{ - struct sockaddr_un sockaddr =3D {}; - int fd, ret; - - fd =3D socket(AF_UNIX, SOCK_STREAM, 0); - if (fd < 0) { - perror("create socket"); - return -1; - } - - sockaddr.sun_family =3D AF_UNIX; - pstrcpy(sockaddr.sun_path, sizeof(sockaddr.sun_path) - 1, path); - ret =3D bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)); - if (ret < 0) { - perror("bind socket"); - close(fd); - return -1; - } - ret =3D listen(fd, 1); - if (ret < 0) { - perror("listen socket"); - close(fd); - return -1; - } - - return fd; -} - -static bool gdb_accept_tcp(int gdb_fd) -{ - struct sockaddr_in sockaddr =3D {}; - socklen_t len; - int fd; - - for(;;) { - len =3D sizeof(sockaddr); - fd =3D accept(gdb_fd, (struct sockaddr *)&sockaddr, &len); - if (fd < 0 && errno !=3D EINTR) { - perror("accept"); - return false; - } else if (fd >=3D 0) { - qemu_set_cloexec(fd); - break; - } - } - - /* set short latency */ - if (socket_set_nodelay(fd)) { - perror("setsockopt"); - close(fd); - return false; - } - - gdb_accept_init(fd); - return true; -} - -static int gdbserver_open_port(int port) -{ - struct sockaddr_in sockaddr; - int fd, ret; - - fd =3D socket(PF_INET, SOCK_STREAM, 0); - if (fd < 0) { - perror("socket"); - return -1; - } - qemu_set_cloexec(fd); - - socket_set_fast_reuse(fd); - - sockaddr.sin_family =3D AF_INET; - sockaddr.sin_port =3D htons(port); - sockaddr.sin_addr.s_addr =3D 0; - ret =3D bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)); - if (ret < 0) { - perror("bind"); - close(fd); - return -1; - } - ret =3D listen(fd, 1); - if (ret < 0) { - perror("listen"); - close(fd); - return -1; - } - - return fd; -} - -int gdbserver_start(const char *port_or_path) -{ - int port =3D g_ascii_strtoull(port_or_path, NULL, 10); - int gdb_fd; - - if (port > 0) { - gdb_fd =3D gdbserver_open_port(port); - } else { - gdb_fd =3D gdbserver_open_socket(port_or_path); - } - - if (gdb_fd < 0) { - return -1; - } - - if (port > 0 && gdb_accept_tcp(gdb_fd)) { - return 0; - } else if (gdb_accept_socket(gdb_fd)) { - gdbserver_state.connection->socket_path =3D g_strdup(port_or_path); - return 0; - } - - /* gone wrong */ - close(gdb_fd); - return -1; -} - -/* Disable gdb stub for child processes. */ -void gdbserver_fork(CPUState *cpu) -{ - if (!gdbserver_state.init || gdbserver_state.connection->fd < 0) { - return; - } - close(gdbserver_state.connection->fd); - gdbserver_state.connection->fd =3D -1; - cpu_breakpoint_remove_all(cpu, BP_GDB); - cpu_watchpoint_remove_all(cpu, BP_GDB); -} -#else -#endif diff --git a/gdbstub/softmmu.c b/gdbstub/softmmu.c index b7a335b183..1154a313cb 100644 --- a/gdbstub/softmmu.c +++ b/gdbstub/softmmu.c @@ -432,6 +432,95 @@ void gdb_handle_query_rcmd(GArray *params, void *user_= ctx) gdb_put_packet("OK"); } =20 +/* + * Execution state helpers + */ + +void gdb_continue(void) +{ + if (!runstate_needs_reset()) { + trace_gdbstub_op_continue(); + vm_start(); + } +} + +/* + * Resume execution, per CPU actions. + */ +int gdb_continue_partial(char *newstates) +{ + CPUState *cpu; + int res =3D 0; + int flag =3D 0; + + if (!runstate_needs_reset()) { + bool step_requested =3D false; + CPU_FOREACH(cpu) { + if (newstates[cpu->cpu_index] =3D=3D 's') { + step_requested =3D true; + break; + } + } + + if (vm_prepare_start(step_requested)) { + return 0; + } + + CPU_FOREACH(cpu) { + switch (newstates[cpu->cpu_index]) { + case 0: + case 1: + break; /* nothing to do here */ + case 's': + trace_gdbstub_op_stepping(cpu->cpu_index); + cpu_single_step(cpu, gdbserver_state.sstep_flags); + cpu_resume(cpu); + flag =3D 1; + break; + case 'c': + trace_gdbstub_op_continue_cpu(cpu->cpu_index); + cpu_resume(cpu); + flag =3D 1; + break; + default: + res =3D -1; + break; + } + } + } + if (flag) { + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); + } + return res; +} + +/* + * Signal Handling - in system mode we only need SIGINT and SIGTRAP; other + * signals are not yet supported. + */ + +enum { + TARGET_SIGINT =3D 2, + TARGET_SIGTRAP =3D 5 +}; + +static int gdb_signal_table[] =3D { + -1, + -1, + TARGET_SIGINT, + -1, + -1, + TARGET_SIGTRAP +}; + +int gdb_signal_to_target (int sig) +{ + if (sig < ARRAY_SIZE (gdb_signal_table)) + return gdb_signal_table[sig]; + else + return -1; +} + /* * Break/Watch point helpers */ diff --git a/gdbstub/user-target.c b/gdbstub/user-target.c new file mode 100644 index 0000000000..83e04e1c23 --- /dev/null +++ b/gdbstub/user-target.c @@ -0,0 +1,283 @@ +/* + * Target specific user-mode handling + * + * Copyright (c) 2003-2005 Fabrice Bellard + * Copyright (c) 2022 Linaro Ltd + * + * SPDX-License-Identifier: LGPL-2.0+ + */ + +#include "qemu/osdep.h" +#include "exec/gdbstub.h" +#include "qemu.h" +#include "internals.h" + +extern GDBState gdbserver_state; + +/* + * Map target signal numbers to GDB protocol signal numbers and vice + * versa. For user emulation's currently supported systems, we can + * assume most signals are defined. + */ + +static int gdb_signal_table[] =3D { + 0, + TARGET_SIGHUP, + TARGET_SIGINT, + TARGET_SIGQUIT, + TARGET_SIGILL, + TARGET_SIGTRAP, + TARGET_SIGABRT, + -1, /* SIGEMT */ + TARGET_SIGFPE, + TARGET_SIGKILL, + TARGET_SIGBUS, + TARGET_SIGSEGV, + TARGET_SIGSYS, + TARGET_SIGPIPE, + TARGET_SIGALRM, + TARGET_SIGTERM, + TARGET_SIGURG, + TARGET_SIGSTOP, + TARGET_SIGTSTP, + TARGET_SIGCONT, + TARGET_SIGCHLD, + TARGET_SIGTTIN, + TARGET_SIGTTOU, + TARGET_SIGIO, + TARGET_SIGXCPU, + TARGET_SIGXFSZ, + TARGET_SIGVTALRM, + TARGET_SIGPROF, + TARGET_SIGWINCH, + -1, /* SIGLOST */ + TARGET_SIGUSR1, + TARGET_SIGUSR2, +#ifdef TARGET_SIGPWR + TARGET_SIGPWR, +#else + -1, +#endif + -1, /* SIGPOLL */ + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, +#ifdef __SIGRTMIN + __SIGRTMIN + 1, + __SIGRTMIN + 2, + __SIGRTMIN + 3, + __SIGRTMIN + 4, + __SIGRTMIN + 5, + __SIGRTMIN + 6, + __SIGRTMIN + 7, + __SIGRTMIN + 8, + __SIGRTMIN + 9, + __SIGRTMIN + 10, + __SIGRTMIN + 11, + __SIGRTMIN + 12, + __SIGRTMIN + 13, + __SIGRTMIN + 14, + __SIGRTMIN + 15, + __SIGRTMIN + 16, + __SIGRTMIN + 17, + __SIGRTMIN + 18, + __SIGRTMIN + 19, + __SIGRTMIN + 20, + __SIGRTMIN + 21, + __SIGRTMIN + 22, + __SIGRTMIN + 23, + __SIGRTMIN + 24, + __SIGRTMIN + 25, + __SIGRTMIN + 26, + __SIGRTMIN + 27, + __SIGRTMIN + 28, + __SIGRTMIN + 29, + __SIGRTMIN + 30, + __SIGRTMIN + 31, + -1, /* SIGCANCEL */ + __SIGRTMIN, + __SIGRTMIN + 32, + __SIGRTMIN + 33, + __SIGRTMIN + 34, + __SIGRTMIN + 35, + __SIGRTMIN + 36, + __SIGRTMIN + 37, + __SIGRTMIN + 38, + __SIGRTMIN + 39, + __SIGRTMIN + 40, + __SIGRTMIN + 41, + __SIGRTMIN + 42, + __SIGRTMIN + 43, + __SIGRTMIN + 44, + __SIGRTMIN + 45, + __SIGRTMIN + 46, + __SIGRTMIN + 47, + __SIGRTMIN + 48, + __SIGRTMIN + 49, + __SIGRTMIN + 50, + __SIGRTMIN + 51, + __SIGRTMIN + 52, + __SIGRTMIN + 53, + __SIGRTMIN + 54, + __SIGRTMIN + 55, + __SIGRTMIN + 56, + __SIGRTMIN + 57, + __SIGRTMIN + 58, + __SIGRTMIN + 59, + __SIGRTMIN + 60, + __SIGRTMIN + 61, + __SIGRTMIN + 62, + __SIGRTMIN + 63, + __SIGRTMIN + 64, + __SIGRTMIN + 65, + __SIGRTMIN + 66, + __SIGRTMIN + 67, + __SIGRTMIN + 68, + __SIGRTMIN + 69, + __SIGRTMIN + 70, + __SIGRTMIN + 71, + __SIGRTMIN + 72, + __SIGRTMIN + 73, + __SIGRTMIN + 74, + __SIGRTMIN + 75, + __SIGRTMIN + 76, + __SIGRTMIN + 77, + __SIGRTMIN + 78, + __SIGRTMIN + 79, + __SIGRTMIN + 80, + __SIGRTMIN + 81, + __SIGRTMIN + 82, + __SIGRTMIN + 83, + __SIGRTMIN + 84, + __SIGRTMIN + 85, + __SIGRTMIN + 86, + __SIGRTMIN + 87, + __SIGRTMIN + 88, + __SIGRTMIN + 89, + __SIGRTMIN + 90, + __SIGRTMIN + 91, + __SIGRTMIN + 92, + __SIGRTMIN + 93, + __SIGRTMIN + 94, + __SIGRTMIN + 95, + -1, /* SIGINFO */ + -1, /* UNKNOWN */ + -1, /* DEFAULT */ + -1, + -1, + -1, + -1, + -1, + -1 +#endif +}; + +int gdb_signal_to_target (int sig) +{ + if (sig < ARRAY_SIZE (gdb_signal_table)) + return gdb_signal_table[sig]; + else + return -1; +} + +int gdb_target_signal_to_gdb(int sig) +{ + int i; + for (i =3D 0; i < ARRAY_SIZE (gdb_signal_table); i++) + if (gdb_signal_table[i] =3D=3D sig) + return i; + return GDB_SIGNAL_UNKNOWN; +} + +int gdb_get_cpu_index(CPUState *cpu) +{ + TaskState *ts =3D (TaskState *) cpu->opaque; + return ts ? ts->ts_tid : -1; +} + +/* + * User-mode specific command helpers + */ + +void gdb_handle_query_offsets(GArray *params, void *user_ctx) +{ + TaskState *ts; + + ts =3D gdbserver_state.c_cpu->opaque; + g_string_printf(gdbserver_state.str_buf, + "Text=3D" TARGET_ABI_FMT_lx + ";Data=3D" TARGET_ABI_FMT_lx + ";Bss=3D" TARGET_ABI_FMT_lx, + ts->info->code_offset, + ts->info->data_offset, + ts->info->data_offset); + gdb_put_strbuf(); +} + +/* Partial user only duplicate of helper in gdbstub.c */ +static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr, + uint8_t *buf, int len, bool is_wr= ite) +{ + CPUClass *cc; + cc =3D CPU_GET_CLASS(cpu); + if (cc->memory_rw_debug) { + return cc->memory_rw_debug(cpu, addr, buf, len, is_write); + } + return cpu_memory_rw_debug(cpu, addr, buf, len, is_write); +} + + +#if defined(CONFIG_LINUX_USER) +void gdb_handle_query_xfer_auxv(GArray *params, void *user_ctx) +{ + TaskState *ts; + unsigned long offset, len, saved_auxv, auxv_len; + + if (params->len < 2) { + gdb_put_packet("E22"); + return; + } + + offset =3D get_param(params, 0)->val_ul; + len =3D get_param(params, 1)->val_ul; + ts =3D gdbserver_state.c_cpu->opaque; + saved_auxv =3D ts->info->saved_auxv; + auxv_len =3D ts->info->auxv_len; + + if (offset >=3D auxv_len) { + gdb_put_packet("E00"); + return; + } + + if (len > (MAX_PACKET_LENGTH - 5) / 2) { + len =3D (MAX_PACKET_LENGTH - 5) / 2; + } + + if (len < auxv_len - offset) { + g_string_assign(gdbserver_state.str_buf, "m"); + } else { + g_string_assign(gdbserver_state.str_buf, "l"); + len =3D auxv_len - offset; + } + + g_byte_array_set_size(gdbserver_state.mem_buf, len); + if (target_memory_rw_debug(gdbserver_state.g_cpu, saved_auxv + offset, + gdbserver_state.mem_buf->data, len, false))= { + gdb_put_packet("E14"); + return; + } + + gdb_memtox(gdbserver_state.str_buf, + (const char *)gdbserver_state.mem_buf->data, len); + gdb_put_packet_binary(gdbserver_state.str_buf->str, + gdbserver_state.str_buf->len, true); +} +#endif diff --git a/gdbstub/user.c b/gdbstub/user.c index a5f370bcf9..3492d9b68a 100644 --- a/gdbstub/user.c +++ b/gdbstub/user.c @@ -10,11 +10,354 @@ */ =20 #include "qemu/osdep.h" +#include "qemu/cutils.h" +#include "qemu/sockets.h" #include "exec/hwaddr.h" +#include "exec/tb-flush.h" #include "exec/gdbstub.h" +#include "gdbstub/user.h" #include "hw/core/cpu.h" +#include "trace.h" #include "internals.h" =20 +/* user-mode emulation connection details */ +typedef struct GDBConnection { + int fd; + char *socket_path; + int running_state; +} GDBConnection; + +extern GDBState gdbserver_state; + +GDBConnection *gdb_init_connection_data(void) +{ + return g_new(GDBConnection, 1); +} + +int gdb_get_char(void) +{ + uint8_t ch; + int ret; + + for(;;) { + ret =3D recv(gdbserver_state.connection->fd, &ch, 1, 0); + if (ret < 0) { + if (errno =3D=3D ECONNRESET) { + gdbserver_state.connection->fd =3D -1; + } + if (errno !=3D EINTR) { + return -1; + } + } else if (ret =3D=3D 0) { + close(gdbserver_state.connection->fd); + gdbserver_state.connection->fd =3D -1; + return -1; + } else { + break; + } + } + return ch; +} + +void gdb_put_buffer(const uint8_t *buf, int len) +{ + int ret; + + while (len > 0) { + ret =3D send(gdbserver_state.connection->fd, buf, len, 0); + if (ret < 0) { + if (errno !=3D EINTR) + return; + } else { + buf +=3D ret; + len -=3D ret; + } + } +} + +/* Tell the remote gdb that the process has exited. */ +void gdb_exit(int code) +{ + char buf[4]; + + if (!gdbserver_state.init) { + return; + } + if (gdbserver_state.connection->socket_path) { + unlink(gdbserver_state.connection->socket_path); + } + if (gdbserver_state.connection->fd < 0) { + return; + } + + trace_gdbstub_op_exiting((uint8_t)code); + + snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code); + gdb_put_packet(buf); +} + +int gdb_handlesig(CPUState *cpu, int sig) +{ + char buf[256]; + int n; + + if (!gdbserver_state.init || gdbserver_state.connection->fd < 0) { + return sig; + } + + /* disable single step if it was enabled */ + cpu_single_step(cpu, 0); + tb_flush(cpu); + + if (sig !=3D 0) { + gdb_set_stop_cpu(cpu); + g_string_printf(gdbserver_state.str_buf, + "T%02xthread:", gdb_target_signal_to_gdb(sig)); + gdb_append_thread_id(cpu, gdbserver_state.str_buf); + g_string_append_c(gdbserver_state.str_buf, ';'); + gdb_put_strbuf(); + } + /* gdb_put_packet() might have detected that the peer terminated the + connection. */ + if (gdbserver_state.connection->fd < 0) { + return sig; + } + + sig =3D 0; + gdbserver_state.state =3D RS_IDLE; + gdbserver_state.connection->running_state =3D 0; + while (gdbserver_state.connection->running_state =3D=3D 0) { + n =3D read(gdbserver_state.connection->fd, buf, 256); + if (n > 0) { + int i; + + for (i =3D 0; i < n; i++) { + gdb_read_byte(buf[i]); + } + } else { + /* XXX: Connection closed. Should probably wait for another + connection before continuing. */ + if (n =3D=3D 0) { + close(gdbserver_state.connection->fd); + } + gdbserver_state.connection->fd =3D -1; + return sig; + } + } + sig =3D gdbserver_state.signal; + gdbserver_state.signal =3D 0; + return sig; +} + +/* Tell the remote gdb that the process has exited due to SIG. */ +void gdb_signalled(CPUArchState *env, int sig) +{ + char buf[4]; + + if (!gdbserver_state.init || gdbserver_state.connection->fd < 0) { + return; + } + + snprintf(buf, sizeof(buf), "X%02x", gdb_target_signal_to_gdb(sig)); + gdb_put_packet(buf); +} + +static void gdb_accept_init(int fd) +{ + gdb_init_gdbserver_state(); + gdb_create_default_process(&gdbserver_state); + gdbserver_state.processes[0].attached =3D true; + gdbserver_state.c_cpu =3D gdb_first_attached_cpu(); + gdbserver_state.g_cpu =3D gdbserver_state.c_cpu; + gdbserver_state.connection->fd =3D fd; + gdb_has_xml =3D false; +} + +static bool gdb_accept_socket(int gdb_fd) +{ + int fd; + + for(;;) { + fd =3D accept(gdb_fd, NULL, NULL); + if (fd < 0 && errno !=3D EINTR) { + perror("accept socket"); + return false; + } else if (fd >=3D 0) { + qemu_set_cloexec(fd); + break; + } + } + + gdb_accept_init(fd); + return true; +} + +static int gdbserver_open_socket(const char *path) +{ + struct sockaddr_un sockaddr =3D {}; + int fd, ret; + + fd =3D socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + perror("create socket"); + return -1; + } + + sockaddr.sun_family =3D AF_UNIX; + pstrcpy(sockaddr.sun_path, sizeof(sockaddr.sun_path) - 1, path); + ret =3D bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)); + if (ret < 0) { + perror("bind socket"); + close(fd); + return -1; + } + ret =3D listen(fd, 1); + if (ret < 0) { + perror("listen socket"); + close(fd); + return -1; + } + + return fd; +} + +static bool gdb_accept_tcp(int gdb_fd) +{ + struct sockaddr_in sockaddr =3D {}; + socklen_t len; + int fd; + + for(;;) { + len =3D sizeof(sockaddr); + fd =3D accept(gdb_fd, (struct sockaddr *)&sockaddr, &len); + if (fd < 0 && errno !=3D EINTR) { + perror("accept"); + return false; + } else if (fd >=3D 0) { + qemu_set_cloexec(fd); + break; + } + } + + /* set short latency */ + if (socket_set_nodelay(fd)) { + perror("setsockopt"); + close(fd); + return false; + } + + gdb_accept_init(fd); + return true; +} + +static int gdbserver_open_port(int port) +{ + struct sockaddr_in sockaddr; + int fd, ret; + + fd =3D socket(PF_INET, SOCK_STREAM, 0); + if (fd < 0) { + perror("socket"); + return -1; + } + qemu_set_cloexec(fd); + + socket_set_fast_reuse(fd); + + sockaddr.sin_family =3D AF_INET; + sockaddr.sin_port =3D htons(port); + sockaddr.sin_addr.s_addr =3D 0; + ret =3D bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)); + if (ret < 0) { + perror("bind"); + close(fd); + return -1; + } + ret =3D listen(fd, 1); + if (ret < 0) { + perror("listen"); + close(fd); + return -1; + } + + return fd; +} + +int gdbserver_start(const char *port_or_path) +{ + int port =3D g_ascii_strtoull(port_or_path, NULL, 10); + int gdb_fd; + + if (port > 0) { + gdb_fd =3D gdbserver_open_port(port); + } else { + gdb_fd =3D gdbserver_open_socket(port_or_path); + } + + if (gdb_fd < 0) { + return -1; + } + + if (port > 0 && gdb_accept_tcp(gdb_fd)) { + return 0; + } else if (gdb_accept_socket(gdb_fd)) { + gdbserver_state.connection->socket_path =3D g_strdup(port_or_path); + return 0; + } + + /* gone wrong */ + close(gdb_fd); + return -1; +} + +/* Disable gdb stub for child processes. */ +void gdbserver_fork(CPUState *cpu) +{ + if (!gdbserver_state.init || gdbserver_state.connection->fd < 0) { + return; + } + close(gdbserver_state.connection->fd); + gdbserver_state.connection->fd =3D -1; + cpu_breakpoint_remove_all(cpu, BP_GDB); + /* no cpu_watchpoint_remove_all for user-mode */ +} + +/* + * Execution state helpers + */ + +void gdb_continue(void) +{ + gdbserver_state.connection->running_state =3D 1; + trace_gdbstub_op_continue(); +} + +/* + * Resume execution, for user-mode emulation it's equivalent to + * gdb_continue. + */ +int gdb_continue_partial(char *newstates) +{ + CPUState *cpu; + int res =3D 0; + /* + * This is not exactly accurate, but it's an improvement compared to t= he + * previous situation, where only one CPU would be single-stepped. + */ + CPU_FOREACH(cpu) { + if (newstates[cpu->cpu_index] =3D=3D 's') { + trace_gdbstub_op_stepping(cpu->cpu_index); + cpu_single_step(cpu, gdbserver_state.sstep_flags); + } + } + gdbserver_state.connection->running_state =3D 1; + return res; +} + +/* + * Break/Watch point helpers + */ + bool gdb_supports_guest_debug(void) { /* user-mode =3D=3D TCG =3D=3D supported */ diff --git a/linux-user/main.c b/linux-user/main.c index a17fed045b..68aaf4bd58 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -40,6 +40,7 @@ #include "qemu/plugin.h" #include "exec/exec-all.h" #include "exec/gdbstub.h" +#include "gdbstub/user.h" #include "tcg/tcg.h" #include "qemu/timer.h" #include "qemu/envlist.h" diff --git a/linux-user/signal.c b/linux-user/signal.c index 61c6fa3fcf..84f06043d8 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -18,7 +18,7 @@ */ #include "qemu/osdep.h" #include "qemu/bitops.h" -#include "exec/gdbstub.h" +#include "gdbstub/user.h" #include "hw/core/tcg-cpu-ops.h" =20 #include diff --git a/gdbstub/meson.build b/gdbstub/meson.build index fc895a2c39..a763cf235d 100644 --- a/gdbstub/meson.build +++ b/gdbstub/meson.build @@ -7,3 +7,5 @@ specific_ss.add(files('gdbstub.c')) softmmu_ss.add(files('softmmu.c')) user_ss.add(files('user.c')) +# and BSD? +specific_ss.add(when: 'CONFIG_LINUX_USER', if_true: files('user-target.c')) --=20 2.34.1 From nobody Wed May 15 20:14:08 2024 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1671189870; cv=none; d=zohomail.com; s=zohoarc; b=YzV2UniDwbkqw7h2dTpfrMqGrKI6jB8RNCGun+S7VOkFNlUmzQTOvtAwgr4dA21DChA+41hgHDgeITUWzIvlAaOonZwhZ8L3UJPa8tM177EpDb5Hp+RhmyIJwEZQHk/nr79vzB12xjwakgYi2yn12F5Q2qe46O79noHw88nh2FA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1671189870; h=Content-Type: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=AhJcdSXB4V4j08EKX0Yv20fK6m+tnCmhDQDXx34AShI=; b=FY6wv1Uf2dcM24GCBLTKOjiyYPlJz5X9pWuHeVuIMYMUC02fxrHJZ6EEK5t8JsNxu2UECGmMehBvo7fNrxKAuZAEDj7MgCNLx3e0L2VBqXsJYdxgk9PtVrQrwix3FgyDijLYePi0cXxzAmcLHxISk+XbLOHNJnY24HhbkxSQ6Bg= 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 1671189870725991.635202269607; Fri, 16 Dec 2022 03:24:30 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p68nT-00029Z-NB; Fri, 16 Dec 2022 06:22:35 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p68nG-00027k-RB for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:25 -0500 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1p68n8-00069Q-Ip for qemu-devel@nongnu.org; Fri, 16 Dec 2022 06:22:22 -0500 Received: by mail-wm1-x32f.google.com with SMTP id ay40so1642419wmb.2 for ; Fri, 16 Dec 2022 03:22:14 -0800 (PST) Received: from zen.linaroharston ([185.81.254.11]) by smtp.gmail.com with ESMTPSA id 1-20020a05600c228100b003d23928b654sm9045807wmf.11.2022.12.16.03.22.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Dec 2022 03:22:09 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id E9E251FFBA; Fri, 16 Dec 2022 11:22:08 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; 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=AhJcdSXB4V4j08EKX0Yv20fK6m+tnCmhDQDXx34AShI=; b=YKWvSEmPU1MQPXRphdqkxZxqjRKzdqBo1e79yjjyPd9c68Rpy0ksBN6SfowZVItai0 efnUxI0Eq/0UH6PoR4Ofjl4Iy/bDmqqIPpVYyBL62Y4oyWWwE0I03BUZJLf6mWAFYOlA vxuwvNVxx0Y/JLHzWVjJV4EMXjbo/4aT8qNsqJ0ontW3CI5H5Zn6IcHfu17nA2NEcM/O uOrZigVlwH40FKww+N4LJq3mwBLkh2PpG4g8zYvFFfJgfts+aRaWijFgDc4R+/gRrPJN 2OAST0kBEALgIeBLmMw2YLtJ7c1VbDOMe5NCiC7NHKi5neQ4SzZJoDWrl5GxSShvi7Ma Clfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=AhJcdSXB4V4j08EKX0Yv20fK6m+tnCmhDQDXx34AShI=; b=dCYeLVBpYmxpNO0FUZZ7yNyaac6RhJHH32Bgwn4nU81c+4Mv/zQA43SioXRU7SzxkA o+XSQT98jw2QeFJCsQTVpdRRpzpnq4zp2MR48SIYJvpdt/UA8QnExkWMe3WM4nG6IETY a4w9W1cNLZqdp3o0sCDFzeN/cOGvEMZ3nkYx4rNoAU/zWtamv2bzC898aRBXxyHOm9Xm pV6TayWbVc8zchOJrZjVdiGgtYdd7p6M+yWfRbIdd/W3ezJYHq75yW1/AKjhmEkB0tki +WGitxJQ6FNbv5v9eZDMZYjAgb070C5CeAV4DCav038pXz7EaZPhM2ndog0yzEd7Bn6U wnvg== X-Gm-Message-State: ANoB5pk5RuHNN74OhLBCesmuH7wfHnGmbpWvLQ4dG1LHg/j+bfYq1YBR IrYCmuldm8/lMzBR7qxyXi9Ntw== X-Google-Smtp-Source: AA0mqf68lMC8/t8YA9UpxWPl0s9U4OGIGFkoK3W5T6goSdmZxgQ39PbjUbeIh8QZ2sv1KDwiagjJEw== X-Received: by 2002:a7b:c017:0:b0:3cf:8e5d:7184 with SMTP id c23-20020a7bc017000000b003cf8e5d7184mr24713399wmb.28.1671189732664; Fri, 16 Dec 2022 03:22:12 -0800 (PST) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: f4bug@amsat.org, mads@ynddal.dk, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Paolo Bonzini , Richard Henderson , Warner Losh , Kyle Evans , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Laurent Vivier , "Dr. David Alan Gilbert" , Markus Armbruster , Peter Maydell , Michael Rolnik , "Edgar E. Iglesias" , Taylor Simpson , Marcelo Tosatti , Sunil Muthuswamy , Song Gao , Xiaojuan Yang , Aurelien Jarno , Jiaxun Yang , Aleksandar Rikalo , Chris Wulff , Marek Vasut , Stafford Horne , Daniel Henrique Barboza , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , David Gibson , Greg Kurz , Palmer Dabbelt , Alistair Francis , Bin Meng , Yoshinori Sato , Thomas Huth , David Hildenbrand , Ilya Leoshkevich , Halil Pasic , Christian Borntraeger , Mark Cave-Ayland , Artyom Tarasenko , Bastian Koppelmann , Max Filippov , kvm@vger.kernel.org (open list:Overall KVM CPUs), qemu-arm@nongnu.org (open list:ARM TCG CPUs), qemu-ppc@nongnu.org (open list:PowerPC TCG CPUs), qemu-riscv@nongnu.org (open list:RISC-V TCG CPUs), qemu-s390x@nongnu.org (open list:S390 general arch...) Subject: [PATCH v1 10/10] gdbstub: retire exec/gdbstub.h Date: Fri, 16 Dec 2022 11:22:06 +0000 Message-Id: <20221216112206.3171578-11-alex.bennee@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221216112206.3171578-1-alex.bennee@linaro.org> References: <20221216112206.3171578-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2a00:1450:4864:20::32f; envelope-from=alex.bennee@linaro.org; helo=mail-wm1-x32f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1671189872816100006 Finally split the gdbstub API across multiple headers: - common.h, all the standard APIs registering and semihosting - user.h, user-mode specific APIs - helpers.h, the register helpers that need to be host/target aware The aim is to reduce the dependence on cpu.h and target specific awareness where we can. Signed-off-by: Alex Benn=C3=A9e --- bsd-user/qemu.h | 2 +- include/exec/gdbstub.h | 235 ------------------------- include/gdbstub/common.h | 151 ++++++++++++++++ include/gdbstub/helpers.h | 101 +++++++++++ accel/kvm/kvm-all.c | 2 +- accel/tcg/tcg-accel-ops.c | 2 +- gdbstub/gdbstub.c | 2 +- gdbstub/softmmu.c | 4 +- gdbstub/user-target.c | 2 +- gdbstub/user.c | 2 +- linux-user/exit.c | 2 +- linux-user/main.c | 2 +- monitor/misc.c | 2 +- semihosting/arm-compat-semi.c | 2 +- semihosting/console.c | 2 +- semihosting/guestfd.c | 2 +- semihosting/syscalls.c | 3 +- softmmu/cpus.c | 2 +- softmmu/runstate.c | 2 +- softmmu/vl.c | 2 +- stubs/gdbstub.c | 2 +- target/alpha/gdbstub.c | 2 +- target/arm/gdbstub.c | 3 +- target/arm/gdbstub64.c | 2 +- target/arm/helper-a64.c | 2 +- target/arm/kvm64.c | 2 +- target/arm/m_helper.c | 2 +- target/avr/gdbstub.c | 2 +- target/cris/gdbstub.c | 2 +- target/hexagon/gdbstub.c | 2 +- target/hppa/gdbstub.c | 2 +- target/i386/gdbstub.c | 2 +- target/i386/kvm/kvm.c | 2 +- target/i386/whpx/whpx-all.c | 2 +- target/loongarch/gdbstub.c | 3 +- target/m68k/gdbstub.c | 2 +- target/m68k/helper.c | 3 +- target/m68k/m68k-semi.c | 4 +- target/microblaze/gdbstub.c | 2 +- target/mips/gdbstub.c | 2 +- target/mips/tcg/sysemu/mips-semi.c | 3 +- target/nios2/cpu.c | 2 +- target/nios2/nios2-semi.c | 3 +- target/openrisc/gdbstub.c | 2 +- target/openrisc/interrupt.c | 2 +- target/openrisc/mmu.c | 2 +- target/ppc/cpu_init.c | 2 +- target/ppc/gdbstub.c | 3 +- target/ppc/kvm.c | 2 +- target/riscv/gdbstub.c | 3 +- target/rx/gdbstub.c | 2 +- target/s390x/gdbstub.c | 3 +- target/s390x/helper.c | 2 +- target/s390x/kvm/kvm.c | 2 +- target/sh4/gdbstub.c | 2 +- target/sparc/gdbstub.c | 2 +- target/tricore/gdbstub.c | 2 +- target/xtensa/core-dc232b.c | 2 +- target/xtensa/core-dc233c.c | 2 +- target/xtensa/core-de212.c | 2 +- target/xtensa/core-de233_fpu.c | 2 +- target/xtensa/core-dsp3400.c | 2 +- target/xtensa/core-fsf.c | 2 +- target/xtensa/core-lx106.c | 2 +- target/xtensa/core-sample_controller.c | 2 +- target/xtensa/core-test_kc705_be.c | 2 +- target/xtensa/core-test_mmuhifi_c3.c | 2 +- target/xtensa/gdbstub.c | 2 +- target/xtensa/helper.c | 2 +- MAINTAINERS | 1 - scripts/feature_to_c.sh | 2 +- target/xtensa/import_core.sh | 2 +- 72 files changed, 332 insertions(+), 305 deletions(-) delete mode 100644 include/exec/gdbstub.h create mode 100644 include/gdbstub/helpers.h diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h index be6105385e..d76d17cdc5 100644 --- a/bsd-user/qemu.h +++ b/bsd-user/qemu.h @@ -36,7 +36,7 @@ extern char **environ; #include "target_os_vmparam.h" #include "target_os_signal.h" #include "target.h" -#include "exec/gdbstub.h" +#include "gdbstub/user.h" =20 /* * This struct is used to hold certain information about the image. Basic= ally, diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h deleted file mode 100644 index d1eb96f807..0000000000 --- a/include/exec/gdbstub.h +++ /dev/null @@ -1,235 +0,0 @@ -#ifndef GDBSTUB_H -#define GDBSTUB_H - -#define DEFAULT_GDBSTUB_PORT "1234" - -/* GDB breakpoint/watchpoint types */ -#define GDB_BREAKPOINT_SW 0 -#define GDB_BREAKPOINT_HW 1 -#define GDB_WATCHPOINT_WRITE 2 -#define GDB_WATCHPOINT_READ 3 -#define GDB_WATCHPOINT_ACCESS 4 - -/* For gdb file i/o remote protocol open flags. */ -#define GDB_O_RDONLY 0 -#define GDB_O_WRONLY 1 -#define GDB_O_RDWR 2 -#define GDB_O_APPEND 8 -#define GDB_O_CREAT 0x200 -#define GDB_O_TRUNC 0x400 -#define GDB_O_EXCL 0x800 - -/* For gdb file i/o remote protocol errno values */ -#define GDB_EPERM 1 -#define GDB_ENOENT 2 -#define GDB_EINTR 4 -#define GDB_EBADF 9 -#define GDB_EACCES 13 -#define GDB_EFAULT 14 -#define GDB_EBUSY 16 -#define GDB_EEXIST 17 -#define GDB_ENODEV 19 -#define GDB_ENOTDIR 20 -#define GDB_EISDIR 21 -#define GDB_EINVAL 22 -#define GDB_ENFILE 23 -#define GDB_EMFILE 24 -#define GDB_EFBIG 27 -#define GDB_ENOSPC 28 -#define GDB_ESPIPE 29 -#define GDB_EROFS 30 -#define GDB_ENAMETOOLONG 91 -#define GDB_EUNKNOWN 9999 - -/* For gdb file i/o remote protocol lseek whence. */ -#define GDB_SEEK_SET 0 -#define GDB_SEEK_CUR 1 -#define GDB_SEEK_END 2 - -/* For gdb file i/o stat/fstat. */ -typedef uint32_t gdb_mode_t; -typedef uint32_t gdb_time_t; - -struct gdb_stat { - uint32_t gdb_st_dev; /* device */ - uint32_t gdb_st_ino; /* inode */ - gdb_mode_t gdb_st_mode; /* protection */ - uint32_t gdb_st_nlink; /* number of hard links */ - uint32_t gdb_st_uid; /* user ID of owner */ - uint32_t gdb_st_gid; /* group ID of owner */ - uint32_t gdb_st_rdev; /* device type (if inode device) */ - uint64_t gdb_st_size; /* total size, in bytes */ - uint64_t gdb_st_blksize; /* blocksize for filesystem I/O */ - uint64_t gdb_st_blocks; /* number of blocks allocated */ - gdb_time_t gdb_st_atime; /* time of last access */ - gdb_time_t gdb_st_mtime; /* time of last modification */ - gdb_time_t gdb_st_ctime; /* time of last change */ -} QEMU_PACKED; - -struct gdb_timeval { - gdb_time_t tv_sec; /* second */ - uint64_t tv_usec; /* microsecond */ -} QEMU_PACKED; - -typedef void (*gdb_syscall_complete_cb)(CPUState *cpu, uint64_t ret, int e= rr); - -/** - * gdb_do_syscall: - * @cb: function to call when the system call has completed - * @fmt: gdb syscall format string - * ...: list of arguments to interpolate into @fmt - * - * Send a GDB syscall request. This function will return immediately; - * the callback function will be called later when the remote system - * call has completed. - * - * @fmt should be in the 'call-id,parameter,parameter...' format documented - * for the F request packet in the GDB remote protocol. A limited set of - * printf-style format specifiers is supported: - * %x - target_ulong argument printed in hex - * %lx - 64-bit argument printed in hex - * %s - string pointer (target_ulong) and length (int) pair - */ -void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...); -/** - * gdb_do_syscallv: - * @cb: function to call when the system call has completed - * @fmt: gdb syscall format string - * @va: arguments to interpolate into @fmt - * - * As gdb_do_syscall, but taking a va_list rather than a variable - * argument list. - */ -void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list = va); -int use_gdb_syscalls(void); - -#ifdef CONFIG_USER_ONLY -#endif - -/* Get or set a register. Returns the size of the register. */ -typedef int (*gdb_get_reg_cb)(CPUArchState *env, GByteArray *buf, int reg); -typedef int (*gdb_set_reg_cb)(CPUArchState *env, uint8_t *buf, int reg); -void gdb_register_coprocessor(CPUState *cpu, - gdb_get_reg_cb get_reg, gdb_set_reg_cb set_r= eg, - int num_regs, const char *xml, int g_pos); - -#ifdef NEED_CPU_H -#include "cpu.h" - -/* - * The GDB remote protocol transfers values in target byte order. As - * the gdbstub may be batching up several register values we always - * append to the array. - */ - -static inline int gdb_get_reg8(GByteArray *buf, uint8_t val) -{ - g_byte_array_append(buf, &val, 1); - return 1; -} - -static inline int gdb_get_reg16(GByteArray *buf, uint16_t val) -{ - uint16_t to_word =3D tswap16(val); - g_byte_array_append(buf, (uint8_t *) &to_word, 2); - return 2; -} - -static inline int gdb_get_reg32(GByteArray *buf, uint32_t val) -{ - uint32_t to_long =3D tswap32(val); - g_byte_array_append(buf, (uint8_t *) &to_long, 4); - return 4; -} - -static inline int gdb_get_reg64(GByteArray *buf, uint64_t val) -{ - uint64_t to_quad =3D tswap64(val); - g_byte_array_append(buf, (uint8_t *) &to_quad, 8); - return 8; -} - -static inline int gdb_get_reg128(GByteArray *buf, uint64_t val_hi, - uint64_t val_lo) -{ - uint64_t to_quad; -#if TARGET_BIG_ENDIAN - to_quad =3D tswap64(val_hi); - g_byte_array_append(buf, (uint8_t *) &to_quad, 8); - to_quad =3D tswap64(val_lo); - g_byte_array_append(buf, (uint8_t *) &to_quad, 8); -#else - to_quad =3D tswap64(val_lo); - g_byte_array_append(buf, (uint8_t *) &to_quad, 8); - to_quad =3D tswap64(val_hi); - g_byte_array_append(buf, (uint8_t *) &to_quad, 8); -#endif - return 16; -} - -static inline int gdb_get_zeroes(GByteArray *array, size_t len) -{ - guint oldlen =3D array->len; - g_byte_array_set_size(array, oldlen + len); - memset(array->data + oldlen, 0, len); - - return len; -} - -/** - * gdb_get_reg_ptr: get pointer to start of last element - * @len: length of element - * - * This is a helper function to extract the pointer to the last - * element for additional processing. Some front-ends do additional - * dynamic swapping of the elements based on CPU state. - */ -static inline uint8_t * gdb_get_reg_ptr(GByteArray *buf, int len) -{ - return buf->data + buf->len - len; -} - -#if TARGET_LONG_BITS =3D=3D 64 -#define gdb_get_regl(buf, val) gdb_get_reg64(buf, val) -#define ldtul_p(addr) ldq_p(addr) -#else -#define gdb_get_regl(buf, val) gdb_get_reg32(buf, val) -#define ldtul_p(addr) ldl_p(addr) -#endif - -#endif /* NEED_CPU_H */ - -/** - * gdbserver_start: start the gdb server - * @port_or_device: connection spec for gdb - * - * For CONFIG_USER this is either a tcp port or a path to a fifo. For - * system emulation you can use a full chardev spec for your gdbserver - * port. - */ -int gdbserver_start(const char *port_or_device); - -/** - * gdb_exit: exit gdb session, reporting inferior status - * @code: exit code reported - * - * This closes the session and sends a final packet to GDB reporting - * the exit status of the program. It also cleans up any connections - * detritus before returning. - */ -void gdb_exit(int code); - -void gdb_set_stop_cpu(CPUState *cpu); - -/** - * gdb_has_xml: - * This is an ugly hack to cope with both new and old gdb. - * If gdb sends qXfer:features:read then assume we're talking to a newish - * gdb that understands target descriptions. - */ -extern bool gdb_has_xml; - -/* in gdbstub-xml.c, generated by scripts/feature_to_c.sh */ -extern const char *const xml_builtin[][2]; - -#endif diff --git a/include/gdbstub/common.h b/include/gdbstub/common.h index f928dbc487..680250273b 100644 --- a/include/gdbstub/common.h +++ b/include/gdbstub/common.h @@ -9,6 +9,157 @@ #ifndef GDBSTUB_COMMON_H #define GDBSTUB_COMMON_H =20 +#define DEFAULT_GDBSTUB_PORT "1234" + +/* GDB breakpoint/watchpoint types */ +#define GDB_BREAKPOINT_SW 0 +#define GDB_BREAKPOINT_HW 1 +#define GDB_WATCHPOINT_WRITE 2 +#define GDB_WATCHPOINT_READ 3 +#define GDB_WATCHPOINT_ACCESS 4 + +/* For gdb file i/o remote protocol open flags. */ +#define GDB_O_RDONLY 0 +#define GDB_O_WRONLY 1 +#define GDB_O_RDWR 2 +#define GDB_O_APPEND 8 +#define GDB_O_CREAT 0x200 +#define GDB_O_TRUNC 0x400 +#define GDB_O_EXCL 0x800 + +/* For gdb file i/o remote protocol errno values */ +#define GDB_EPERM 1 +#define GDB_ENOENT 2 +#define GDB_EINTR 4 +#define GDB_EBADF 9 +#define GDB_EACCES 13 +#define GDB_EFAULT 14 +#define GDB_EBUSY 16 +#define GDB_EEXIST 17 +#define GDB_ENODEV 19 +#define GDB_ENOTDIR 20 +#define GDB_EISDIR 21 +#define GDB_EINVAL 22 +#define GDB_ENFILE 23 +#define GDB_EMFILE 24 +#define GDB_EFBIG 27 +#define GDB_ENOSPC 28 +#define GDB_ESPIPE 29 +#define GDB_EROFS 30 +#define GDB_ENAMETOOLONG 91 +#define GDB_EUNKNOWN 9999 + +/* For gdb file i/o remote protocol lseek whence. */ +#define GDB_SEEK_SET 0 +#define GDB_SEEK_CUR 1 +#define GDB_SEEK_END 2 + +/* For gdb file i/o stat/fstat. */ +typedef uint32_t gdb_mode_t; +typedef uint32_t gdb_time_t; + +struct gdb_stat { + uint32_t gdb_st_dev; /* device */ + uint32_t gdb_st_ino; /* inode */ + gdb_mode_t gdb_st_mode; /* protection */ + uint32_t gdb_st_nlink; /* number of hard links */ + uint32_t gdb_st_uid; /* user ID of owner */ + uint32_t gdb_st_gid; /* group ID of owner */ + uint32_t gdb_st_rdev; /* device type (if inode device) */ + uint64_t gdb_st_size; /* total size, in bytes */ + uint64_t gdb_st_blksize; /* blocksize for filesystem I/O */ + uint64_t gdb_st_blocks; /* number of blocks allocated */ + gdb_time_t gdb_st_atime; /* time of last access */ + gdb_time_t gdb_st_mtime; /* time of last modification */ + gdb_time_t gdb_st_ctime; /* time of last change */ +} QEMU_PACKED; + +struct gdb_timeval { + gdb_time_t tv_sec; /* second */ + uint64_t tv_usec; /* microsecond */ +} QEMU_PACKED; + +typedef void (*gdb_syscall_complete_cb)(CPUState *cpu, uint64_t ret, int e= rr); + +/** + * gdb_do_syscall: + * @cb: function to call when the system call has completed + * @fmt: gdb syscall format string + * ...: list of arguments to interpolate into @fmt + * + * Send a GDB syscall request. This function will return immediately; + * the callback function will be called later when the remote system + * call has completed. + * + * @fmt should be in the 'call-id,parameter,parameter...' format documented + * for the F request packet in the GDB remote protocol. A limited set of + * printf-style format specifiers is supported: + * %x - target_ulong argument printed in hex + * %lx - 64-bit argument printed in hex + * %s - string pointer (target_ulong) and length (int) pair + */ +void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...); +/** + * gdb_do_syscallv: + * @cb: function to call when the system call has completed + * @fmt: gdb syscall format string + * @va: arguments to interpolate into @fmt + * + * As gdb_do_syscall, but taking a va_list rather than a variable + * argument list. + */ +void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list = va); + +/** + * use_gdb_syscalls() - use gdb syscalls or native file IO for semihosting + */ +int use_gdb_syscalls(void); + +/** + * gdbserver_start: start the gdb server + * @port_or_device: connection spec for gdb + * + * For CONFIG_USER this is either a tcp port or a path to a fifo. For + * system emulation you can use a full chardev spec for your gdbserver + * port. + */ +int gdbserver_start(const char *port_or_device); + +/** + * gdb_exit: exit gdb session, reporting inferior status + * @code: exit code reported + * + * This closes the session and sends a final packet to GDB reporting + * the exit status of the program. It also cleans up any connections + * detritus before returning. + */ +void gdb_exit(int code); + +/** + * gdb_set_stop_cpu() - signal which CPU just halted + * + * This is called by the core translator to signal which CPU caused the + * current stoppage. + */ +void gdb_set_stop_cpu(CPUState *cpu); + +/** + * gdb_has_xml: + * This is an ugly hack to cope with both new and old gdb. + * If gdb sends qXfer:features:read then assume we're talking to a newish + * gdb that understands target descriptions. + */ +extern bool gdb_has_xml; + +/* in gdbstub-xml.c, generated by scripts/feature_to_c.sh */ +extern const char *const xml_builtin[][2]; + +/* Get or set a register. Returns the size of the register. */ +typedef int (*gdb_get_reg_cb)(CPUArchState *env, GByteArray *buf, int reg); +typedef int (*gdb_set_reg_cb)(CPUArchState *env, uint8_t *buf, int reg); +void gdb_register_coprocessor(CPUState *cpu, + gdb_get_reg_cb get_reg, gdb_set_reg_cb set_r= eg, + int num_regs, const char *xml, int g_pos); =20 =20 #endif /* GDBSTUB_COMMON_H */ diff --git a/include/gdbstub/helpers.h b/include/gdbstub/helpers.h new file mode 100644 index 0000000000..1fe5602f96 --- /dev/null +++ b/include/gdbstub/helpers.h @@ -0,0 +1,101 @@ +/* + * gdbstub helpers + * + * These are all used by the various frontends and have to be host + * aware to ensure things are store in target order. + * + * Copyright (c) 2022 Linaro Ltd + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef _GDBSTUB_HELPERS_H_ +#define _GDBSTUB_HELPERS_H_ + +#ifdef NEED_CPU_H +#include "cpu.h" + +/* + * The GDB remote protocol transfers values in target byte order. As + * the gdbstub may be batching up several register values we always + * append to the array. + */ + +static inline int gdb_get_reg8(GByteArray *buf, uint8_t val) +{ + g_byte_array_append(buf, &val, 1); + return 1; +} + +static inline int gdb_get_reg16(GByteArray *buf, uint16_t val) +{ + uint16_t to_word =3D tswap16(val); + g_byte_array_append(buf, (uint8_t *) &to_word, 2); + return 2; +} + +static inline int gdb_get_reg32(GByteArray *buf, uint32_t val) +{ + uint32_t to_long =3D tswap32(val); + g_byte_array_append(buf, (uint8_t *) &to_long, 4); + return 4; +} + +static inline int gdb_get_reg64(GByteArray *buf, uint64_t val) +{ + uint64_t to_quad =3D tswap64(val); + g_byte_array_append(buf, (uint8_t *) &to_quad, 8); + return 8; +} + +static inline int gdb_get_reg128(GByteArray *buf, uint64_t val_hi, + uint64_t val_lo) +{ + uint64_t to_quad; +#if TARGET_BIG_ENDIAN + to_quad =3D tswap64(val_hi); + g_byte_array_append(buf, (uint8_t *) &to_quad, 8); + to_quad =3D tswap64(val_lo); + g_byte_array_append(buf, (uint8_t *) &to_quad, 8); +#else + to_quad =3D tswap64(val_lo); + g_byte_array_append(buf, (uint8_t *) &to_quad, 8); + to_quad =3D tswap64(val_hi); + g_byte_array_append(buf, (uint8_t *) &to_quad, 8); +#endif + return 16; +} + +static inline int gdb_get_zeroes(GByteArray *array, size_t len) +{ + guint oldlen =3D array->len; + g_byte_array_set_size(array, oldlen + len); + memset(array->data + oldlen, 0, len); + + return len; +} + +/** + * gdb_get_reg_ptr: get pointer to start of last element + * @len: length of element + * + * This is a helper function to extract the pointer to the last + * element for additional processing. Some front-ends do additional + * dynamic swapping of the elements based on CPU state. + */ +static inline uint8_t * gdb_get_reg_ptr(GByteArray *buf, int len) +{ + return buf->data + buf->len - len; +} + +#if TARGET_LONG_BITS =3D=3D 64 +#define gdb_get_regl(buf, val) gdb_get_reg64(buf, val) +#define ldtul_p(addr) ldq_p(addr) +#else +#define gdb_get_regl(buf, val) gdb_get_reg32(buf, val) +#define ldtul_p(addr) ldl_p(addr) +#endif + +#endif /* NEED_CPU_H */ + +#endif /* _GDBSTUB_HELPERS_H_ */ diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index e86c33e0e6..93926e557e 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -27,7 +27,7 @@ #include "hw/pci/msi.h" #include "hw/pci/msix.h" #include "hw/s390x/adapter.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "sysemu/kvm_int.h" #include "sysemu/runstate.h" #include "sysemu/cpus.h" diff --git a/accel/tcg/tcg-accel-ops.c b/accel/tcg/tcg-accel-ops.c index 19cbf1db3a..08435b72b4 100644 --- a/accel/tcg/tcg-accel-ops.c +++ b/accel/tcg/tcg-accel-ops.c @@ -33,7 +33,7 @@ #include "qemu/guest-random.h" #include "exec/exec-all.h" #include "exec/hwaddr.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" =20 #include "tcg-accel-ops.h" #include "tcg-accel-ops-mttcg.h" diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c index fa68a77066..f3fec3a266 100644 --- a/gdbstub/gdbstub.c +++ b/gdbstub/gdbstub.c @@ -28,7 +28,7 @@ #include "qemu/cutils.h" #include "qemu/module.h" #include "trace.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #ifdef CONFIG_USER_ONLY #include "gdbstub/user.h" #else diff --git a/gdbstub/softmmu.c b/gdbstub/softmmu.c index 1154a313cb..3540d5892b 100644 --- a/gdbstub/softmmu.c +++ b/gdbstub/softmmu.c @@ -14,7 +14,6 @@ #include "qapi/error.h" #include "qemu/error-report.h" #include "qemu/cutils.h" -#include "exec/gdbstub.h" #include "exec/hwaddr.h" #include "exec/tb-flush.h" #include "sysemu/cpus.h" @@ -26,8 +25,9 @@ #include "chardev/char.h" #include "chardev/char-fe.h" #include "monitor/monitor.h" -#include "trace.h" +#include "gdbstub/common.h" #include "internals.h" +#include "trace.h" =20 /* system emulation connection details */ typedef struct GDBConnection { diff --git a/gdbstub/user-target.c b/gdbstub/user-target.c index 83e04e1c23..a959b6d9dc 100644 --- a/gdbstub/user-target.c +++ b/gdbstub/user-target.c @@ -8,7 +8,7 @@ */ =20 #include "qemu/osdep.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "qemu.h" #include "internals.h" =20 diff --git a/gdbstub/user.c b/gdbstub/user.c index 3492d9b68a..65ea52479e 100644 --- a/gdbstub/user.c +++ b/gdbstub/user.c @@ -14,7 +14,7 @@ #include "qemu/sockets.h" #include "exec/hwaddr.h" #include "exec/tb-flush.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "gdbstub/user.h" #include "hw/core/cpu.h" #include "trace.h" diff --git a/linux-user/exit.c b/linux-user/exit.c index fa6ef0b9b4..fb65924c16 100644 --- a/linux-user/exit.c +++ b/linux-user/exit.c @@ -17,7 +17,7 @@ * along with this program; if not, see . */ #include "qemu/osdep.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "qemu.h" #include "user-internals.h" #ifdef CONFIG_GPROF diff --git a/linux-user/main.c b/linux-user/main.c index 68aaf4bd58..ced3c8b1df 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -39,7 +39,7 @@ #include "qemu/module.h" #include "qemu/plugin.h" #include "exec/exec-all.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "gdbstub/user.h" #include "tcg/tcg.h" #include "qemu/timer.h" diff --git a/monitor/misc.c b/monitor/misc.c index c7eb673ffd..3bf5f6afc0 100644 --- a/monitor/misc.c +++ b/monitor/misc.c @@ -29,7 +29,7 @@ #include "hw/pci/pci.h" #include "sysemu/watchdog.h" #include "hw/loader.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "net/net.h" #include "net/slirp.h" #include "ui/qemu-spice.h" diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c index 62d8bae97f..bb43aa988c 100644 --- a/semihosting/arm-compat-semi.c +++ b/semihosting/arm-compat-semi.c @@ -33,7 +33,7 @@ =20 #include "qemu/osdep.h" #include "qemu/timer.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "semihosting/semihost.h" #include "semihosting/console.h" #include "semihosting/common-semi.h" diff --git a/semihosting/console.c b/semihosting/console.c index 5d61e8207e..b3e999fbcf 100644 --- a/semihosting/console.c +++ b/semihosting/console.c @@ -18,7 +18,7 @@ #include "qemu/osdep.h" #include "semihosting/semihost.h" #include "semihosting/console.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "exec/exec-all.h" #include "qemu/log.h" #include "chardev/char.h" diff --git a/semihosting/guestfd.c b/semihosting/guestfd.c index b05c52f26f..757c63f6fe 100644 --- a/semihosting/guestfd.c +++ b/semihosting/guestfd.c @@ -9,7 +9,7 @@ */ =20 #include "qemu/osdep.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "semihosting/semihost.h" #include "semihosting/guestfd.h" #ifdef CONFIG_USER_ONLY diff --git a/semihosting/syscalls.c b/semihosting/syscalls.c index 508a0ad88c..6570caece2 100644 --- a/semihosting/syscalls.c +++ b/semihosting/syscalls.c @@ -7,7 +7,8 @@ */ =20 #include "qemu/osdep.h" -#include "exec/gdbstub.h" +#include "exec/cpu-defs.h" +#include "gdbstub/common.h" #include "semihosting/guestfd.h" #include "semihosting/syscalls.h" #include "semihosting/console.h" diff --git a/softmmu/cpus.c b/softmmu/cpus.c index 5a584a8d57..72f35c605d 100644 --- a/softmmu/cpus.c +++ b/softmmu/cpus.c @@ -30,7 +30,7 @@ #include "qapi/qapi-commands-misc.h" #include "qapi/qapi-events-run-state.h" #include "qapi/qmp/qerror.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "sysemu/hw_accel.h" #include "exec/cpu-common.h" #include "qemu/thread.h" diff --git a/softmmu/runstate.c b/softmmu/runstate.c index cab9f6fc07..9bffc5cdbe 100644 --- a/softmmu/runstate.c +++ b/softmmu/runstate.c @@ -30,7 +30,7 @@ #include "crypto/cipher.h" #include "crypto/init.h" #include "exec/cpu-common.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "hw/boards.h" #include "migration/misc.h" #include "migration/postcopy-ram.h" diff --git a/softmmu/vl.c b/softmmu/vl.c index 798e1dc933..b2007641e1 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -66,7 +66,7 @@ #include "sysemu/sysemu.h" #include "sysemu/numa.h" #include "sysemu/hostmem.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "qemu/timer.h" #include "chardev/char.h" #include "qemu/bitmap.h" diff --git a/stubs/gdbstub.c b/stubs/gdbstub.c index 2b7aee50d3..f5f2147caf 100644 --- a/stubs/gdbstub.c +++ b/stubs/gdbstub.c @@ -1,5 +1,5 @@ #include "qemu/osdep.h" -#include "exec/gdbstub.h" /* xml_builtin */ +#include "gdbstub/common.h" /* xml_builtin */ =20 const char *const xml_builtin[][2] =3D { { NULL, NULL } diff --git a/target/alpha/gdbstub.c b/target/alpha/gdbstub.c index 7db14f4431..0f8fa150f8 100644 --- a/target/alpha/gdbstub.c +++ b/target/alpha/gdbstub.c @@ -19,7 +19,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 int alpha_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c index 2f806512d0..f39a1825e6 100644 --- a/target/arm/gdbstub.c +++ b/target/arm/gdbstub.c @@ -19,7 +19,8 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" +#include "gdbstub/helpers.h" #include "internals.h" #include "cpregs.h" =20 diff --git a/target/arm/gdbstub64.c b/target/arm/gdbstub64.c index 07a6746944..48d2888b6f 100644 --- a/target/arm/gdbstub64.c +++ b/target/arm/gdbstub64.c @@ -20,7 +20,7 @@ #include "qemu/log.h" #include "cpu.h" #include "internals.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 int aarch64_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c index 77a8502b6b..b52d381043 100644 --- a/target/arm/helper-a64.c +++ b/target/arm/helper-a64.c @@ -20,7 +20,7 @@ #include "qemu/osdep.h" #include "qemu/units.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "exec/helper-proto.h" #include "qemu/host-utils.h" #include "qemu/log.h" diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c index 1197253d12..ba64e40554 100644 --- a/target/arm/kvm64.c +++ b/target/arm/kvm64.c @@ -22,7 +22,7 @@ #include "qemu/error-report.h" #include "qemu/host-utils.h" #include "qemu/main-loop.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "sysemu/runstate.h" #include "sysemu/kvm.h" #include "sysemu/kvm_int.h" diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c index 355cd4d60a..53f1b38ec4 100644 --- a/target/arm/m_helper.c +++ b/target/arm/m_helper.c @@ -12,7 +12,7 @@ #include "trace.h" #include "cpu.h" #include "internals.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "exec/helper-proto.h" #include "qemu/host-utils.h" #include "qemu/main-loop.h" diff --git a/target/avr/gdbstub.c b/target/avr/gdbstub.c index 1c1b908c92..150344d8b9 100644 --- a/target/avr/gdbstub.c +++ b/target/avr/gdbstub.c @@ -19,7 +19,7 @@ */ =20 #include "qemu/osdep.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 int avr_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { diff --git a/target/cris/gdbstub.c b/target/cris/gdbstub.c index 2418d575b1..25c0ca33a5 100644 --- a/target/cris/gdbstub.c +++ b/target/cris/gdbstub.c @@ -19,7 +19,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 int crisv10_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { diff --git a/target/hexagon/gdbstub.c b/target/hexagon/gdbstub.c index d152d01bfe..46083da620 100644 --- a/target/hexagon/gdbstub.c +++ b/target/hexagon/gdbstub.c @@ -16,7 +16,7 @@ */ =20 #include "qemu/osdep.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "cpu.h" #include "internal.h" =20 diff --git a/target/hppa/gdbstub.c b/target/hppa/gdbstub.c index 729c37b2ca..48a514384f 100644 --- a/target/hppa/gdbstub.c +++ b/target/hppa/gdbstub.c @@ -19,7 +19,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 int hppa_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { diff --git a/target/i386/gdbstub.c b/target/i386/gdbstub.c index c3a2cf6f28..255faa70f6 100644 --- a/target/i386/gdbstub.c +++ b/target/i386/gdbstub.c @@ -19,7 +19,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "include/gdbstub/helpers.h" =20 #ifdef TARGET_X86_64 static const int gpr_map[16] =3D { diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 0ab4e0734a..d169cf9dc7 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -34,7 +34,7 @@ #include "hyperv.h" #include "hyperv-proto.h" =20 -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "qemu/host-utils.h" #include "qemu/main-loop.h" #include "qemu/config-file.h" diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index e738d83e81..430da38778 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -12,7 +12,7 @@ #include "cpu.h" #include "exec/address-spaces.h" #include "exec/ioport.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/accel.h" #include "sysemu/whpx.h" #include "sysemu/cpus.h" diff --git a/target/loongarch/gdbstub.c b/target/loongarch/gdbstub.c index a4d1e28e36..4589978512 100644 --- a/target/loongarch/gdbstub.c +++ b/target/loongarch/gdbstub.c @@ -8,8 +8,9 @@ =20 #include "qemu/osdep.h" #include "cpu.h" +#include "gdbstub/common.h" +#include "gdbstub/helpers.h" #include "internals.h" -#include "exec/gdbstub.h" =20 uint64_t read_fcc(CPULoongArchState *env) { diff --git a/target/m68k/gdbstub.c b/target/m68k/gdbstub.c index eb2d030e14..1e5f033a12 100644 --- a/target/m68k/gdbstub.c +++ b/target/m68k/gdbstub.c @@ -19,7 +19,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 int m68k_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { diff --git a/target/m68k/helper.c b/target/m68k/helper.c index 4621cf2402..1c6938396d 100644 --- a/target/m68k/helper.c +++ b/target/m68k/helper.c @@ -21,7 +21,8 @@ #include "qemu/osdep.h" #include "cpu.h" #include "exec/exec-all.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" +#include "gdbstub/helpers.h" #include "exec/helper-proto.h" #include "fpu/softfloat.h" #include "qemu/qemu-print.h" diff --git a/target/m68k/m68k-semi.c b/target/m68k/m68k-semi.c index 87b1314925..29be977c07 100644 --- a/target/m68k/m68k-semi.c +++ b/target/m68k/m68k-semi.c @@ -20,7 +20,9 @@ #include "qemu/osdep.h" =20 #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" +#include "gdbstub/common.h" +#include "gdbstub/helpers.h" #include "semihosting/syscalls.h" #include "semihosting/softmmu-uaccess.h" #include "hw/boards.h" diff --git a/target/microblaze/gdbstub.c b/target/microblaze/gdbstub.c index 2e6e070051..ad2e0b27cb 100644 --- a/target/microblaze/gdbstub.c +++ b/target/microblaze/gdbstub.c @@ -19,7 +19,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 /* * GDB expects SREGs in the following order: diff --git a/target/mips/gdbstub.c b/target/mips/gdbstub.c index f1c2a2cf6d..62d7b72407 100644 --- a/target/mips/gdbstub.c +++ b/target/mips/gdbstub.c @@ -20,7 +20,7 @@ #include "qemu/osdep.h" #include "cpu.h" #include "internal.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "fpu_helper.h" =20 int mips_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) diff --git a/target/mips/tcg/sysemu/mips-semi.c b/target/mips/tcg/sysemu/mi= ps-semi.c index 85f0567a7f..121eeae6be 100644 --- a/target/mips/tcg/sysemu/mips-semi.c +++ b/target/mips/tcg/sysemu/mips-semi.c @@ -20,7 +20,8 @@ #include "qemu/osdep.h" #include "cpu.h" #include "qemu/log.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" +#include "gdbstub/helpers.h" #include "semihosting/softmmu-uaccess.h" #include "semihosting/semihost.h" #include "semihosting/console.h" diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c index 9a5351bc81..d85d97dd55 100644 --- a/target/nios2/cpu.c +++ b/target/nios2/cpu.c @@ -23,7 +23,7 @@ #include "qapi/error.h" #include "cpu.h" #include "exec/log.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "hw/qdev-properties.h" =20 static void nios2_cpu_set_pc(CPUState *cs, vaddr value) diff --git a/target/nios2/nios2-semi.c b/target/nios2/nios2-semi.c index f76e8588c5..f21b47bb9d 100644 --- a/target/nios2/nios2-semi.c +++ b/target/nios2/nios2-semi.c @@ -23,7 +23,8 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" +#include "gdbstub/helpers.h" #include "semihosting/syscalls.h" #include "semihosting/softmmu-uaccess.h" #include "qemu/log.h" diff --git a/target/openrisc/gdbstub.c b/target/openrisc/gdbstub.c index 095bf76c12..d1074a0581 100644 --- a/target/openrisc/gdbstub.c +++ b/target/openrisc/gdbstub.c @@ -19,7 +19,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 int openrisc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int = n) { diff --git a/target/openrisc/interrupt.c b/target/openrisc/interrupt.c index c31c6f12c4..3887812810 100644 --- a/target/openrisc/interrupt.c +++ b/target/openrisc/interrupt.c @@ -21,7 +21,7 @@ #include "qemu/log.h" #include "cpu.h" #include "exec/exec-all.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" #ifndef CONFIG_USER_ONLY #include "hw/loader.h" diff --git a/target/openrisc/mmu.c b/target/openrisc/mmu.c index 0b8afdbacf..603c26715e 100644 --- a/target/openrisc/mmu.c +++ b/target/openrisc/mmu.c @@ -22,7 +22,7 @@ #include "qemu/log.h" #include "cpu.h" #include "exec/exec-all.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" #include "hw/loader.h" =20 diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c index cbf0081374..949fbbd215 100644 --- a/target/ppc/cpu_init.c +++ b/target/ppc/cpu_init.c @@ -20,7 +20,7 @@ =20 #include "qemu/osdep.h" #include "disas/dis-asm.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "kvm_ppc.h" #include "sysemu/cpus.h" #include "sysemu/hw_accel.h" diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c index 1a0b9ca82c..444d5e616f 100644 --- a/target/ppc/gdbstub.c +++ b/target/ppc/gdbstub.c @@ -19,7 +19,8 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" +#include "gdbstub/helpers.h" #include "internal.h" =20 static int ppc_gdb_register_len_apple(int n) diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 7c25348b7b..c4f958ce12 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -40,7 +40,7 @@ #include "migration/qemu-file-types.h" #include "sysemu/watchdog.h" #include "trace.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "exec/memattrs.h" #include "exec/ram_addr.h" #include "sysemu/hostmem.h" diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c index 6e7bbdbd5e..666c06ffe0 100644 --- a/target/riscv/gdbstub.c +++ b/target/riscv/gdbstub.c @@ -17,7 +17,8 @@ */ =20 #include "qemu/osdep.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" +#include "gdbstub/helpers.h" #include "cpu.h" =20 struct TypeSize { diff --git a/target/rx/gdbstub.c b/target/rx/gdbstub.c index 7eb2059a84..d7e0e6689b 100644 --- a/target/rx/gdbstub.c +++ b/target/rx/gdbstub.c @@ -17,7 +17,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 int rx_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { diff --git a/target/s390x/gdbstub.c b/target/s390x/gdbstub.c index a5d69d0e0b..8aaea23104 100644 --- a/target/s390x/gdbstub.c +++ b/target/s390x/gdbstub.c @@ -22,7 +22,8 @@ #include "cpu.h" #include "s390x-internal.h" #include "exec/exec-all.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" +#include "gdbstub/helpers.h" #include "qemu/bitops.h" #include "sysemu/hw_accel.h" #include "sysemu/tcg.h" diff --git a/target/s390x/helper.c b/target/s390x/helper.c index 473c8e51b0..2b363aa959 100644 --- a/target/s390x/helper.c +++ b/target/s390x/helper.c @@ -21,7 +21,7 @@ #include "qemu/osdep.h" #include "cpu.h" #include "s390x-internal.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/timer.h" #include "hw/s390x/ioinst.h" #include "hw/s390x/pv.h" diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c index 3ac7ec9acf..ec883721b3 100644 --- a/target/s390x/kvm/kvm.c +++ b/target/s390x/kvm/kvm.c @@ -40,7 +40,7 @@ #include "sysemu/hw_accel.h" #include "sysemu/runstate.h" #include "sysemu/device_tree.h" -#include "exec/gdbstub.h" +#include "gdbstub/common.h" #include "exec/ram_addr.h" #include "trace.h" #include "hw/s390x/s390-pci-inst.h" diff --git a/target/sh4/gdbstub.c b/target/sh4/gdbstub.c index 3488f68e32..d8e199fc06 100644 --- a/target/sh4/gdbstub.c +++ b/target/sh4/gdbstub.c @@ -19,7 +19,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 /* Hint: Use "set architecture sh4" in GDB to see fpu registers */ /* FIXME: We should use XML for this. */ diff --git a/target/sparc/gdbstub.c b/target/sparc/gdbstub.c index 5d1e808e8c..a1c8fdc4d5 100644 --- a/target/sparc/gdbstub.c +++ b/target/sparc/gdbstub.c @@ -19,7 +19,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 #ifdef TARGET_ABI32 #define gdb_get_rega(buf, val) gdb_get_reg32(buf, val) diff --git a/target/tricore/gdbstub.c b/target/tricore/gdbstub.c index ebf32defde..5a61ac5753 100644 --- a/target/tricore/gdbstub.c +++ b/target/tricore/gdbstub.c @@ -18,7 +18,7 @@ */ =20 #include "qemu/osdep.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" =20 =20 #define LCX_REGNUM 32 diff --git a/target/xtensa/core-dc232b.c b/target/xtensa/core-dc232b.c index c982d09c24..9aba2667e3 100644 --- a/target/xtensa/core-dc232b.c +++ b/target/xtensa/core-dc232b.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" #include "qemu/timer.h" =20 diff --git a/target/xtensa/core-dc233c.c b/target/xtensa/core-dc233c.c index 595ab9a90f..9b0a625063 100644 --- a/target/xtensa/core-dc233c.c +++ b/target/xtensa/core-dc233c.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-dc233c/core-isa.h" diff --git a/target/xtensa/core-de212.c b/target/xtensa/core-de212.c index 50c995ba79..b08fe22e65 100644 --- a/target/xtensa/core-de212.c +++ b/target/xtensa/core-de212.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-de212/core-isa.h" diff --git a/target/xtensa/core-de233_fpu.c b/target/xtensa/core-de233_fpu.c index 41af8057fb..8845cdb592 100644 --- a/target/xtensa/core-de233_fpu.c +++ b/target/xtensa/core-de233_fpu.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-de233_fpu/core-isa.h" diff --git a/target/xtensa/core-dsp3400.c b/target/xtensa/core-dsp3400.c index 81e425c568..c0f94b9e27 100644 --- a/target/xtensa/core-dsp3400.c +++ b/target/xtensa/core-dsp3400.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-dsp3400/core-isa.h" diff --git a/target/xtensa/core-fsf.c b/target/xtensa/core-fsf.c index 3327c50b4f..310be8d61f 100644 --- a/target/xtensa/core-fsf.c +++ b/target/xtensa/core-fsf.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-fsf/core-isa.h" diff --git a/target/xtensa/core-lx106.c b/target/xtensa/core-lx106.c index 7a771d09a6..7f71d088f3 100644 --- a/target/xtensa/core-lx106.c +++ b/target/xtensa/core-lx106.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-lx106/core-isa.h" diff --git a/target/xtensa/core-sample_controller.c b/target/xtensa/core-sa= mple_controller.c index fd5de5576b..8867001aac 100644 --- a/target/xtensa/core-sample_controller.c +++ b/target/xtensa/core-sample_controller.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-sample_controller/core-isa.h" diff --git a/target/xtensa/core-test_kc705_be.c b/target/xtensa/core-test_k= c705_be.c index 294c16f2f4..bd082f49aa 100644 --- a/target/xtensa/core-test_kc705_be.c +++ b/target/xtensa/core-test_kc705_be.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-test_kc705_be/core-isa.h" diff --git a/target/xtensa/core-test_mmuhifi_c3.c b/target/xtensa/core-test= _mmuhifi_c3.c index c0e5d32d1e..3090dd01ed 100644 --- a/target/xtensa/core-test_mmuhifi_c3.c +++ b/target/xtensa/core-test_mmuhifi_c3.c @@ -27,7 +27,7 @@ =20 #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-test_mmuhifi_c3/core-isa.h" diff --git a/target/xtensa/gdbstub.c b/target/xtensa/gdbstub.c index b6696063e5..4b3bfb7e59 100644 --- a/target/xtensa/gdbstub.c +++ b/target/xtensa/gdbstub.c @@ -19,7 +19,7 @@ */ #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/log.h" =20 enum { diff --git a/target/xtensa/helper.c b/target/xtensa/helper.c index 2aa9777a8e..dbeb97a953 100644 --- a/target/xtensa/helper.c +++ b/target/xtensa/helper.c @@ -29,7 +29,7 @@ #include "qemu/log.h" #include "cpu.h" #include "exec/exec-all.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "exec/helper-proto.h" #include "qemu/error-report.h" #include "qemu/qemu-print.h" diff --git a/MAINTAINERS b/MAINTAINERS index c84d9299c3..ba7ae16d57 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2697,7 +2697,6 @@ M: Alex Benn=C3=A9e R: Philippe Mathieu-Daud=C3=A9 S: Maintained F: gdbstub/* -F: include/exec/gdbstub.h F: include/gdbstub/* F: gdb-xml/ F: tests/tcg/multiarch/gdbstub/ diff --git a/scripts/feature_to_c.sh b/scripts/feature_to_c.sh index c1f67c8f6a..cdebb85590 100644 --- a/scripts/feature_to_c.sh +++ b/scripts/feature_to_c.sh @@ -56,7 +56,7 @@ for input; do done =20 echo -echo '#include "exec/gdbstub.h"' +echo '#include "gdbstub/common.h"' echo "const char *const xml_builtin[][2] =3D {" =20 for input; do diff --git a/target/xtensa/import_core.sh b/target/xtensa/import_core.sh index b4c15556c2..17dfec8957 100755 --- a/target/xtensa/import_core.sh +++ b/target/xtensa/import_core.sh @@ -41,7 +41,7 @@ tar -xf "$OVERLAY" -O binutils/xtensa-modules.c | \ cat < "${TARGET}.c" #include "qemu/osdep.h" #include "cpu.h" -#include "exec/gdbstub.h" +#include "gdbstub/helpers.h" #include "qemu/host-utils.h" =20 #include "core-$NAME/core-isa.h" --=20 2.34.1