From patchwork Fri Nov 15 17:29:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179510 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12753727ilf; Fri, 15 Nov 2019 09:31:06 -0800 (PST) X-Google-Smtp-Source: APXvYqwxSvtmNkcSxlvEXeOzIRi5bPdqtOJm5oSAladli+HXnlsOtPqd4O+bhXWxWk9Hrx0bOs3R X-Received: by 2002:a1c:1f03:: with SMTP id f3mr15875949wmf.131.1573839066699; Fri, 15 Nov 2019 09:31:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839066; cv=none; d=google.com; s=arc-20160816; b=Z7xzBy6fklVtk7beyj1UnofkzhVwZk6xKx/Y6ZJPy/eqh1zW1FSzCXVHcyX4PU4qTd lo1HZXFcmbxVjmdnw1lfB7wJIodHrm6QfuD9NGmggqb1TOakffcWT9TN6AjR7u2zmbRf ohTadjodoH6VaqL3Nd8c0JAJtJKonT2TJAnaCy2H1Xrt2GodtI3KH3KQY8niMBvIfAF3 Y2pB0i/dUxk5Z/S5368cxldFJwRaBwoqyZlkGCMM1UNTQecHUYL3i7189kcxIoXuxe2r ideUm1hSy8AsKNspRNbficu/Un72Nc9ZHf9g/15g/Y+ZA1HcY3370j7YaWUfJY0y1edM MwZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=b3lRu2lU9dlRQQ6ScHgKfSG/1eYQg9vd77Swnr8j6IA=; b=Kv7hWamb631XSZb+tNA3MppPFLHf/r6keLDV3CvnfCsf8odX7MqBkThhywxXZovy1l Vp3NILB4ls1k3QmeLKbymdoZNot8haInSefOn5Tw/q5DxFjUWzQTUjGyu2QqEgV0DELZ u1gab7va7EEALXxHZIJcI1iPGOQvnykaKRAh6RTVcY3Kt9nq08I2dZqBdBgaFn4zZM6e 2f5oBLtESdFJ9CxfyJdbRIVzP8muVgS2s6E2o7ZuYAtlbuldE3GSyHxXzuwOyaivWpql 4wk9lFUbU/V/gcBnD39a8j5VTtwP0mU4tow0k6FVii8g5C5Eo2NgKreMSHUMi6kZBUIr /h9Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=VX4rYQkb; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id g15si7398956edl.95.2019.11.15.09.31.06 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:31:06 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=VX4rYQkb; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42590 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfR2-0007FY-91 for patch@linaro.org; Fri, 15 Nov 2019 12:31:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34425) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQ6-0007BH-Ja for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQ4-0002i5-Dy for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:06 -0500 Received: from mail-wr1-x444.google.com ([2a00:1450:4864:20::444]:36694) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQ4-0002dp-3f for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:04 -0500 Received: by mail-wr1-x444.google.com with SMTP id r10so11851227wrx.3 for ; Fri, 15 Nov 2019 09:30:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=b3lRu2lU9dlRQQ6ScHgKfSG/1eYQg9vd77Swnr8j6IA=; b=VX4rYQkbDLJQAzgEhNQU4zCu21NMgPbg7GNdfh8AFd2iMQ7uL2Dm4WX8I2pe1QjjJh tPAmG92LF77wtSOpKpoGYSsGDoxLMjgzuYYRldGRcqkFEXgaS4Ib14FegxGT7Kqs2GvZ W9pzhAUQIhdeNggKOJwB89oZWa2EhxvNnXvzcth41eUdyzGRCM55dnf9arTuvIjRV5dr 8HM7WXNFPNt3EG8mvQAgx+xx4BsEwN3MpiBDFRcNO9Xw1RmZpNWxHznZysUUGHP/lH5u +tWVKyCCXN8UYL2hTXp49ZI3ns6D/7wfNXb9EQgOg3LYglI9CfD+BCoeo1VSBSdiQgGp 9Eiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=b3lRu2lU9dlRQQ6ScHgKfSG/1eYQg9vd77Swnr8j6IA=; b=gezzMJAUvAeV2aUQfynr7GeDo59wU3eRpQkaJESZ2o+NJkRObMhwV+fheNQ/pAkq5v zH/b3tm7PR8QtIweX81PWDHaIrvsYTKRNgfFLgM6WgzUXlOTx5bieifJnDmwR5OBrCbD 2UKBoCqRVjcfH8VmbRqVDQsRxUZQlN4Nc3OkRmdGeu6Prco7k9LZUEO2G47hDmkGN9ra 6GpO9qKtKASRwaHuQnHAtbMzBlv3iGUy5gfhfbvqyLmjmtNVVNAdvoY7scFWUvB9sjI1 2bfgw8I66e8Re+gh8SfwKtkN4/gY0Oe3NLszTP1PBT1etnOeXPuydcBQI6NpfM86VeAz ovBw== X-Gm-Message-State: APjAAAVrSWhan58BnsL83IlDz/wjK8PHkRSQropfy4NOnv5hx9BIRNyU HmY1MXBDMON307a6EqY2Eo7uNA== X-Received: by 2002:a5d:4684:: with SMTP id u4mr15846457wrq.352.1573839002363; Fri, 15 Nov 2019 09:30:02 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id x11sm12248423wro.84.2019.11.15.09.30.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:01 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id DC5201FF8C; Fri, 15 Nov 2019 17:30:00 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 01/11] gdbstub: move allocation of GDBState to one place Date: Fri, 15 Nov 2019 17:29:50 +0000 Message-Id: <20191115173000.21891-2-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::444 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, luis.machado@linaro.org, =?utf-8?q?Philipp?= =?utf-8?q?e_Mathieu-Daud=C3=A9?= , richard.henderson@linaro.org, alan.hayward@arm.com, =?utf-8?q?Alex_Be?= =?utf-8?b?bm7DqWU=?= Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" We use g_new0() as it is the preferred form for such allocations. We can also ensure that gdbserver_state is reset in one place. Signed-off-by: Alex Bennée --- gdbstub.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) -- 2.20.1 Reviewed-by: Richard Henderson Reviewed-by: Damien Hedde diff --git a/gdbstub.c b/gdbstub.c index 4cf8af365e2..c5b6701825f 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -374,6 +374,13 @@ static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER; static GDBState *gdbserver_state; +static GDBState *gdb_allocate_state(void) +{ + g_assert(!gdbserver_state); + gdbserver_state = g_new0(GDBState, 1); + return gdbserver_state; +} + bool gdb_has_xml; #ifdef CONFIG_USER_ONLY @@ -3083,15 +3090,13 @@ static bool gdb_accept(void) return false; } - s = g_malloc0(sizeof(GDBState)); + s = gdb_allocate_state(); create_default_process(s); s->processes[0].attached = true; s->c_cpu = gdb_first_attached_cpu(s); s->g_cpu = s->c_cpu; s->fd = fd; gdb_has_xml = false; - - gdbserver_state = s; return true; } @@ -3359,8 +3364,7 @@ int gdbserver_start(const char *device) s = gdbserver_state; if (!s) { - s = g_malloc0(sizeof(GDBState)); - gdbserver_state = s; + s = gdb_allocate_state(); qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL); From patchwork Fri Nov 15 17:29:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179514 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12761376ilf; Fri, 15 Nov 2019 09:37:05 -0800 (PST) X-Google-Smtp-Source: APXvYqw/hZJ4K0asLgHN0btwxBIAXobs3+8DDhtxJMOT4jlCD7Abh6nsK0inM+QVcr3DMMWNxl35 X-Received: by 2002:a05:620a:13cf:: with SMTP id g15mr13077962qkl.195.1573839425547; Fri, 15 Nov 2019 09:37:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839425; cv=none; d=google.com; s=arc-20160816; b=zMyLlq6gvf1QSgagcBKdU1KvLzUc+C8F3MkILYmOMPx9Vwo34KXbFM7Lo7Oup9BgdI rFQb6nuHOz2gj+QYa5DpQLayt31PIwPAmVOPqOw43aTyqZzYq1sQzbVdYI831xb30qwJ XrOa7Vy+lTDxb9aOGKhD+mwfBNjE0jOiAiIIq6HUwiOPNRz2pM5IC4WkNfZFBV8Ur7mj 3dHTS5r4nibbL6u3p3AoWUxYSqemkulQB6SOD91SlwPsoUjY0rkSV6EeopINmRawdYUp EHJ48wBf9Ozc9Ai1AMg/PiI9Tk70/u571t17Si8BBOwFJLVnlE9J+Fid5ZOivn5h+vXS jKoQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=j9kiPsYTsXbfYsAkLJu+kdHZvO1sRQiBT3GmVuGhPOM=; b=gYZs4A7hCvSBB7cWTgSXk3Bq2ZegmS/T37TS6QyCOZe434oqE1WHqXGCOp8Jk9kkrO 0pSxUMAi5WhoikoBOhxwugnV91/UEXFDGdCTNlx0PO5Var1p4JzNofR8F1tE7Ma1z3eC Fuzoseslc7ojiIbYJBAwYSOF3OZqCLhvbWtfyo7kdXzDBvwlYYb+0QHe7zU1FGQPRdMk 0uez0Xu1NYhskQj9Dbq0U5Du+ziD86ob76x/e4ro6w80hBYaO5KdhTpNcOcequXoJ63I m8Y+CEaA2t7kNrz5/KpvMiMi63L+3aE7etgxkxmJRvDj5E90sXmPBVMxkFCBGk5mdDrR RPXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=wKhKpxR3; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id i31si6207375qtd.380.2019.11.15.09.37.05 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:37:05 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=wKhKpxR3; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42828 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfWq-0000gC-DS for patch@linaro.org; Fri, 15 Nov 2019 12:37:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34824) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQE-0007IC-Ae for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQ7-0002nd-Iu for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:13 -0500 Received: from mail-wm1-x342.google.com ([2a00:1450:4864:20::342]:53680) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQ7-0002m2-6m for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:07 -0500 Received: by mail-wm1-x342.google.com with SMTP id u18so10460838wmc.3 for ; Fri, 15 Nov 2019 09:30:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=j9kiPsYTsXbfYsAkLJu+kdHZvO1sRQiBT3GmVuGhPOM=; b=wKhKpxR30PjrZnuO8+dI+dAUqLrCBdA6CUxsG0oGyCwXiyk9PBRR/tUeLvC+O9clSy EpNg9Vj7PMcLeAhOjU9VdykBr81jbixd97U4q7J4S9g6su7nLzYcnXMLaReWfUj+QxC4 27caBxUYb1KMxQxkTXoNbKl385uRsf/teJcMC5deoiSifIBAVtKhKNH+O791MdHgro7O i8RvEkrHlzQnqUXXsKOJhr4/L0rQG7bMAmnYucdapR8JWeI+2FxLH0cUX87Zg57OFrEU NQlruL2JHQg18gMxMY5cp55DJTI86HzGEQNRNPIpB/BoSRz15DLjofuOyk/RlT/NWBDn ZY3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=j9kiPsYTsXbfYsAkLJu+kdHZvO1sRQiBT3GmVuGhPOM=; b=k7YNfchxgzX1D44kiJC+LKowXp+4V5XrB1YMxlMw1lJC4GaZg04nlRJW3EszvrzMbb A71H4Ha6wTvwEpRRzFuJZ82s8t71ylBqOfJDQtpPU8ViMy3hICiVofD9TlRy37LPG1fj cm7Qp2zcvwQvr0r8UvbEh+j3l8qaRf1t4rBzi7bsydcFfM4rjH/e3jRxLKiLnbbw9gDh d1g2zSU0tpahSe9kuya81pHx8MtheOe2+VJWRpDj86lTqMEjf6eyYA/INhh1fXMcLglk hKfo3fem8cBzHz9UhJyYTRpMOpV/ZWGUp98IHmIJ28fm6fqE1xE1sY7j0DI/7qtxvTHH v96A== X-Gm-Message-State: APjAAAWTkVTYCPMVaDs2ZHmHlQThY3kGqdzIjSE46Q6BJltBBmf4XXdd Ktz4R0XhrvimtI0mBEHJ0pHRGQ== X-Received: by 2002:a1c:9c82:: with SMTP id f124mr17163676wme.25.1573839005257; Fri, 15 Nov 2019 09:30:05 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id q124sm9279347wme.13.2019.11.15.09.30.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:01 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 013C11FF8F; Fri, 15 Nov 2019 17:30:01 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 02/11] gdbstub: stop passing GDBState * around Date: Fri, 15 Nov 2019 17:29:51 +0000 Message-Id: <20191115173000.21891-3-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::342 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, luis.machado@linaro.org, =?utf-8?q?Philipp?= =?utf-8?q?e_Mathieu-Daud=C3=A9?= , richard.henderson@linaro.org, alan.hayward@arm.com, =?utf-8?q?Alex_Be?= =?utf-8?b?bm7DqWU=?= Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" We only have one GDBState which should be allocated at the time we process any commands. This will make further clean-up a bit easier. Signed-off-by: Alex Bennée --- gdbstub.c | 307 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 177 insertions(+), 130 deletions(-) -- 2.20.1 Reviewed-by: Richard Henderson diff --git a/gdbstub.c b/gdbstub.c index c5b6701825f..2e6ff5f583c 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -1399,7 +1399,6 @@ static int cmd_parse_params(const char *data, const char *schema, } typedef struct GdbCmdContext { - GDBState *s; GdbCmdVariant *params; int num_params; uint8_t mem_buf[MAX_PACKET_LENGTH]; @@ -1480,7 +1479,7 @@ static int process_string_cmd(GDBState *s, void *user_ctx, const char *data, return -1; } - gdb_ctx.s = s; + g_assert(s == gdbserver_state); cmd->handler(&gdb_ctx, user_ctx); return 0; } @@ -1505,7 +1504,7 @@ static void run_cmd_parser(GDBState *s, const char *data, static void handle_detach(GdbCmdContext *gdb_ctx, void *user_ctx) { GDBProcess *process; - GDBState *s = gdb_ctx->s; + GDBState *s = gdbserver_state; uint32_t pid = 1; if (s->multiprocess) { @@ -1540,40 +1539,44 @@ static void handle_detach(GdbCmdContext *gdb_ctx, void *user_ctx) static void handle_thread_alive(GdbCmdContext *gdb_ctx, void *user_ctx) { CPUState *cpu; + GDBState *s = gdbserver_state; if (!gdb_ctx->num_params) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } if (gdb_ctx->params[0].thread_id.kind == GDB_READ_THREAD_ERR) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } - cpu = gdb_get_cpu(gdb_ctx->s, gdb_ctx->params[0].thread_id.pid, + cpu = gdb_get_cpu(s, gdb_ctx->params[0].thread_id.pid, gdb_ctx->params[0].thread_id.tid); if (!cpu) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); } static void handle_continue(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + if (gdb_ctx->num_params) { - gdb_set_cpu_pc(gdb_ctx->s, gdb_ctx->params[0].val_ull); + gdb_set_cpu_pc(s, gdb_ctx->params[0].val_ull); } - gdb_ctx->s->signal = 0; - gdb_continue(gdb_ctx->s); + s->signal = 0; + gdb_continue(s); } static void handle_cont_with_sig(GdbCmdContext *gdb_ctx, void *user_ctx) { unsigned long signal = 0; + GDBState *s = gdbserver_state; /* * Note: C sig;[addr] is currently unsupported and we simply @@ -1583,36 +1586,37 @@ static void handle_cont_with_sig(GdbCmdContext *gdb_ctx, void *user_ctx) signal = gdb_ctx->params[0].val_ul; } - gdb_ctx->s->signal = gdb_signal_to_target(signal); - if (gdb_ctx->s->signal == -1) { - gdb_ctx->s->signal = 0; + s->signal = gdb_signal_to_target(signal); + if (s->signal == -1) { + s->signal = 0; } - gdb_continue(gdb_ctx->s); + gdb_continue(s); } static void handle_set_thread(GdbCmdContext *gdb_ctx, void *user_ctx) { CPUState *cpu; + GDBState *s = gdbserver_state; if (gdb_ctx->num_params != 2) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } if (gdb_ctx->params[1].thread_id.kind == GDB_READ_THREAD_ERR) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } if (gdb_ctx->params[1].thread_id.kind != GDB_ONE_THREAD) { - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); return; } - cpu = gdb_get_cpu(gdb_ctx->s, gdb_ctx->params[1].thread_id.pid, + cpu = gdb_get_cpu(s, gdb_ctx->params[1].thread_id.pid, gdb_ctx->params[1].thread_id.tid); if (!cpu) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } @@ -1622,15 +1626,15 @@ static void handle_set_thread(GdbCmdContext *gdb_ctx, void *user_ctx) */ switch (gdb_ctx->params[0].opcode) { case 'c': - gdb_ctx->s->c_cpu = cpu; - put_packet(gdb_ctx->s, "OK"); + s->c_cpu = cpu; + put_packet(s, "OK"); break; case 'g': - gdb_ctx->s->g_cpu = cpu; - put_packet(gdb_ctx->s, "OK"); + s->g_cpu = cpu; + put_packet(s, "OK"); break; default: - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); break; } } @@ -1638,9 +1642,10 @@ static void handle_set_thread(GdbCmdContext *gdb_ctx, void *user_ctx) static void handle_insert_bp(GdbCmdContext *gdb_ctx, void *user_ctx) { int res; + GDBState *s = gdbserver_state; if (gdb_ctx->num_params != 3) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } @@ -1648,22 +1653,23 @@ static void handle_insert_bp(GdbCmdContext *gdb_ctx, void *user_ctx) gdb_ctx->params[1].val_ull, gdb_ctx->params[2].val_ull); if (res >= 0) { - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); return; } else if (res == -ENOSYS) { - put_packet(gdb_ctx->s, ""); + put_packet(s, ""); return; } - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); } static void handle_remove_bp(GdbCmdContext *gdb_ctx, void *user_ctx) { int res; + GDBState *s = gdbserver_state; if (gdb_ctx->num_params != 3) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } @@ -1671,14 +1677,14 @@ static void handle_remove_bp(GdbCmdContext *gdb_ctx, void *user_ctx) gdb_ctx->params[1].val_ull, gdb_ctx->params[2].val_ull); if (res >= 0) { - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); return; } else if (res == -ENOSYS) { - put_packet(gdb_ctx->s, ""); + put_packet(s, ""); return; } - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); } /* @@ -1695,100 +1701,107 @@ static void handle_remove_bp(GdbCmdContext *gdb_ctx, void *user_ctx) static void handle_set_reg(GdbCmdContext *gdb_ctx, void *user_ctx) { int reg_size; + GDBState *s = gdbserver_state; if (!gdb_has_xml) { - put_packet(gdb_ctx->s, ""); + put_packet(s, ""); return; } if (gdb_ctx->num_params != 2) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } reg_size = strlen(gdb_ctx->params[1].data) / 2; hextomem(gdb_ctx->mem_buf, gdb_ctx->params[1].data, reg_size); - gdb_write_register(gdb_ctx->s->g_cpu, gdb_ctx->mem_buf, + gdb_write_register(s->g_cpu, gdb_ctx->mem_buf, gdb_ctx->params[0].val_ull); - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); } static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx) { int reg_size; + GDBState *s = gdbserver_state; if (!gdb_has_xml) { - put_packet(gdb_ctx->s, ""); + put_packet(s, ""); return; } if (!gdb_ctx->num_params) { - put_packet(gdb_ctx->s, "E14"); + put_packet(s, "E14"); return; } - reg_size = gdb_read_register(gdb_ctx->s->g_cpu, gdb_ctx->mem_buf, + reg_size = gdb_read_register(s->g_cpu, gdb_ctx->mem_buf, gdb_ctx->params[0].val_ull); if (!reg_size) { - put_packet(gdb_ctx->s, "E14"); + put_packet(s, "E14"); return; } memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, reg_size); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } static void handle_write_mem(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + if (gdb_ctx->num_params != 3) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } /* hextomem() reads 2*len bytes */ if (gdb_ctx->params[1].val_ull > strlen(gdb_ctx->params[2].data) / 2) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } hextomem(gdb_ctx->mem_buf, gdb_ctx->params[2].data, gdb_ctx->params[1].val_ull); - if (target_memory_rw_debug(gdb_ctx->s->g_cpu, gdb_ctx->params[0].val_ull, + if (target_memory_rw_debug(s->g_cpu, gdb_ctx->params[0].val_ull, gdb_ctx->mem_buf, gdb_ctx->params[1].val_ull, true)) { - put_packet(gdb_ctx->s, "E14"); + put_packet(s, "E14"); return; } - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); } static void handle_read_mem(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + if (gdb_ctx->num_params != 2) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } /* memtohex() doubles the required space */ if (gdb_ctx->params[1].val_ull > MAX_PACKET_LENGTH / 2) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } - if (target_memory_rw_debug(gdb_ctx->s->g_cpu, gdb_ctx->params[0].val_ull, + if (target_memory_rw_debug(s->g_cpu, gdb_ctx->params[0].val_ull, gdb_ctx->mem_buf, gdb_ctx->params[1].val_ull, false)) { - put_packet(gdb_ctx->s, "E14"); + put_packet(s, "E14"); return; } memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, gdb_ctx->params[1].val_ull); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } static void handle_write_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; target_ulong addr, len; uint8_t *registers; int reg_size; @@ -1797,37 +1810,40 @@ static void handle_write_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx) return; } - cpu_synchronize_state(gdb_ctx->s->g_cpu); + cpu_synchronize_state(s->g_cpu); registers = gdb_ctx->mem_buf; len = strlen(gdb_ctx->params[0].data) / 2; hextomem(registers, gdb_ctx->params[0].data, len); - for (addr = 0; addr < gdb_ctx->s->g_cpu->gdb_num_g_regs && len > 0; + for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) { - reg_size = gdb_write_register(gdb_ctx->s->g_cpu, registers, addr); + reg_size = gdb_write_register(s->g_cpu, registers, addr); len -= reg_size; registers += reg_size; } - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); } static void handle_read_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; target_ulong addr, len; - cpu_synchronize_state(gdb_ctx->s->g_cpu); + cpu_synchronize_state(s->g_cpu); len = 0; - for (addr = 0; addr < gdb_ctx->s->g_cpu->gdb_num_g_regs; addr++) { - len += gdb_read_register(gdb_ctx->s->g_cpu, gdb_ctx->mem_buf + len, + for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) { + len += gdb_read_register(s->g_cpu, gdb_ctx->mem_buf + len, addr); } memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, len); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } static void handle_file_io(GdbCmdContext *gdb_ctx, void *user_ctx) { - if (gdb_ctx->num_params >= 1 && gdb_ctx->s->current_syscall_cb) { + GDBState *s = gdbserver_state; + + if (gdb_ctx->num_params >= 1 && s->current_syscall_cb) { target_ulong ret, err; ret = (target_ulong)gdb_ctx->params[0].val_ull; @@ -1836,51 +1852,56 @@ static void handle_file_io(GdbCmdContext *gdb_ctx, void *user_ctx) } else { err = 0; } - gdb_ctx->s->current_syscall_cb(gdb_ctx->s->c_cpu, ret, err); - gdb_ctx->s->current_syscall_cb = NULL; + s->current_syscall_cb(s->c_cpu, ret, err); + s->current_syscall_cb = NULL; } if (gdb_ctx->num_params >= 3 && gdb_ctx->params[2].opcode == (uint8_t)'C') { - put_packet(gdb_ctx->s, "T02"); + put_packet(s, "T02"); return; } - gdb_continue(gdb_ctx->s); + gdb_continue(s); } static void handle_step(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + if (gdb_ctx->num_params) { - gdb_set_cpu_pc(gdb_ctx->s, (target_ulong)gdb_ctx->params[0].val_ull); + gdb_set_cpu_pc(s, (target_ulong)gdb_ctx->params[0].val_ull); } - cpu_single_step(gdb_ctx->s->c_cpu, sstep_flags); - gdb_continue(gdb_ctx->s); + cpu_single_step(s->c_cpu, sstep_flags); + gdb_continue(s); } static void handle_v_cont_query(GdbCmdContext *gdb_ctx, void *user_ctx) { - put_packet(gdb_ctx->s, "vCont;c;C;s;S"); + GDBState *s = gdbserver_state; + put_packet(s, "vCont;c;C;s;S"); } static void handle_v_cont(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; int res; if (!gdb_ctx->num_params) { return; } - res = gdb_handle_vcont(gdb_ctx->s, gdb_ctx->params[0].data); + res = gdb_handle_vcont(s, gdb_ctx->params[0].data); if ((res == -EINVAL) || (res == -ERANGE)) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); } else if (res) { - put_packet(gdb_ctx->s, ""); + put_packet(s, ""); } } static void handle_v_attach(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; GDBProcess *process; CPUState *cpu; char thread_id[16]; @@ -1890,31 +1911,33 @@ static void handle_v_attach(GdbCmdContext *gdb_ctx, void *user_ctx) goto cleanup; } - process = gdb_get_process(gdb_ctx->s, gdb_ctx->params[0].val_ul); + process = gdb_get_process(s, gdb_ctx->params[0].val_ul); if (!process) { goto cleanup; } - cpu = get_first_cpu_in_process(gdb_ctx->s, process); + cpu = get_first_cpu_in_process(s, process); if (!cpu) { goto cleanup; } process->attached = true; - gdb_ctx->s->g_cpu = cpu; - gdb_ctx->s->c_cpu = cpu; + s->g_cpu = cpu; + s->c_cpu = cpu; - gdb_fmt_thread_id(gdb_ctx->s, cpu, thread_id, sizeof(thread_id)); + gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id)); snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "T%02xthread:%s;", GDB_SIGNAL_TRAP, thread_id); cleanup: - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } static void handle_v_kill(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + /* Kill the target */ - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); error_report("QEMU: Terminated via GDBstub"); exit(0); } @@ -1947,43 +1970,52 @@ static GdbCmdParseEntry gdb_v_commands_table[] = { static void handle_v_commands(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + if (!gdb_ctx->num_params) { return; } - if (process_string_cmd(gdb_ctx->s, NULL, gdb_ctx->params[0].data, + if (process_string_cmd(s, NULL, gdb_ctx->params[0].data, gdb_v_commands_table, ARRAY_SIZE(gdb_v_commands_table))) { - put_packet(gdb_ctx->s, ""); + put_packet(s, ""); } } static void handle_query_qemu_sstepbits(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x", SSTEP_ENABLE, SSTEP_NOIRQ, SSTEP_NOTIMER); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } static void handle_set_qemu_sstep(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + if (!gdb_ctx->num_params) { return; } sstep_flags = gdb_ctx->params[0].val_ul; - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); } static void handle_query_qemu_sstep(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "0x%x", sstep_flags); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } static void handle_query_curr_tid(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; CPUState *cpu; GDBProcess *process; char thread_id[16]; @@ -1993,48 +2025,51 @@ static void handle_query_curr_tid(GdbCmdContext *gdb_ctx, void *user_ctx) * the first thread of the current process (gdb returns the * first thread). */ - process = gdb_get_cpu_process(gdb_ctx->s, gdb_ctx->s->g_cpu); - cpu = get_first_cpu_in_process(gdb_ctx->s, process); - gdb_fmt_thread_id(gdb_ctx->s, cpu, thread_id, sizeof(thread_id)); + process = gdb_get_cpu_process(s, s->g_cpu); + cpu = get_first_cpu_in_process(s, process); + gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id)); snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "QC%s", thread_id); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } static void handle_query_threads(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; char thread_id[16]; - if (!gdb_ctx->s->query_cpu) { - put_packet(gdb_ctx->s, "l"); + if (!s->query_cpu) { + put_packet(s, "l"); return; } - gdb_fmt_thread_id(gdb_ctx->s, gdb_ctx->s->query_cpu, thread_id, + gdb_fmt_thread_id(s, s->query_cpu, thread_id, sizeof(thread_id)); snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "m%s", thread_id); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); - gdb_ctx->s->query_cpu = - gdb_next_attached_cpu(gdb_ctx->s, gdb_ctx->s->query_cpu); + put_packet(s, gdb_ctx->str_buf); + s->query_cpu = + gdb_next_attached_cpu(s, s->query_cpu); } static void handle_query_first_threads(GdbCmdContext *gdb_ctx, void *user_ctx) { - gdb_ctx->s->query_cpu = gdb_first_attached_cpu(gdb_ctx->s); + GDBState *s = gdbserver_state; + s->query_cpu = gdb_first_attached_cpu(s); handle_query_threads(gdb_ctx, user_ctx); } static void handle_query_thread_extra(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; CPUState *cpu; int len; if (!gdb_ctx->num_params || gdb_ctx->params[0].thread_id.kind == GDB_READ_THREAD_ERR) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } - cpu = gdb_get_cpu(gdb_ctx->s, gdb_ctx->params[0].thread_id.pid, + cpu = gdb_get_cpu(s, gdb_ctx->params[0].thread_id.pid, gdb_ctx->params[0].thread_id.tid); if (!cpu) { return; @@ -2042,7 +2077,7 @@ static void handle_query_thread_extra(GdbCmdContext *gdb_ctx, void *user_ctx) cpu_synchronize_state(cpu); - if (gdb_ctx->s->multiprocess && (gdb_ctx->s->process_num > 1)) { + if (s->multiprocess && (s->process_num > 1)) { /* Print the CPU model and name in multiprocess mode */ ObjectClass *oc = object_get_class(OBJECT(cpu)); const char *cpu_model = object_class_get_name(oc); @@ -2059,50 +2094,53 @@ static void handle_query_thread_extra(GdbCmdContext *gdb_ctx, void *user_ctx) } trace_gdbstub_op_extra_info((char *)gdb_ctx->mem_buf); memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, len); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } #ifdef CONFIG_USER_ONLY static void handle_query_offsets(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; TaskState *ts; - ts = gdb_ctx->s->c_cpu->opaque; + ts = s->c_cpu->opaque; snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx ";Bss=" TARGET_ABI_FMT_lx, ts->info->code_offset, ts->info->data_offset, ts->info->data_offset); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } #else static void handle_query_rcmd(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; int len; if (!gdb_ctx->num_params) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } len = strlen(gdb_ctx->params[0].data); if (len % 2) { - put_packet(gdb_ctx->s, "E01"); + put_packet(s, "E01"); return; } len = len / 2; hextomem(gdb_ctx->mem_buf, gdb_ctx->params[0].data, len); gdb_ctx->mem_buf[len++] = 0; - qemu_chr_be_write(gdb_ctx->s->mon_chr, gdb_ctx->mem_buf, len); - put_packet(gdb_ctx->s, "OK"); + qemu_chr_be_write(s->mon_chr, gdb_ctx->mem_buf, len); + put_packet(s, "OK"); } #endif static void handle_query_supported(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; CPUClass *cc; snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "PacketSize=%x", @@ -2115,15 +2153,16 @@ static void handle_query_supported(GdbCmdContext *gdb_ctx, void *user_ctx) if (gdb_ctx->num_params && strstr(gdb_ctx->params[0].data, "multiprocess+")) { - gdb_ctx->s->multiprocess = true; + s->multiprocess = true; } pstrcat(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), ";multiprocess+"); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } static void handle_query_xfer_features(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; GDBProcess *process; CPUClass *cc; unsigned long len, total_len, addr; @@ -2131,22 +2170,22 @@ static void handle_query_xfer_features(GdbCmdContext *gdb_ctx, void *user_ctx) const char *p; if (gdb_ctx->num_params < 3) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } - process = gdb_get_cpu_process(gdb_ctx->s, gdb_ctx->s->g_cpu); - cc = CPU_GET_CLASS(gdb_ctx->s->g_cpu); + process = gdb_get_cpu_process(s, s->g_cpu); + cc = CPU_GET_CLASS(s->g_cpu); if (!cc->gdb_core_xml_file) { - put_packet(gdb_ctx->s, ""); + put_packet(s, ""); return; } gdb_has_xml = true; p = gdb_ctx->params[0].data; - xml = get_feature_xml(gdb_ctx->s, p, &p, process); + xml = get_feature_xml(s, p, &p, process); if (!xml) { - put_packet(gdb_ctx->s, "E00"); + put_packet(s, "E00"); return; } @@ -2154,7 +2193,7 @@ static void handle_query_xfer_features(GdbCmdContext *gdb_ctx, void *user_ctx) len = gdb_ctx->params[2].val_ul; total_len = strlen(xml); if (addr > total_len) { - put_packet(gdb_ctx->s, "E00"); + put_packet(s, "E00"); return; } @@ -2170,35 +2209,39 @@ static void handle_query_xfer_features(GdbCmdContext *gdb_ctx, void *user_ctx) len = memtox(gdb_ctx->str_buf + 1, xml + addr, total_len - addr); } - put_packet_binary(gdb_ctx->s, gdb_ctx->str_buf, len + 1, true); + put_packet_binary(s, gdb_ctx->str_buf, len + 1, true); } static void handle_query_attached(GdbCmdContext *gdb_ctx, void *user_ctx) { - put_packet(gdb_ctx->s, GDB_ATTACHED); + GDBState *s = gdbserver_state; + put_packet(s, GDB_ATTACHED); } static void handle_query_qemu_supported(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "sstepbits;sstep"); #ifndef CONFIG_USER_ONLY pstrcat(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), ";PhyMemMode"); #endif - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } #ifndef CONFIG_USER_ONLY static void handle_query_qemu_phy_mem_mode(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "%d", phy_memory_mode); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); } static void handle_set_qemu_phy_mem_mode(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; if (!gdb_ctx->num_params) { - put_packet(gdb_ctx->s, "E22"); + put_packet(s, "E22"); return; } @@ -2207,7 +2250,7 @@ static void handle_set_qemu_phy_mem_mode(GdbCmdContext *gdb_ctx, void *user_ctx) } else { phy_memory_mode = 1; } - put_packet(gdb_ctx->s, "OK"); + put_packet(s, "OK"); } #endif @@ -2319,51 +2362,56 @@ static GdbCmdParseEntry gdb_gen_set_table[] = { static void handle_gen_query(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + if (!gdb_ctx->num_params) { return; } - if (!process_string_cmd(gdb_ctx->s, NULL, gdb_ctx->params[0].data, + if (!process_string_cmd(s, NULL, gdb_ctx->params[0].data, gdb_gen_query_set_common_table, ARRAY_SIZE(gdb_gen_query_set_common_table))) { return; } - if (process_string_cmd(gdb_ctx->s, NULL, gdb_ctx->params[0].data, + if (process_string_cmd(s, NULL, gdb_ctx->params[0].data, gdb_gen_query_table, ARRAY_SIZE(gdb_gen_query_table))) { - put_packet(gdb_ctx->s, ""); + put_packet(s, ""); } } static void handle_gen_set(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; + if (!gdb_ctx->num_params) { return; } - if (!process_string_cmd(gdb_ctx->s, NULL, gdb_ctx->params[0].data, + if (!process_string_cmd(s, NULL, gdb_ctx->params[0].data, gdb_gen_query_set_common_table, ARRAY_SIZE(gdb_gen_query_set_common_table))) { return; } - if (process_string_cmd(gdb_ctx->s, NULL, gdb_ctx->params[0].data, + if (process_string_cmd(s, NULL, gdb_ctx->params[0].data, gdb_gen_set_table, ARRAY_SIZE(gdb_gen_set_table))) { - put_packet(gdb_ctx->s, ""); + put_packet(s, ""); } } static void handle_target_halt(GdbCmdContext *gdb_ctx, void *user_ctx) { + GDBState *s = gdbserver_state; char thread_id[16]; - gdb_fmt_thread_id(gdb_ctx->s, gdb_ctx->s->c_cpu, thread_id, + gdb_fmt_thread_id(s, s->c_cpu, thread_id, sizeof(thread_id)); snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "T%02xthread:%s;", GDB_SIGNAL_TRAP, thread_id); - put_packet(gdb_ctx->s, gdb_ctx->str_buf); + put_packet(s, gdb_ctx->str_buf); /* * Remove all the breakpoints when this query is issued, * because gdb is doing an initial connect and the state @@ -3052,10 +3100,9 @@ gdb_handlesig(CPUState *cpu, int sig) /* Tell the remote gdb that the process has exited due to SIG. */ void gdb_signalled(CPUArchState *env, int sig) { - GDBState *s; + GDBState *s = gdbserver_state; char buf[4]; - s = gdbserver_state; if (gdbserver_fd < 0 || s->fd < 0) { return; } From patchwork Fri Nov 15 17:29:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179521 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12768778ilf; Fri, 15 Nov 2019 09:43:43 -0800 (PST) X-Google-Smtp-Source: APXvYqw2d5OeWrpQJxRXFi5dqEFz2+p5eTeypesKQalIvQi2AMDNoS3Jk31xHqq1dADoWhALbaOh X-Received: by 2002:a5d:5411:: with SMTP id g17mr16279670wrv.360.1573839823704; Fri, 15 Nov 2019 09:43:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839823; cv=none; d=google.com; s=arc-20160816; b=GQDzccmIZoOGYYC1wAPGvH/gpGbXRkm54YKrN3MX6nuezvrhcrVqxlgvjVYTFBjAVP t3xPNHMPHfQ76xBfbATVF9ggnI7CEsrceT2UCETLQxFnPo+5z1CkPi8OfAC22LBFc2T0 VHTAXEuhgltAsdh/6C4+KSf0mKHswmCu6W2UhtkX7bRjFiaiUjPEfYTrh9V2CxWPEDkY IpYViXYyITUu1tOVrGvLbnV4Ba011lybJGHaEhzZpSV/KDlxFz5JT9hyFyaTv757SNmU 1Zdyq09bUkw9PsN781Viv8OlQSdLPz8BP1qstEcdz5bU3FFGJVEz8igdcqz6dV6I9R7u S4WA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=xblbiO5Nw1MXVkyo/Do5/EoAGGom4HjXnFpRhvBdVco=; b=FMP9Csyi+03del8CsWQbdl5Aeq7RKjPhfrGZYpVaqi7+tMro/dEtXAxRrszm+nRwK6 z8jq29qbFepoWlH3CczGYgg7yL43x81cUnXpxQ7RsZj3YuA4s8yJ1zDMo4DbqyseRw8+ vt1S3Uhg+t2bdIrr0qD08sZk8nfRAj6LmUwG27Ypo8P766o6GhzC3gAil5Cv1kwqnRub Ksm7Q0dQzkecDAq/AIH5aMvSYjnspen9EzHdyupyJnqkBTDIX6vH07mu1WF+UFdtkAiy XWJ7gqrf0H8xVxvDZcPHyMAAc5jistk1ZUompYgeQ5qHBVSPb+TjLmFWTfAPHM2NxMKQ BZyg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=DZbh5oMH; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id d30si4177361edb.403.2019.11.15.09.43.43 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:43:43 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=DZbh5oMH; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42946 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfdF-0003aY-RA for patch@linaro.org; Fri, 15 Nov 2019 12:43:41 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34821) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQD-0007I7-Tr for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQ8-0002ox-9s for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:13 -0500 Received: from mail-wr1-x443.google.com ([2a00:1450:4864:20::443]:34463) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQ7-0002nD-UV for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:08 -0500 Received: by mail-wr1-x443.google.com with SMTP id e6so11872462wrw.1 for ; Fri, 15 Nov 2019 09:30:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=xblbiO5Nw1MXVkyo/Do5/EoAGGom4HjXnFpRhvBdVco=; b=DZbh5oMH9/FJHyLPXM966Bk6m5fl65HOi1Bc640lVAHfwfVp8sq+x9uFHFi0GBufsm v460QvHTacVIxhxiOJ9uFp+tK27NCkg+sZqxws+6xKcMI6tmQFsfMWTBu2ZRP6hzkmeY kJfuNfLw9U/+ix3/rGvN9fbW0T1DcLZ5oeWkCmPFCu0f3pTyz0a58XvX+TKmYvYiK6PQ paMjYxTSsSgBj/ZHRamYggOUCl6YqnkJsfnmIrf1qFdq1pymXu6/VvJtBzLtpfFurhix uXBbtt2l8y2YtUq1LsscetfVZAeh0e5kqKkZHFu5G1JcUJQZuyPAtE5X37xx2bjFmins nN+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xblbiO5Nw1MXVkyo/Do5/EoAGGom4HjXnFpRhvBdVco=; b=Rc69ufqQtT6LI2nB+dlfK5bPd8899lpH1w2RE8Ds/MCoLXKMtpfoKem0C7v/CbuepN xjymQkIE2JIGgOAyc/Ch1jfuEpxUOE7MTaD1tYve5Nk+0f72IcVQmhpNeQ3HExsabSNa PFTGnThs52AEJ++9iujqWLbfezah0QjzwPiyeduIfcp4SZQ2Uq5Sk2bgz1VwgyaKbM8L oc3oHL1Nq87KPvwT5/F/eFn77xh9z3Y+KHTlKTppE3a5mtf/XzPSiUmqFazLAjeDheLD HOrZqg56Eme0XL6mR6S5s1AVnxWHU2mVnWy7qyXP5I4ynMxrBLPzw/KGNAQNrIaOrici QSdQ== X-Gm-Message-State: APjAAAVCbm1doQRblM4yHvhys5yMQOT5sBhqQGx3DmbIlgRJH6pLdJYM dINEMUXQwgQ6EqMJGbboY72bmw== X-Received: by 2002:adf:f547:: with SMTP id j7mr8711389wrp.69.1573839006564; Fri, 15 Nov 2019 09:30:06 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id a206sm11209372wmf.15.2019.11.15.09.30.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:02 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 16BD21FF90; Fri, 15 Nov 2019 17:30:01 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 03/11] gdbstub: move str_buf to GDBState and use GString Date: Fri, 15 Nov 2019 17:29:52 +0000 Message-Id: <20191115173000.21891-4-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::443 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, luis.machado@linaro.org, =?utf-8?q?Philipp?= =?utf-8?q?e_Mathieu-Daud=C3=A9?= , richard.henderson@linaro.org, alan.hayward@arm.com, =?utf-8?q?Alex_Be?= =?utf-8?b?bm7DqWU=?= Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Rather than having a static buffer replace str_buf with a GString which we know can grow on demand. Convert the internal functions to take a GString instead of a char * and length. Signed-off-by: Alex Bennée --- gdbstub.c | 194 ++++++++++++++++++++++++------------------------------ 1 file changed, 85 insertions(+), 109 deletions(-) -- 2.20.1 Reviewed-by: Richard Henderson diff --git a/gdbstub.c b/gdbstub.c index 2e6ff5f583c..528404c1953 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -365,6 +365,7 @@ typedef struct GDBState { int process_num; char syscall_buf[256]; gdb_syscall_complete_cb current_syscall_cb; + GString *str_buf; } GDBState; /* By default use no IRQs and no timers while single stepping so as to @@ -378,6 +379,7 @@ static GDBState *gdb_allocate_state(void) { g_assert(!gdbserver_state); gdbserver_state = g_new0(GDBState, 1); + gdbserver_state->str_buf = g_string_new(NULL); return gdbserver_state; } @@ -553,17 +555,15 @@ static inline int tohex(int v) } /* writes 2*len+1 bytes in buf */ -static void memtohex(char *buf, const uint8_t *mem, int len) +static void memtohex(GString *buf, const uint8_t *mem, int len) { int i, c; - char *q; - q = buf; for(i = 0; i < len; i++) { c = mem[i]; - *q++ = tohex(c >> 4); - *q++ = tohex(c & 0xf); + g_string_append_c(buf, tohex(c >> 4)); + g_string_append_c(buf, tohex(c & 0xf)); } - *q = '\0'; + g_string_append_c(buf, '\0'); } static void hextomem(uint8_t *mem, const char *buf, int len) @@ -657,24 +657,22 @@ static int put_packet(GDBState *s, const char *buf) } /* Encode data using the encoding for 'x' packets. */ -static int memtox(char *buf, const char *mem, int len) +static void memtox(GString *buf, const char *mem, int len) { - char *p = buf; char c; while (len--) { c = *(mem++); switch (c) { case '#': case '$': case '*': case '}': - *(p++) = '}'; - *(p++) = c ^ 0x20; + g_string_append_c(buf, '}'); + g_string_append_c(buf, c ^ 0x20); break; default: - *(p++) = c; + g_string_append_c(buf, c); break; } } - return p - buf; } static uint32_t gdb_get_cpu_pid(const GDBState *s, CPUState *cpu) @@ -1098,17 +1096,14 @@ static void gdb_set_cpu_pc(GDBState *s, target_ulong pc) cpu_set_pc(cpu, pc); } -static char *gdb_fmt_thread_id(const GDBState *s, CPUState *cpu, - char *buf, size_t buf_size) +static void gdb_append_thread_id(const GDBState *s, CPUState *cpu, GString *buf) { if (s->multiprocess) { - snprintf(buf, buf_size, "p%02x.%02x", - gdb_get_cpu_pid(s, cpu), cpu_gdb_index(cpu)); + g_string_append_printf(buf, "p%02x.%02x", + gdb_get_cpu_pid(s, cpu), cpu_gdb_index(cpu)); } else { - snprintf(buf, buf_size, "%02x", cpu_gdb_index(cpu)); + g_string_append_printf(buf, "%02x", cpu_gdb_index(cpu)); } - - return buf; } typedef enum GDBThreadIdKind { @@ -1402,7 +1397,6 @@ typedef struct GdbCmdContext { GdbCmdVariant *params; int num_params; uint8_t mem_buf[MAX_PACKET_LENGTH]; - char str_buf[MAX_PACKET_LENGTH + 1]; } GdbCmdContext; typedef void (*GdbCmdHandler)(GdbCmdContext *gdb_ctx, void *user_ctx); @@ -1494,6 +1488,8 @@ static void run_cmd_parser(GDBState *s, const char *data, return; } + g_string_set_size(s->str_buf, 0); + /* 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(s, NULL, data, cmd, 1)) { @@ -1742,8 +1738,8 @@ static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx) return; } - memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, reg_size); - put_packet(s, gdb_ctx->str_buf); + memtohex(s->str_buf, gdb_ctx->mem_buf, reg_size); + put_packet(s, s->str_buf->str); } static void handle_write_mem(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -1795,8 +1791,8 @@ static void handle_read_mem(GdbCmdContext *gdb_ctx, void *user_ctx) return; } - memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, gdb_ctx->params[1].val_ull); - put_packet(s, gdb_ctx->str_buf); + memtohex(s->str_buf, gdb_ctx->mem_buf, gdb_ctx->params[1].val_ull); + put_packet(s, s->str_buf->str); } static void handle_write_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -1835,8 +1831,8 @@ static void handle_read_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx) addr); } - memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, len); - put_packet(s, gdb_ctx->str_buf); + memtohex(s->str_buf, gdb_ctx->mem_buf, len); + put_packet(s, s->str_buf->str); } static void handle_file_io(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -1904,9 +1900,8 @@ static void handle_v_attach(GdbCmdContext *gdb_ctx, void *user_ctx) GDBState *s = gdbserver_state; GDBProcess *process; CPUState *cpu; - char thread_id[16]; - pstrcpy(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "E22"); + g_string_assign(s->str_buf, "E22"); if (!gdb_ctx->num_params) { goto cleanup; } @@ -1925,11 +1920,11 @@ static void handle_v_attach(GdbCmdContext *gdb_ctx, void *user_ctx) s->g_cpu = cpu; s->c_cpu = cpu; - gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id)); - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "T%02xthread:%s;", - GDB_SIGNAL_TRAP, thread_id); + g_string_printf(s->str_buf, "T%02xthread:", GDB_SIGNAL_TRAP); + gdb_append_thread_id(s, cpu, s->str_buf); + g_string_append_c(s->str_buf, ';'); cleanup: - put_packet(s, gdb_ctx->str_buf); + put_packet(s, s->str_buf->str); } static void handle_v_kill(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -1986,11 +1981,9 @@ static void handle_v_commands(GdbCmdContext *gdb_ctx, void *user_ctx) static void handle_query_qemu_sstepbits(GdbCmdContext *gdb_ctx, void *user_ctx) { GDBState *s = gdbserver_state; - - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), - "ENABLE=%x,NOIRQ=%x,NOTIMER=%x", SSTEP_ENABLE, - SSTEP_NOIRQ, SSTEP_NOTIMER); - put_packet(s, gdb_ctx->str_buf); + g_string_printf(s->str_buf, "ENABLE=%x,NOIRQ=%x,NOTIMER=%x", + SSTEP_ENABLE, SSTEP_NOIRQ, SSTEP_NOTIMER); + put_packet(s, s->str_buf->str); } static void handle_set_qemu_sstep(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -2008,9 +2001,8 @@ static void handle_set_qemu_sstep(GdbCmdContext *gdb_ctx, void *user_ctx) static void handle_query_qemu_sstep(GdbCmdContext *gdb_ctx, void *user_ctx) { GDBState *s = gdbserver_state; - - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "0x%x", sstep_flags); - put_packet(s, gdb_ctx->str_buf); + g_string_printf(s->str_buf, "0x%x", sstep_flags); + put_packet(s, s->str_buf->str); } static void handle_query_curr_tid(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -2018,7 +2010,6 @@ static void handle_query_curr_tid(GdbCmdContext *gdb_ctx, void *user_ctx) GDBState *s = gdbserver_state; CPUState *cpu; GDBProcess *process; - char thread_id[16]; /* * "Current thread" remains vague in the spec, so always return @@ -2027,27 +2018,24 @@ static void handle_query_curr_tid(GdbCmdContext *gdb_ctx, void *user_ctx) */ process = gdb_get_cpu_process(s, s->g_cpu); cpu = get_first_cpu_in_process(s, process); - gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id)); - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "QC%s", thread_id); - put_packet(s, gdb_ctx->str_buf); + g_string_assign(s->str_buf, "QC"); + gdb_append_thread_id(s, cpu, s->str_buf); + put_packet(s, s->str_buf->str); } static void handle_query_threads(GdbCmdContext *gdb_ctx, void *user_ctx) { GDBState *s = gdbserver_state; - char thread_id[16]; if (!s->query_cpu) { put_packet(s, "l"); return; } - gdb_fmt_thread_id(s, s->query_cpu, thread_id, - sizeof(thread_id)); - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "m%s", thread_id); - put_packet(s, gdb_ctx->str_buf); - s->query_cpu = - gdb_next_attached_cpu(s, s->query_cpu); + g_string_assign(s->str_buf, "m"); + gdb_append_thread_id(s, s->query_cpu, s->str_buf); + put_packet(s, s->str_buf->str); + s->query_cpu = gdb_next_attached_cpu(s, s->query_cpu); } static void handle_query_first_threads(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -2060,8 +2048,8 @@ static void handle_query_first_threads(GdbCmdContext *gdb_ctx, void *user_ctx) static void handle_query_thread_extra(GdbCmdContext *gdb_ctx, void *user_ctx) { GDBState *s = gdbserver_state; + g_autoptr(GString) rs = g_string_new(NULL); CPUState *cpu; - int len; if (!gdb_ctx->num_params || gdb_ctx->params[0].thread_id.kind == GDB_READ_THREAD_ERR) { @@ -2081,20 +2069,17 @@ static void handle_query_thread_extra(GdbCmdContext *gdb_ctx, void *user_ctx) /* Print the CPU model and name in multiprocess mode */ ObjectClass *oc = object_get_class(OBJECT(cpu)); const char *cpu_model = object_class_get_name(oc); - char *cpu_name = object_get_canonical_path_component(OBJECT(cpu)); - len = snprintf((char *)gdb_ctx->mem_buf, sizeof(gdb_ctx->str_buf) / 2, - "%s %s [%s]", cpu_model, cpu_name, - cpu->halted ? "halted " : "running"); - g_free(cpu_name); + g_autofree char *cpu_name; + cpu_name = object_get_canonical_path_component(OBJECT(cpu)); + g_string_printf(rs, "%s %s [%s]", cpu_model, cpu_name, + cpu->halted ? "halted " : "running"); } else { - /* memtohex() doubles the required space */ - len = snprintf((char *)gdb_ctx->mem_buf, sizeof(gdb_ctx->str_buf) / 2, - "CPU#%d [%s]", cpu->cpu_index, + g_string_printf(rs, "CPU#%d [%s]", cpu->cpu_index, cpu->halted ? "halted " : "running"); } - trace_gdbstub_op_extra_info((char *)gdb_ctx->mem_buf); - memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, len); - put_packet(s, gdb_ctx->str_buf); + trace_gdbstub_op_extra_info(rs->str); + memtohex(s->str_buf, (uint8_t *)rs->str, rs->len); + put_packet(s, s->str_buf->str); } #ifdef CONFIG_USER_ONLY @@ -2104,13 +2089,14 @@ static void handle_query_offsets(GdbCmdContext *gdb_ctx, void *user_ctx) TaskState *ts; ts = s->c_cpu->opaque; - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), - "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx - ";Bss=" TARGET_ABI_FMT_lx, - ts->info->code_offset, - ts->info->data_offset, - ts->info->data_offset); - put_packet(s, gdb_ctx->str_buf); + g_string_printf(s->str_buf, + "Text=" TARGET_ABI_FMT_lx + ";Data=" TARGET_ABI_FMT_lx + ";Bss=" TARGET_ABI_FMT_lx, + ts->info->code_offset, + ts->info->data_offset, + ts->info->data_offset); + put_packet(s, s->str_buf->str); } #else static void handle_query_rcmd(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -2143,12 +2129,10 @@ static void handle_query_supported(GdbCmdContext *gdb_ctx, void *user_ctx) GDBState *s = gdbserver_state; CPUClass *cc; - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "PacketSize=%x", - MAX_PACKET_LENGTH); + g_string_printf(s->str_buf, "PacketSize=%x", MAX_PACKET_LENGTH); cc = CPU_GET_CLASS(first_cpu); if (cc->gdb_core_xml_file) { - pstrcat(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), - ";qXfer:features:read+"); + g_string_append(s->str_buf, ";qXfer:features:read+"); } if (gdb_ctx->num_params && @@ -2156,8 +2140,8 @@ static void handle_query_supported(GdbCmdContext *gdb_ctx, void *user_ctx) s->multiprocess = true; } - pstrcat(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), ";multiprocess+"); - put_packet(s, gdb_ctx->str_buf); + g_string_append(s->str_buf, ";multiprocess+"); + put_packet(s, s->str_buf->str); } static void handle_query_xfer_features(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -2202,14 +2186,14 @@ static void handle_query_xfer_features(GdbCmdContext *gdb_ctx, void *user_ctx) } if (len < total_len - addr) { - gdb_ctx->str_buf[0] = 'm'; - len = memtox(gdb_ctx->str_buf + 1, xml + addr, len); + g_string_assign(s->str_buf, "m"); + memtox(s->str_buf, xml + addr, len); } else { - gdb_ctx->str_buf[0] = 'l'; - len = memtox(gdb_ctx->str_buf + 1, xml + addr, total_len - addr); + g_string_assign(s->str_buf, "l"); + memtox(s->str_buf, xml + addr, total_len - addr); } - put_packet_binary(s, gdb_ctx->str_buf, len + 1, true); + put_packet_binary(s, s->str_buf->str, s->str_buf->len, true); } static void handle_query_attached(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -2221,11 +2205,11 @@ static void handle_query_attached(GdbCmdContext *gdb_ctx, void *user_ctx) static void handle_query_qemu_supported(GdbCmdContext *gdb_ctx, void *user_ctx) { GDBState *s = gdbserver_state; - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "sstepbits;sstep"); + g_string_printf(s->str_buf, "sstepbits;sstep"); #ifndef CONFIG_USER_ONLY - pstrcat(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), ";PhyMemMode"); + g_string_append(s->str_buf, ";PhyMemMode"); #endif - put_packet(s, gdb_ctx->str_buf); + put_packet(s, s->str_buf->str); } #ifndef CONFIG_USER_ONLY @@ -2233,8 +2217,8 @@ static void handle_query_qemu_phy_mem_mode(GdbCmdContext *gdb_ctx, void *user_ctx) { GDBState *s = gdbserver_state; - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "%d", phy_memory_mode); - put_packet(s, gdb_ctx->str_buf); + g_string_printf(s->str_buf, "%d", phy_memory_mode); + put_packet(s, s->str_buf->str); } static void handle_set_qemu_phy_mem_mode(GdbCmdContext *gdb_ctx, void *user_ctx) @@ -2405,13 +2389,10 @@ static void handle_gen_set(GdbCmdContext *gdb_ctx, void *user_ctx) static void handle_target_halt(GdbCmdContext *gdb_ctx, void *user_ctx) { GDBState *s = gdbserver_state; - char thread_id[16]; - - gdb_fmt_thread_id(s, s->c_cpu, thread_id, - sizeof(thread_id)); - snprintf(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), "T%02xthread:%s;", - GDB_SIGNAL_TRAP, thread_id); - put_packet(s, gdb_ctx->str_buf); + g_string_printf(s->str_buf, "T%02xthread:", GDB_SIGNAL_TRAP); + gdb_append_thread_id(s, s->c_cpu, s->str_buf); + g_string_append_c(s->str_buf, ';'); + put_packet(s, s->str_buf->str); /* * Remove all the breakpoints when this query is issued, * because gdb is doing an initial connect and the state @@ -2675,8 +2656,8 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) { GDBState *s = gdbserver_state; CPUState *cpu = s->c_cpu; - char buf[256]; - char thread_id[16]; + g_autoptr(GString) buf = g_string_new(NULL); + g_autoptr(GString) tid = g_string_new(NULL); const char *type; int ret; @@ -2694,7 +2675,7 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) return; } - gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id)); + gdb_append_thread_id(s, cpu, tid); switch (state) { case RUN_STATE_DEBUG: @@ -2712,10 +2693,9 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) } trace_gdbstub_hit_watchpoint(type, cpu_gdb_index(cpu), (target_ulong)cpu->watchpoint_hit->vaddr); - snprintf(buf, sizeof(buf), - "T%02xthread:%s;%swatch:" TARGET_FMT_lx ";", - GDB_SIGNAL_TRAP, thread_id, type, - (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 = NULL; goto send_packet; } else { @@ -2756,10 +2736,10 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) break; } gdb_set_stop_cpu(cpu); - snprintf(buf, sizeof(buf), "T%02xthread:%s;", ret, thread_id); + g_string_printf(buf, "T%02xthread:%s;", ret, tid->str); send_packet: - put_packet(s, buf); + put_packet(s, buf->str); /* disable single step if it was enabled */ cpu_single_step(cpu, 0); @@ -3248,13 +3228,9 @@ static void gdb_chr_event(void *opaque, int event) static void gdb_monitor_output(GDBState *s, const char *msg, int len) { - char buf[MAX_PACKET_LENGTH]; - - buf[0] = 'O'; - if (len > (MAX_PACKET_LENGTH/2) - 1) - len = (MAX_PACKET_LENGTH/2) - 1; - memtohex(buf + 1, (uint8_t *)msg, len); - put_packet(s, buf); + g_autoptr(GString) buf = g_string_new("O"); + memtohex(buf, (uint8_t *)msg, len); + put_packet(s, buf->str); } static int gdb_monitor_write(Chardev *chr, const uint8_t *buf, int len) From patchwork Fri Nov 15 17:29:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179517 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12764581ilf; Fri, 15 Nov 2019 09:39:53 -0800 (PST) X-Google-Smtp-Source: APXvYqynUU/SyFRwnbd4gouION/RQlCIRcJqt3t8/1FR4DaeM8kQWIc1+Dtn5c8oKe9T5zlyC97V X-Received: by 2002:a37:847:: with SMTP id 68mr12734485qki.366.1573839593418; Fri, 15 Nov 2019 09:39:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839593; cv=none; d=google.com; s=arc-20160816; b=ZPl+JshVBYoApBgWUqfjuZvWaV88Ixt7pxJGsmOdIcpw2X7Zf+PcVBa5ab9BJ9GHqG 7p3cyKkptVG34PMMDnRwTZze3n0HJmxAgyLVQdtD2oLJ/qOCYWymO2p3niSecR/39o7R QMI1iVQmF8wXL26ASWqgOk8475J98DAR+Y9yC2jKPzw4gnU7/+J9fKfbtux92SlgHQEp lQeZJdUAoKZp/oCzIw0eVV+3J3ISfypWDXYJD1fAl2WqsCWG4PrpdgDpUSwspbAXCyAX 7CaiVxOrkstigFsxBWENTZCHb+EQHvqV760tkqXVyrXeE4dCdiR5FQ2gHi/wBxXbdP8T q6lw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=foxVFkukIuN7paaMzE4/YUfiP7VYKyDwOA+0UfKOdTQ=; b=kDI/GnNnDPKqcW8XJ/r/pW3XAx4Nifgu4iGMpeBvb6DbxHCBYe1NTzldpWTBE6VYcS Y+qT8PhCoBdmWRZWni1x7eBXCzH1VgZeqgXwsDMJCm2IyjC6+HUOWg6lzEl9Y3C6Vqvi bBViL0W6YG+dzQQR0HVo1V+Y/BhQLl8cIGvF4jDvnwRVOcQ5nCmWP7W1bhzsvaHvjoFR 5JkPQQ2Id3GClA/TPLidPziXgPMLbRyu/Dy/U0A1nMbgoOVdpNSB4DBvWA3K+SKAkQ78 SBN7It7f9UhVbC1vmX4IPxJdawa7w1kOi2Umb5fXwwWB9L3mYD3aaTmw7rhLgX9dN8AK 9DCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=x9wP01wZ; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id v202si5752908qkb.348.2019.11.15.09.39.53 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:39:53 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=x9wP01wZ; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42890 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfZY-0002Bk-9L for patch@linaro.org; Fri, 15 Nov 2019 12:39:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34787) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQC-0007H1-U8 for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQ9-0002rw-Pf for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:12 -0500 Received: from mail-wr1-x443.google.com ([2a00:1450:4864:20::443]:36695) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQ9-0002qA-H0 for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:09 -0500 Received: by mail-wr1-x443.google.com with SMTP id r10so11851587wrx.3 for ; Fri, 15 Nov 2019 09:30:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=foxVFkukIuN7paaMzE4/YUfiP7VYKyDwOA+0UfKOdTQ=; b=x9wP01wZiLln14PjSlCZCsRs1iCDrYkLwswudyWg92IAQZy1pUcLcBpID8iz0fFKWn VkBM0R87iYcOvJPa/cdMzOtLL0U1X93y0izcWBM5HVlJcjU7saoP1qOcMn1OOAylVNtF 1CwfET+UwsStcq9lClVYnORLWqOtTbQZdfVMiNYpH+SyHijmIGd865Nv0worcuQ5JlqT Qi0NmDcTkOKn7m66VKUbX1JQ75393NHP6eq9WTe52j2FamTRf1059od3zobTqU5x4Wsh MLiX18Y2UrNSCeibFe/YRve2ZVBjFtwUnjGdObnzIkPYpLapg2hNXlADvGsMW7LtqUgE hGvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=foxVFkukIuN7paaMzE4/YUfiP7VYKyDwOA+0UfKOdTQ=; b=e7la2l/+87rbgxSGzgBGBRHjY6oiHKJyJIxVrI1KJOpnr581CsEwk6r4MCmMCYz5XS XB1ClkHbDL75QjWssU8hEG0/1BEo/ddaVvJAUHJAcv0EXvpl4gZeao2031f6AeAvLzHE 8gY0BdLBZ+H5Y5w9XxfRoupWdAaUeiAWZOKgnQfGltxU8TeBZ4NruhCNHoM22AOZ1O54 PN8P2E3tI2wRcqnf7vqlEQ280LI+X9b28+E+YaUlqFezaujlfFtJcYZMz1oue3fDkjXR OCc05Ax1i8yzizb8D5msIFPx0fzZWooGN3bZ5Qeg4lvifyY+ZqIAsUakLPsbCDYVDSEy +4oA== X-Gm-Message-State: APjAAAX8gLRoSAPpti4jIhcPMkx5ungbmdFcSsCORI9H6W0fIdw6L7MD x3qXNvFpWMz7jbaZEmeRnWpePA== X-Received: by 2002:a5d:518c:: with SMTP id k12mr16530080wrv.104.1573839008333; Fri, 15 Nov 2019 09:30:08 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id j14sm11766564wrp.16.2019.11.15.09.30.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:05 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 2B49A1FF91; Fri, 15 Nov 2019 17:30:01 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 04/11] gdbstub: move mem_buf to GDBState and use GByteArray Date: Fri, 15 Nov 2019 17:29:53 +0000 Message-Id: <20191115173000.21891-5-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::443 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, luis.machado@linaro.org, =?utf-8?q?Philipp?= =?utf-8?q?e_Mathieu-Daud=C3=A9?= , richard.henderson@linaro.org, alan.hayward@arm.com, =?utf-8?q?Alex_Be?= =?utf-8?b?bm7DqWU=?= Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" This is in preparation for further re-factoring of the register API with the rest of the code. Theoretically the read register function could overwrite the MAX_PACKET_LENGTH buffer although currently all registers are well within the size range. Signed-off-by: Alex Bennée --- gdbstub.c | 52 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 21 deletions(-) -- 2.20.1 Reviewed-by: Richard Henderson diff --git a/gdbstub.c b/gdbstub.c index 528404c1953..4c3e211890f 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -366,6 +366,7 @@ typedef struct GDBState { char syscall_buf[256]; gdb_syscall_complete_cb current_syscall_cb; GString *str_buf; + GByteArray *mem_buf; } GDBState; /* By default use no IRQs and no timers while single stepping so as to @@ -380,6 +381,7 @@ static GDBState *gdb_allocate_state(void) g_assert(!gdbserver_state); gdbserver_state = g_new0(GDBState, 1); gdbserver_state->str_buf = g_string_new(NULL); + gdbserver_state->mem_buf = g_byte_array_sized_new(MAX_PACKET_LENGTH); return gdbserver_state; } @@ -566,12 +568,13 @@ static void memtohex(GString *buf, const uint8_t *mem, int len) g_string_append_c(buf, '\0'); } -static void hextomem(uint8_t *mem, const char *buf, int len) +static void hextomem(GByteArray *mem, const char *buf, int len) { int i; for(i = 0; i < len; i++) { - mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]); + guint8 byte = fromhex(buf[0]) << 4 | fromhex(buf[1]); + g_byte_array_append(mem, &byte, 1); buf += 2; } } @@ -1396,7 +1399,6 @@ static int cmd_parse_params(const char *data, const char *schema, typedef struct GdbCmdContext { GdbCmdVariant *params; int num_params; - uint8_t mem_buf[MAX_PACKET_LENGTH]; } GdbCmdContext; typedef void (*GdbCmdHandler)(GdbCmdContext *gdb_ctx, void *user_ctx); @@ -1489,6 +1491,7 @@ static void run_cmd_parser(GDBState *s, const char *data, } g_string_set_size(s->str_buf, 0); + g_byte_array_set_size(s->mem_buf, 0); /* In case there was an error during the command parsing we must * send a NULL packet to indicate the command is not supported */ @@ -1710,8 +1713,8 @@ static void handle_set_reg(GdbCmdContext *gdb_ctx, void *user_ctx) } reg_size = strlen(gdb_ctx->params[1].data) / 2; - hextomem(gdb_ctx->mem_buf, gdb_ctx->params[1].data, reg_size); - gdb_write_register(s->g_cpu, gdb_ctx->mem_buf, + hextomem(s->mem_buf, gdb_ctx->params[1].data, reg_size); + gdb_write_register(s->g_cpu, s->mem_buf->data, gdb_ctx->params[0].val_ull); put_packet(s, "OK"); } @@ -1731,14 +1734,16 @@ static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx) return; } - reg_size = gdb_read_register(s->g_cpu, gdb_ctx->mem_buf, + reg_size = gdb_read_register(s->g_cpu, s->mem_buf->data, gdb_ctx->params[0].val_ull); if (!reg_size) { put_packet(s, "E14"); return; + } else { + g_byte_array_set_size(s->mem_buf, reg_size); } - memtohex(s->str_buf, gdb_ctx->mem_buf, reg_size); + memtohex(s->str_buf, s->mem_buf->data, reg_size); put_packet(s, s->str_buf->str); } @@ -1757,11 +1762,11 @@ static void handle_write_mem(GdbCmdContext *gdb_ctx, void *user_ctx) return; } - hextomem(gdb_ctx->mem_buf, gdb_ctx->params[2].data, + hextomem(s->mem_buf, gdb_ctx->params[2].data, gdb_ctx->params[1].val_ull); if (target_memory_rw_debug(s->g_cpu, gdb_ctx->params[0].val_ull, - gdb_ctx->mem_buf, - gdb_ctx->params[1].val_ull, true)) { + s->mem_buf->data, + s->mem_buf->len, true)) { put_packet(s, "E14"); return; } @@ -1784,14 +1789,16 @@ static void handle_read_mem(GdbCmdContext *gdb_ctx, void *user_ctx) return; } + g_byte_array_set_size(s->mem_buf, gdb_ctx->params[1].val_ull); + if (target_memory_rw_debug(s->g_cpu, gdb_ctx->params[0].val_ull, - gdb_ctx->mem_buf, - gdb_ctx->params[1].val_ull, false)) { + s->mem_buf->data, + s->mem_buf->len, false)) { put_packet(s, "E14"); return; } - memtohex(s->str_buf, gdb_ctx->mem_buf, gdb_ctx->params[1].val_ull); + memtohex(s->str_buf, s->mem_buf->data, s->mem_buf->len); put_packet(s, s->str_buf->str); } @@ -1807,9 +1814,9 @@ static void handle_write_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx) } cpu_synchronize_state(s->g_cpu); - registers = gdb_ctx->mem_buf; len = strlen(gdb_ctx->params[0].data) / 2; - hextomem(registers, gdb_ctx->params[0].data, len); + hextomem(s->mem_buf, gdb_ctx->params[0].data, len); + registers = s->mem_buf->data; for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) { reg_size = gdb_write_register(s->g_cpu, registers, addr); @@ -1827,11 +1834,13 @@ static void handle_read_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx) cpu_synchronize_state(s->g_cpu); len = 0; for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) { - len += gdb_read_register(s->g_cpu, gdb_ctx->mem_buf + len, + len += gdb_read_register(s->g_cpu, s->mem_buf->data + len, addr); } + /* FIXME: This is after the fact sizing */ + g_byte_array_set_size(s->mem_buf, len); - memtohex(s->str_buf, gdb_ctx->mem_buf, len); + memtohex(s->str_buf, s->mem_buf->data, len); put_packet(s, s->str_buf->str); } @@ -2102,6 +2111,7 @@ static void handle_query_offsets(GdbCmdContext *gdb_ctx, void *user_ctx) static void handle_query_rcmd(GdbCmdContext *gdb_ctx, void *user_ctx) { GDBState *s = gdbserver_state; + const guint8 zero = 0; int len; if (!gdb_ctx->num_params) { @@ -2116,11 +2126,11 @@ static void handle_query_rcmd(GdbCmdContext *gdb_ctx, void *user_ctx) } len = len / 2; - hextomem(gdb_ctx->mem_buf, gdb_ctx->params[0].data, len); - gdb_ctx->mem_buf[len++] = 0; - qemu_chr_be_write(s->mon_chr, gdb_ctx->mem_buf, len); + g_byte_array_set_size(s->mem_buf, len); + hextomem(s->mem_buf, gdb_ctx->params[0].data, len); + g_byte_array_append(s->mem_buf, &zero, 1); + qemu_chr_be_write(s->mon_chr, s->mem_buf->data, s->mem_buf->len); put_packet(s, "OK"); - } #endif From patchwork Fri Nov 15 17:29:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179516 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12764191ilf; Fri, 15 Nov 2019 09:39:33 -0800 (PST) X-Google-Smtp-Source: APXvYqx/hPUVOnQ4YIjRrDXymPEv14u1TJANRc/YHlv/Pv+p6BG7ioIh/hAvr2IKXO3UpPnp8QxD X-Received: by 2002:ae9:de44:: with SMTP id s65mr13759765qkf.203.1573839573008; Fri, 15 Nov 2019 09:39:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839573; cv=none; d=google.com; s=arc-20160816; b=XpA2graCdfcfDWlOLBzYmhOjd2y4xovVwdqPK5JxoIaFLF3XO05SMIbwAIIlpUTyjM Ct5BsyVtS7lgRCjH9InQhjbUTvQJlQ/boDG6cQkjle4CfmNg7K00Z410ZEqU1cm0Yg/R 7UGA9Y7y/bJ4eqSoIb9jwNs6TLyUSzZ4WTar++NLjW3SCMVIYuMaYlQTHk1zwkxTcbT1 CPrGlkZWI/FsDB+bxo1X5y2KmNXkuM9Q6m6KJwglkjAXZrcOgGOVXs3X1LUCmlLCYWHk cirxZBmXUi1jn0tJofIgFBVamHl1oME8GyandZzaRvuUcWp5jldeXhM2pVDyMu6If7el Rhzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=KfmaSXFX++HxYtO8EVIuNn6/A2yXcCkH+lwca/Fidq8=; b=U2LnyvP/MA7juxcQZ24oRJbMHtQEojflJyNzaUIJVXB3AgubHfBH6jbYqKTUQgscq0 ldEEhSG9Zv1U3ps/wF/V2gLoGEMjLa+3h2huj7vgOhbv6HueI8JJqooXuM6cwMbuvaBX Fmj2w949sk7LFfLv07cU334ZCoNxDM7GVs865fkfsxOQ4SdfpYdXZSxPOyfcbtjHmN6g 8oXHOTPY1SxqtyfqsD/0CYFdPMqSlwBlZlL+WUthbSD6EOT3+6SrkHfLLohu2nC4Eh42 zajFFTbPt/rF53PqN36nUEOExFl/XXXRYVrhSCSgOf+bIOOQHV5dXD2f+DODYpp8caSF gsUg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=dRDXDlhw; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id k50si6208098qtf.308.2019.11.15.09.39.32 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:39:32 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=dRDXDlhw; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42870 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfZD-0001GZ-LW for patch@linaro.org; Fri, 15 Nov 2019 12:39:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34801) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQD-0007HN-Av for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQB-0002uV-TG for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:13 -0500 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]:34396) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQB-0002t6-8L for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:11 -0500 Received: by mail-wr1-x435.google.com with SMTP id e6so11872647wrw.1 for ; Fri, 15 Nov 2019 09:30:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=KfmaSXFX++HxYtO8EVIuNn6/A2yXcCkH+lwca/Fidq8=; b=dRDXDlhw5etW6ZnJr+sAhAFt4Mxr3cBo0JkdmHz6H5DYxwURH1xxRrAq3vIEX7dNtX 459rADhcJPOeLQLqmENx0yCM94Nr91hb4+hKVL/gxJifOYpDjKmWNczuOHIKxGnIWClG OuQmFDCj345XvhBnC54HVSlVlo/X5E/GmFzRTsTAuB2UJXQ6K8c49EAWNts1EamZUaeo h4jYhwZ1GQKT9p/plIvTLpGGZMIoIt+cw2WF/SlPDEQfoYkpRSKBxZ+1NNsDeYoQ1+LQ R3aCTKramSXWeNNMa+27Rtov4k0krX7S0IKYRQFDa+cZzdI/OVQx8ia+G4F8xvgj+yIj GWiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=KfmaSXFX++HxYtO8EVIuNn6/A2yXcCkH+lwca/Fidq8=; b=edXKxd/Zui1c4DzuiDvTclrTRYVzUtMVxtGYvAynwoc3HuvJQxhCRNJ2ijMxCGRMw6 0oz9H/P2xv+atgTvc3gBWxqp9sYbj1Kszl3bgEHXwktOQJksxn/6pXLHS358+0y4k8I7 kYKRejCU5aiOYgegAHABnROhWM/jmn6goBsjvzS261IvctfcK15NplgZfKJEnJvZoXOF akQOXkFU+qckD4RANoD7fr8W/cH0sgeAGYqQnUO0Xfs16AyPKJlnD4e3Ps+4p9jc6dEP oWSDhRSNYvL0rMa+NYXWrTPVggS/Vw1RcDFSxZfEMjs/gafTlKZjzJJhwX4qLNYKltnK p/sg== X-Gm-Message-State: APjAAAW7wBr5cLxAvoR2WutK73nB9P3wQ7Ie/MJk2oM96dHtS1M7prq3 Nf5F158TiWwP6O+W50aJUCKZkhF7f0A= X-Received: by 2002:adf:e74e:: with SMTP id c14mr16001867wrn.124.1573839010037; Fri, 15 Nov 2019 09:30:10 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id d13sm11467244wrq.51.2019.11.15.09.30.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:06 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 3E9961FF92; Fri, 15 Nov 2019 17:30:01 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 05/11] gdbstub: add helper for 128 bit registers Date: Fri, 15 Nov 2019 17:29:54 +0000 Message-Id: <20191115173000.21891-6-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::435 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, luis.machado@linaro.org, =?utf-8?q?Alex_Be?= =?utf-8?b?bm7DqWU=?= , richard.henderson@linaro.org, alan.hayward@arm.com Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Alex Bennée --- include/exec/gdbstub.h | 8 ++++++++ 1 file changed, 8 insertions(+) -- 2.20.1 diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h index 08363969c14..a898a2af990 100644 --- a/include/exec/gdbstub.h +++ b/include/exec/gdbstub.h @@ -102,6 +102,14 @@ static inline int gdb_get_reg64(uint8_t *mem_buf, uint64_t val) return 8; } +static inline int gdb_get_reg128(uint8_t *mem_buf, uint64_t val_hi, + uint64_t val_lo) +{ + stq_p(mem_buf, val_hi); + stq_p(mem_buf + 8, val_lo); + return 16; +} + #if TARGET_LONG_BITS == 64 #define gdb_get_regl(buf, val) gdb_get_reg64(buf, val) #define ldtul_p(addr) ldq_p(addr) From patchwork Fri Nov 15 17:29:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179512 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12754062ilf; Fri, 15 Nov 2019 09:31:21 -0800 (PST) X-Google-Smtp-Source: APXvYqzM8ByG5i/3uQItJxjvn9ksRCT5zyQT/FAX8ggXCzy/SwAHpQQuuNIzbVupcagx2hloGs+e X-Received: by 2002:a05:6000:104:: with SMTP id o4mr15804098wrx.309.1573839081605; Fri, 15 Nov 2019 09:31:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839081; cv=none; d=google.com; s=arc-20160816; b=o4p6pr9mNlh+cNdttzKtzS6xIKAH9T7n9zVGjjtcnr6RLsiKbt2ao2fidQFggNx9Yp +XIUJYNG0jR3kaOe79oYTvITO2BZpP65mCTC+rujniCMWj7EzKi4FFEZ048cxVQj5VTE YdbNrx91qkN77baM2Cv9+nb/ZTtDUiDlOPmftut/vRgT8/VQyOJ5k0dHfwZQ72KHzD4u 5koPaF3MltMjpL5+m8JI7IzC2LYhPMoa67oxgpSSzj7DrRFU1iPlb5bAbTPteGbn48PE ieqNnbDij+2CRYGob/0cx/S4yAShWCCIseg1nrPirJFQUP5sVxuTIcw8fbLFbHyQTRX7 8ixQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=FvqkNjD95DMP7rRbR4+6wxS5O0FAiAqBbCxy5IHZW2U=; b=zGuw9FGOjzO0UNmpQDNrY45e0n8qopDWFOlarq/qP05cyU2vxFItyqHvkjRTYwZNBB SCWgxVuP8IZrjww9FEm9QP4kUXvypDJDfGOHV86uCZHrILK/1XGyAIc+UfeBL+oXgjDM iclV8h8uhdt5KzpgD/rAn8rfJJxDe2X6sTb6gKZb7Zvsto4teYUyar5fZTkHL7407E5V NBMavcbIb1XXYziOGG9AHWo6xH0cAzBA9uWk2nEq9PEn8IrsRqis00yHnLNDZhElljbb ndFyp7l39fSgjZgplEDxK1Y1u5ZVZVbL7cgCAat6v5BkKjq4HgAqxLNvDunl5v+VnJYi sJqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=UBvrS5tr; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id t18si6299387eds.247.2019.11.15.09.31.21 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:31:21 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=UBvrS5tr; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42660 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfRH-0007L1-6C for patch@linaro.org; Fri, 15 Nov 2019 12:31:19 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34815) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQD-0007Hy-KO for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQC-0002v0-Cw for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:13 -0500 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]:38250) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQC-0002u0-4j for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:12 -0500 Received: by mail-wm1-x341.google.com with SMTP id z19so11300838wmk.3 for ; Fri, 15 Nov 2019 09:30:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FvqkNjD95DMP7rRbR4+6wxS5O0FAiAqBbCxy5IHZW2U=; b=UBvrS5trbwfttiOHG7vjnXoSs2bp/NypEi8eDE5ZtlnEBlX1kce5ScEyciNbaJZTcS 5aMHUjPHPRG4Dw6d6TwNIVhVAoUEt5tFzR0kzc8y+wHv24GEfteVEtC+ZVIjbKBkHhaH S9WJR1s6nQl+l9ubUKLitI1ETv9BiO9KWkCsIMrZsDqYhWAq0pubj5wAelMycsMUyUlI JiX4ejyt6WHd0Db62wkfDWqa0XIxc+3vQd4AOLd/L/ONhhsOsQLJfliYF1Ko7qW0MNg/ SUZ7UpXWpxyMygEEpQP2763OFMDRD3QHSJtEaAdAGo3Wkixll4IstriHFIbPTnlHSkPR DCNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FvqkNjD95DMP7rRbR4+6wxS5O0FAiAqBbCxy5IHZW2U=; b=DGO93A9xGw8Z+2c+uTWmEBN0YqkAQ2TO0YbWIKK0Tq1VNunHBL5oRd2U3/p0fH7mYX tIRma+F1uVdMEaXWYj/dXRy1BZe5I+y4F/iJyMFOGab3pWaGPyfnGg9JDY44n3XUzP48 P7ObOpXx8fHvcotKVRr2nn6tQl3drxc4ZeyAaeOsU4LH5pwBm8IbtdPntLhqO0yFknXo lyMtv4ere5BonHC1sTqaLt5n3DKp2ZDDYrJVsvedsVT6jSXU1HTqGzgN/Qv+xmZUjblw hiDAH8T6tfNJZ+S63tedWK1j9TWscLFf6saj2pt03FwhxrM6eOhuhG5WN24EJorSPrrU aA7A== X-Gm-Message-State: APjAAAXTieNauXbdIcFXrKkttrYTu6fRN/ld865KcNvMuKcUuGF6YTRJ 2IlnPu5FEThurk4QhE5HQOPDZA== X-Received: by 2002:a1c:3b08:: with SMTP id i8mr15322001wma.56.1573839010924; Fri, 15 Nov 2019 09:30:10 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id d18sm12464309wrm.85.2019.11.15.09.30.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:06 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 53E681FF93; Fri, 15 Nov 2019 17:30:01 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 06/11] target/arm: use gdb_get_reg helpers Date: Fri, 15 Nov 2019 17:29:55 +0000 Message-Id: <20191115173000.21891-7-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::341 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, Peter Maydell , luis.machado@linaro.org, richard.henderson@linaro.org, "open list:ARM TCG CPUs" , alan.hayward@arm.com, =?utf-8?q?Alex?= =?utf-8?q?_Benn=C3=A9e?= Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" This is cleaner than poking memory directly and will make later clean-ups easier. Signed-off-by: Alex Bennée --- target/arm/helper.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) -- 2.20.1 diff --git a/target/arm/helper.c b/target/arm/helper.c index be67e2c66d6..bd821931b3d 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -105,21 +105,17 @@ static int aarch64_fpu_gdb_get_reg(CPUARMState *env, uint8_t *buf, int reg) { switch (reg) { case 0 ... 31: + { /* 128 bit FP register */ - { - uint64_t *q = aa64_vfp_qreg(env, reg); - stq_le_p(buf, q[0]); - stq_le_p(buf + 8, q[1]); - return 16; - } + uint64_t *q = aa64_vfp_qreg(env, reg); + return gdb_get_reg128(buf, q[0], q[1]); + } case 32: /* FPSR */ - stl_p(buf, vfp_get_fpsr(env)); - return 4; + return gdb_get_reg32(buf, vfp_get_fpsr(env)); case 33: /* FPCR */ - stl_p(buf, vfp_get_fpcr(env)); - return 4; + return gdb_get_reg32(buf,vfp_get_fpcr(env)); default: return 0; } From patchwork Fri Nov 15 17:29:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179513 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12754661ilf; Fri, 15 Nov 2019 09:31:49 -0800 (PST) X-Google-Smtp-Source: APXvYqyjfX9dulCwOmBE9HP+cvqPbx9bXUPq4vH80p1v6Crstc9jLtl1kXIop79wikViPp2qQknw X-Received: by 2002:adf:c401:: with SMTP id v1mr8098234wrf.375.1573839109474; Fri, 15 Nov 2019 09:31:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839109; cv=none; d=google.com; s=arc-20160816; b=Mp01bO/wcW2WP3VOUodM5BXfJ3U7eAZy0cW+vplcfIbV64TH5qF5nLcpO95DnDTcw0 EydtymX63jY2y1R4i/+P2mJIyRw1rqJ9VswY1FmyEvafg15NCf8KcN/PsaoYnsC/yeJe 48MfNI3xSetYMrOOyYVJKOS0/GcXUUGTyAO+zzMhF4tyJSRmaf/J36JlnD73wq0MHj8z NUU3gDYrrFVBoAj17z/AUYUfUxWe8XH0ErcZMFGPsh05iYdVyLwqEttFUx1qhRpSNGLq ofAh6/P5d2+CEG0F1kbPHyqNoZtn68YoO6luRdH9AuOKgnKyTk09pbi6s1Js/QOh2eZg JfQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=BHDxU8iZVrNx1udU01MCyPFAL7yLbjoQGxN2YxYLy1A=; b=JfGC+04y2SbtbbfihooygChh5r2qI/7maRxJCIyGqxKj49dvNdz6kFUCKSNnnyovmn chWPI/OQ+/RFRn6UhztNDuvsFIIGS9GIxOkz6Q/NcjIjzdWOp85HAqJbew5KYaBmveTf KPJ/1y8l6nDpDxnsbxbTGUFQpnBfoGgpuURt0/JVVYiNTdaH/XbMOeeX8ubZX5pXvKXW /lnJ/zjBRPVjXeUAS9o7ve/MdBKP2vBovw5ZghwXyuiHDg4xEMhdNINaAKwsitpCJFbG AJ75NMsZWMlnub3oTRWpqp+yajtfdu8XsIcKuW7zh4aPEF5Lp+x4TDfGlif5ZtU9q2fe Jbxg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=HvCqiyPT; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id bs2si6387276edb.354.2019.11.15.09.31.49 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:31:49 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=HvCqiyPT; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42740 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfRj-000871-DN for patch@linaro.org; Fri, 15 Nov 2019 12:31:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34852) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQF-0007JC-3Q for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQD-0002wG-Jd for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:14 -0500 Received: from mail-wr1-x444.google.com ([2a00:1450:4864:20::444]:34465) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQD-0002vO-AO for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:13 -0500 Received: by mail-wr1-x444.google.com with SMTP id e6so11872751wrw.1 for ; Fri, 15 Nov 2019 09:30:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BHDxU8iZVrNx1udU01MCyPFAL7yLbjoQGxN2YxYLy1A=; b=HvCqiyPT/7hrIDrY6aaFIDF2iJ7jzctrTr8OK0I7TFJZTQYFyhQTh3zcQViU6LEDZh 66FFkC0JQf+bGeOKaVSyOw1PYJ0CL7dG981uliei2XX+P9gHbjoxIfIg1jlkHKfI5nZm LxXBMzNO1zsr2qze3IhzZtJCD6NHdXDVq9WPwZZhDGxQ9V+3sMQACx+pORjECAyt+ACY lUxUaHeQQ4cKhx+K9RexOgWMBW/j8Tg6R37iGrafNSTGsth5V0hhP+oM5piqN8g/osb8 W6+Nbo60nezip82Rnww6K7gQdJvrcZLM0JOvwtR6zPR+JQPqdt24Eqa+SBcxXJ3B6Fqb pY2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BHDxU8iZVrNx1udU01MCyPFAL7yLbjoQGxN2YxYLy1A=; b=Q9sulkDpaeE+8vxvQOGz78oQ+ZzCu6+nidoCc1vYLaQTh2l6Ct1tiEDKzO1m1hbCJo 67OGpCUCTKeZ80gEQsZtffL5Cq0lEsKRhv4fhzMdX1O7jWpvOiTkw2SFuh0uHaCFx+Ik Ej8/xvDZQX3gbslKz/hOKZNaUMDDhXr0PleOx1umosuIVOgMMPP/iaAhcZ+6DDWFWpwJ J9ShEaa8WXx1P9vRrRzvD5H6IJnuHQYBBIj9NoR1zqD/a0dLOaYtz4LfsJyWJilGO6NR RZYCbfivVYhPmjaqZUdIYSzrCMbOb6xCWE5WwXkmairVwJ4ShAScTsC6zL9D004EdFEb /c+A== X-Gm-Message-State: APjAAAWykJtgX6kiq8G55mktasglOAfD7oRby0Uqub954WyQRGH3doCD jcn525XhgDhXDoYgiK/NmBivhw== X-Received: by 2002:a5d:5404:: with SMTP id g4mr13035975wrv.359.1573839012186; Fri, 15 Nov 2019 09:30:12 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id t13sm11580645wrr.88.2019.11.15.09.30.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:06 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 682531FF96; Fri, 15 Nov 2019 17:30:01 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 07/11] target/m68k: use gdb_get_reg helpers Date: Fri, 15 Nov 2019 17:29:56 +0000 Message-Id: <20191115173000.21891-8-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::444 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, luis.machado@linaro.org, richard.henderson@linaro.org, Laurent Vivier , alan.hayward@arm.com, =?utf-8?q?A?= =?utf-8?q?lex_Benn=C3=A9e?= Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" This is cleaner than poking memory directly and will make later clean-ups easier. Signed-off-by: Alex Bennée --- target/m68k/helper.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) -- 2.20.1 Reviewed-by: Richard Henderson diff --git a/target/m68k/helper.c b/target/m68k/helper.c index ae766a6cb0b..70b0c0b5076 100644 --- a/target/m68k/helper.c +++ b/target/m68k/helper.c @@ -72,19 +72,15 @@ static int cf_fpu_gdb_get_reg(CPUM68KState *env, uint8_t *mem_buf, int n) { if (n < 8) { float_status s; - stfq_p(mem_buf, floatx80_to_float64(env->fregs[n].d, &s)); - return 8; + return gdb_get_reg64(buf, floatx80_to_float64(env->fregs[n].d, &s)); } switch (n) { case 8: /* fpcontrol */ - stl_be_p(mem_buf, env->fpcr); - return 4; + return gdb_get_reg32(buf, env->fpcr); case 9: /* fpstatus */ - stl_be_p(mem_buf, env->fpsr); - return 4; + return gdb_get_reg32(buf, env->fpsr); case 10: /* fpiar, not implemented */ - memset(mem_buf, 0, 4); - return 4; + return gdb_get_reg32(buf, 0); } return 0; } @@ -112,21 +108,18 @@ static int cf_fpu_gdb_set_reg(CPUM68KState *env, uint8_t *mem_buf, int n) static int m68k_fpu_gdb_get_reg(CPUM68KState *env, uint8_t *mem_buf, int n) { if (n < 8) { - stw_be_p(mem_buf, env->fregs[n].l.upper); - memset(mem_buf + 2, 0, 2); - stq_be_p(mem_buf + 4, env->fregs[n].l.lower); - return 12; + int len = gdb_get_reg16(buf, env->fregs[n].l.upper); + len += gdb_get_reg16(buf, 0); + len += gdb_get_reg64(buf, env->fregs[n].l.lower); + return len; } switch (n) { case 8: /* fpcontrol */ - stl_be_p(mem_buf, env->fpcr); - return 4; + return gdb_get_reg32(buf, env->fpcr); case 9: /* fpstatus */ - stl_be_p(mem_buf, env->fpsr); - return 4; + return gdb_get_reg32(buf, env->fpsr); case 10: /* fpiar, not implemented */ - memset(mem_buf, 0, 4); - return 4; + return gdb_get_reg32(buf, 0); } return 0; } From patchwork Fri Nov 15 17:29:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179520 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12766886ilf; Fri, 15 Nov 2019 09:41:50 -0800 (PST) X-Google-Smtp-Source: APXvYqzJcNAgV5QEZBn2Wyx/5DPlPGG/E3hXF0sHnHjjkji5Dp7JqiXZ1+OByH/nzyPXAR8Mov2B X-Received: by 2002:a37:a392:: with SMTP id m140mr13285215qke.383.1573839710608; Fri, 15 Nov 2019 09:41:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839710; cv=none; d=google.com; s=arc-20160816; b=vBLl1b4iE71S5N9N4Q5lIP6iBKugN/gfblpwluIkSdgjMnV3Rjp4LGmBDBh5nX3vXc 6M1fw18IEiUYrHSII7sk+Urb4A0FDmbOFiuwvWLB+13KyPKwbagVJkN3++LGGCWApsSV YEU/UvGJ7FIWRI6Udre+U+Xk0y/YlKin1+QzBb/erxy7txYcBh98av3NGe2mkt9HMRW7 ZBWRQsGo0t3YtmBYqiw69ftFMqFADnn8t3F8++mQ7aDgcexBEuKgYVq49TneUw8nJFRA tXtAhwuWuk0c2W79XBFHkKcKi9ImVrz3EydCwHd8Ib4OeJebDDpSXhFGMdPrB7XXs5gv hKGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=kxhKjy+ia6bqgrzQHP6GJX7L9b/KBvRY2FLhC4b72PQ=; b=lsEWdNt/XEBup47DdUg2KDSgRPpIOKy1ZysySaxIY0fwK+m3zb0oPeSUmuj2iROKiX /VxiEmu0ZjcSTfVeSwhjBCauo10tDnswlX+UF1ql8/7X88s1t8Kp1VUiZYv1g+ovsPU6 lKfYgVo1tSvMu0Z5WUAl1xGQ9WzLpVp9d1hzFjU22yQdcbhZWF79L7PVUH2kce8d5ZLV 0RlVbR3ZN9MT5Ug7bjwtH7+YDTPeMaAaozWyhuoEJgTHyKn6k4geALZGF0qizjyLDXpT 4hmnBU18MbLY46SMjsL4uXR8GYFIPsHFQgBpTQWP78gWADCJ5BQSF401KJBJ87Rcwiw+ MtaQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=vXWhSTnn; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id m132si6069634qke.96.2019.11.15.09.41.50 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:41:50 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=vXWhSTnn; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42914 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfbR-0005dZ-EG for patch@linaro.org; Fri, 15 Nov 2019 12:41:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35164) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQO-0007UL-A8 for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQF-00030g-Vm for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:24 -0500 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]:37707) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQF-0002xX-I2 for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:15 -0500 Received: by mail-wr1-x433.google.com with SMTP id t1so11850061wrv.4 for ; Fri, 15 Nov 2019 09:30:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kxhKjy+ia6bqgrzQHP6GJX7L9b/KBvRY2FLhC4b72PQ=; b=vXWhSTnnRGuMCrXcRY03sUlaO6A+aPOIsR63DGSLzEVAIwQSBT6C8zRToU8Rsacaij Td9lwF3bQC//x9G4VkRogjKxVY3v0U4A5a1awo283Cvds8Pr1DxnxQ9osoZ5H2jaHQyg Wbh9al1vQUFjX9qaRUtTf6TmjdYuwUKSE3AWz73S0WCg+kN/EDUOHJPGYTHmazBes6M/ gsTYnfQDgNnGANX6HusnADBteRen2OrysyaG0kfxvC850bAS/NJk5Ps2nvyF6dTDhaTv VwEmN01GI6eavv0Qu0mwhVLhIdYKbKuPl1ZZcp7UeZPqt8Ko4budDjTqZ3PIb7QK7P8g P4+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kxhKjy+ia6bqgrzQHP6GJX7L9b/KBvRY2FLhC4b72PQ=; b=FFWwm2w6pAM+h9Yeo6MUqNU5Z3wEVCmytMBiLmyEw/eBSqqwZ6RMsI6XxumAPw7pXa M64yRNbLzz8g2Ha1QzxH6wtgiukemeKKnAVWbJBOarfprgHJRtaTxQuERE66XURtAcRI VcpbyMBym8Zh5ZZU2MQ+Of0ZQkGRrv7xVilKfDoS7c6WDY1calTRViTZg191jVRh9G0d baczvgPMX3+qzUoc5nXP2itXjK642/HUlc+Oyaq+7P14lnCFN/WCH5xfZknpLDvvQ2nu dMuV4FneXs+dkey+R0ZJLDhy2UQQYaSESWZW4AgzkVmEWCiTENx4whD0Ixd9aBbA6dID 3v0w== X-Gm-Message-State: APjAAAXSxjUES5Q6P9tB5wLbMiNRVfMyMZTH9DhCKyQ5jBrRjKAFc+V8 bo9F42FwBm85RDrqxrEoho3STQ== X-Received: by 2002:adf:8543:: with SMTP id 61mr7107985wrh.171.1573839013505; Fri, 15 Nov 2019 09:30:13 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id b196sm10933935wmd.24.2019.11.15.09.30.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:06 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id BEF741FF98; Fri, 15 Nov 2019 17:30:01 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 08/11] gdbstub: extend GByteArray to read register helpers Date: Fri, 15 Nov 2019 17:29:57 +0000 Message-Id: <20191115173000.21891-9-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::433 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Cornelia Huck , luis.machado@linaro.org, Sagar Karandikar , David Hildenbrand , Mark Cave-Ayland , Max Filippov , Alistair Francis , "Edgar E. Iglesias" , Marek Vasut , alan.hayward@arm.com, "open list:PowerPC TCG CPUs" , Aleksandar Rikalo , Richard Henderson , =?utf-8?q?Philippe_Mathieu-Daud?= =?utf-8?b?w6k=?= , Artyom Tarasenko , Eduardo Habkost , richard.henderson@linaro.org, "open list:S390 TCG CPUs" , "open list:ARM TCG CPUs" , Stafford Horne , =?utf-8?q?Alex_Benn=C3=A9e?= , David Gibson , damien.hedde@greensocs.com, "open list:RISC-V TCG CPUs" , Bastian Koppelmann , Chris Wulff , Laurent Vivier , Michael Walle , Palmer Dabbelt , Aleksandar Markovic , Paolo Bonzini , Aurelien Jarno Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Instead of passing a pointer to memory now just extend the GByteArray to all the read register helpers. They can then safely append their data through the normal way. We don't bother with this abstraction for write registers as we have already ensured the buffer being copied from is the correct size. Signed-off-by: Alex Bennée --- include/exec/gdbstub.h | 39 ++++++++++++--------- include/hw/core/cpu.h | 2 +- target/alpha/cpu.h | 2 +- target/arm/cpu.h | 4 +-- target/cris/cpu.h | 4 +-- target/hppa/cpu.h | 2 +- target/i386/cpu.h | 2 +- target/lm32/cpu.h | 2 +- target/m68k/cpu.h | 2 +- target/microblaze/cpu.h | 2 +- target/mips/internal.h | 2 +- target/openrisc/cpu.h | 2 +- target/ppc/cpu.h | 4 +-- target/riscv/cpu.h | 2 +- target/s390x/internal.h | 2 +- target/sh4/cpu.h | 2 +- target/sparc/cpu.h | 2 +- target/xtensa/cpu.h | 2 +- gdbstub.c | 21 ++++++----- hw/core/cpu.c | 2 +- target/alpha/gdbstub.c | 2 +- target/arm/gdbstub.c | 2 +- target/arm/gdbstub64.c | 2 +- target/arm/helper.c | 19 +++++----- target/cris/gdbstub.c | 4 +-- target/hppa/gdbstub.c | 2 +- target/i386/gdbstub.c | 2 +- target/lm32/gdbstub.c | 2 +- target/m68k/gdbstub.c | 2 +- target/m68k/helper.c | 4 +-- target/microblaze/gdbstub.c | 2 +- target/mips/gdbstub.c | 2 +- target/nios2/cpu.c | 2 +- target/openrisc/gdbstub.c | 2 +- target/ppc/gdbstub.c | 48 +++++++++++++------------ target/ppc/translate_init.inc.c | 54 ++++++++++++++++------------- target/riscv/gdbstub.c | 18 +++++----- target/s390x/gdbstub.c | 30 ++++++++-------- target/sh4/gdbstub.c | 2 +- target/sparc/gdbstub.c | 2 +- target/xtensa/gdbstub.c | 2 +- tests/tcg/multiarch/float_helpers.c | 7 +--- 42 files changed, 161 insertions(+), 153 deletions(-) -- 2.20.1 diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h index a898a2af990..77244fdd5e3 100644 --- a/include/exec/gdbstub.h +++ b/include/exec/gdbstub.h @@ -68,45 +68,52 @@ void gdb_signalled(CPUArchState *, int); void gdbserver_fork(CPUState *); #endif /* Get or set a register. Returns the size of the register. */ -typedef int (*gdb_reg_cb)(CPUArchState *env, uint8_t *buf, int reg); +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_reg_cb get_reg, gdb_reg_cb set_reg, + gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg, int num_regs, const char *xml, int g_pos); -/* The GDB remote protocol transfers values in target byte order. This means - * we can use the raw memory access routines to access the value buffer. - * Conveniently, these also handle the case where the buffer is mis-aligned. +/* + * 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(uint8_t *mem_buf, uint8_t val) +static inline int gdb_get_reg8(GByteArray *buf, uint8_t val) { - stb_p(mem_buf, val); + g_byte_array_append(buf, &val, 1); return 1; } -static inline int gdb_get_reg16(uint8_t *mem_buf, uint16_t val) +static inline int gdb_get_reg16(GByteArray *buf, uint16_t val) { - stw_p(mem_buf, val); + uint16_t to_word = tswap16(val); + g_byte_array_append(buf, (uint8_t *) &to_word, 2); return 2; } -static inline int gdb_get_reg32(uint8_t *mem_buf, uint32_t val) +static inline int gdb_get_reg32(GByteArray *buf, uint32_t val) { - stl_p(mem_buf, val); + uint32_t to_long = tswap32(val); + g_byte_array_append(buf, (uint8_t *) &to_long, 4); return 4; } -static inline int gdb_get_reg64(uint8_t *mem_buf, uint64_t val) +static inline int gdb_get_reg64(GByteArray *buf, uint64_t val) { - stq_p(mem_buf, val); + uint64_t to_quad = tswap64(val); + g_byte_array_append(buf, (uint8_t *) &to_quad, 8); return 8; } -static inline int gdb_get_reg128(uint8_t *mem_buf, uint64_t val_hi, +static inline int gdb_get_reg128(GByteArray *buf, uint64_t val_hi, uint64_t val_lo) { - stq_p(mem_buf, val_hi); - stq_p(mem_buf + 8, val_lo); + uint64_t to_quad = tswap64(val_hi); + g_byte_array_append(buf, (uint8_t *) &to_quad, 8); + to_quad = tswap64(val_lo); + g_byte_array_append(buf, (uint8_t *) &to_quad, 8); return 16; } diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h index 77c6f052990..e85ec519add 100644 --- a/include/hw/core/cpu.h +++ b/include/hw/core/cpu.h @@ -195,7 +195,7 @@ typedef struct CPUClass { hwaddr (*get_phys_page_attrs_debug)(CPUState *cpu, vaddr addr, MemTxAttrs *attrs); int (*asidx_from_attrs)(CPUState *cpu, MemTxAttrs attrs); - int (*gdb_read_register)(CPUState *cpu, uint8_t *buf, int reg); + int (*gdb_read_register)(CPUState *cpu, GByteArray *buf, int reg); int (*gdb_write_register)(CPUState *cpu, uint8_t *buf, int reg); bool (*debug_check_watchpoint)(CPUState *cpu, CPUWatchpoint *wp); void (*debug_excp_handler)(CPUState *cpu); diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h index a530249a5bf..faa09768424 100644 --- a/target/alpha/cpu.h +++ b/target/alpha/cpu.h @@ -282,7 +282,7 @@ void alpha_cpu_do_interrupt(CPUState *cpu); bool alpha_cpu_exec_interrupt(CPUState *cpu, int int_req); void alpha_cpu_dump_state(CPUState *cs, FILE *f, int flags); hwaddr alpha_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int alpha_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int alpha_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int alpha_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void alpha_cpu_do_unaligned_access(CPUState *cpu, vaddr addr, MMUAccessType access_type, diff --git a/target/arm/cpu.h b/target/arm/cpu.h index e1a66a2d1cc..0f4541af1ee 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -952,7 +952,7 @@ bool arm_cpu_exec_interrupt(CPUState *cpu, int int_req); hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr, MemTxAttrs *attrs); -int arm_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int arm_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int arm_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); /* Dynamically generates for gdb stub an XML description of the sysregs from @@ -972,7 +972,7 @@ int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs, int cpuid, void *opaque); #ifdef TARGET_AARCH64 -int aarch64_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int aarch64_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int aarch64_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq); void aarch64_sve_change_el(CPUARMState *env, int old_el, diff --git a/target/cris/cpu.h b/target/cris/cpu.h index aba0a664744..333ee5b171a 100644 --- a/target/cris/cpu.h +++ b/target/cris/cpu.h @@ -194,8 +194,8 @@ void cris_cpu_dump_state(CPUState *cs, FILE *f, int flags); hwaddr cris_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int crisv10_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); -int cris_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int crisv10_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); +int cris_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int cris_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); /* you can call this signal handler from your SIGBUS and SIGSEGV diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h index 6713d04f111..801a4fb1bae 100644 --- a/target/hppa/cpu.h +++ b/target/hppa/cpu.h @@ -321,7 +321,7 @@ void cpu_hppa_change_prot_id(CPUHPPAState *env); int cpu_hppa_signal_handler(int host_signum, void *pinfo, void *puc); hwaddr hppa_cpu_get_phys_page_debug(CPUState *cs, vaddr addr); -int hppa_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int hppa_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int hppa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void hppa_cpu_do_interrupt(CPUState *cpu); bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req); diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 5352c9ff558..65a90d9f8bd 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1752,7 +1752,7 @@ void x86_cpu_dump_state(CPUState *cs, FILE *f, int flags); hwaddr x86_cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr, MemTxAttrs *attrs); -int x86_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int x86_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int x86_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void x86_cpu_exec_enter(CPUState *cpu); diff --git a/target/lm32/cpu.h b/target/lm32/cpu.h index 064c6b1267e..01d408eb55d 100644 --- a/target/lm32/cpu.h +++ b/target/lm32/cpu.h @@ -202,7 +202,7 @@ void lm32_cpu_do_interrupt(CPUState *cpu); bool lm32_cpu_exec_interrupt(CPUState *cs, int int_req); void lm32_cpu_dump_state(CPUState *cpu, FILE *f, int flags); hwaddr lm32_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int lm32_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int lm32_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int lm32_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); typedef enum { diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h index 20de3c379aa..cdb08c269f6 100644 --- a/target/m68k/cpu.h +++ b/target/m68k/cpu.h @@ -168,7 +168,7 @@ void m68k_cpu_do_interrupt(CPUState *cpu); bool m68k_cpu_exec_interrupt(CPUState *cpu, int int_req); void m68k_cpu_dump_state(CPUState *cpu, FILE *f, int flags); hwaddr m68k_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int m68k_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int m68k_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int m68k_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void m68k_tcg_init(void); diff --git a/target/microblaze/cpu.h b/target/microblaze/cpu.h index 95773089aa3..987e4629b0a 100644 --- a/target/microblaze/cpu.h +++ b/target/microblaze/cpu.h @@ -313,7 +313,7 @@ void mb_cpu_do_interrupt(CPUState *cs); bool mb_cpu_exec_interrupt(CPUState *cs, int int_req); void mb_cpu_dump_state(CPUState *cpu, FILE *f, int flags); hwaddr mb_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int mb_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int mb_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int mb_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void mb_tcg_init(void); diff --git a/target/mips/internal.h b/target/mips/internal.h index 3f435b5e631..c5ae86360f5 100644 --- a/target/mips/internal.h +++ b/target/mips/internal.h @@ -82,7 +82,7 @@ void mips_cpu_do_interrupt(CPUState *cpu); bool mips_cpu_exec_interrupt(CPUState *cpu, int int_req); void mips_cpu_dump_state(CPUState *cpu, FILE *f, int flags); hwaddr mips_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int mips_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int mips_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int mips_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void mips_cpu_do_unaligned_access(CPUState *cpu, vaddr addr, MMUAccessType access_type, diff --git a/target/openrisc/cpu.h b/target/openrisc/cpu.h index 0ad02eab794..d9484b802f3 100644 --- a/target/openrisc/cpu.h +++ b/target/openrisc/cpu.h @@ -320,7 +320,7 @@ void openrisc_cpu_do_interrupt(CPUState *cpu); bool openrisc_cpu_exec_interrupt(CPUState *cpu, int int_req); void openrisc_cpu_dump_state(CPUState *cpu, FILE *f, int flags); hwaddr openrisc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int openrisc_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int openrisc_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int openrisc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void openrisc_translate_init(void); bool openrisc_cpu_tlb_fill(CPUState *cs, vaddr address, int size, diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index e3e82327b72..ed3f55ea4b4 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1258,8 +1258,8 @@ bool ppc_cpu_exec_interrupt(CPUState *cpu, int int_req); void ppc_cpu_dump_state(CPUState *cpu, FILE *f, int flags); void ppc_cpu_dump_statistics(CPUState *cpu, int flags); hwaddr ppc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int ppc_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); -int ppc_cpu_gdb_read_register_apple(CPUState *cpu, uint8_t *buf, int reg); +int ppc_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); +int ppc_cpu_gdb_read_register_apple(CPUState *cpu, GByteArray *buf, int reg); int ppc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); int ppc_cpu_gdb_write_register_apple(CPUState *cpu, uint8_t *buf, int reg); #ifndef CONFIG_USER_ONLY diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index e59343e13c0..fe0b8861021 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -243,7 +243,7 @@ extern const char * const riscv_excp_names[]; extern const char * const riscv_intr_names[]; void riscv_cpu_do_interrupt(CPUState *cpu); -int riscv_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int riscv_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int riscv_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); bool riscv_cpu_exec_interrupt(CPUState *cs, int interrupt_request); bool riscv_cpu_fp_enabled(CPURISCVState *env); diff --git a/target/s390x/internal.h b/target/s390x/internal.h index d37816104dd..8c95c734dbe 100644 --- a/target/s390x/internal.h +++ b/target/s390x/internal.h @@ -292,7 +292,7 @@ uint16_t float128_dcmask(CPUS390XState *env, float128 f1); /* gdbstub.c */ -int s390_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int s390_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int s390_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void s390_cpu_gdb_init(CPUState *cs); diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h index ecaa7a18a94..d7a1bffd600 100644 --- a/target/sh4/cpu.h +++ b/target/sh4/cpu.h @@ -208,7 +208,7 @@ void superh_cpu_do_interrupt(CPUState *cpu); bool superh_cpu_exec_interrupt(CPUState *cpu, int int_req); void superh_cpu_dump_state(CPUState *cpu, FILE *f, int flags); hwaddr superh_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int superh_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int superh_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int superh_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void superh_cpu_do_unaligned_access(CPUState *cpu, vaddr addr, MMUAccessType access_type, diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h index ae97c7d9f79..b9369398f24 100644 --- a/target/sparc/cpu.h +++ b/target/sparc/cpu.h @@ -571,7 +571,7 @@ extern const VMStateDescription vmstate_sparc_cpu; void sparc_cpu_do_interrupt(CPUState *cpu); void sparc_cpu_dump_state(CPUState *cpu, FILE *f, int flags); hwaddr sparc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); -int sparc_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int sparc_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int sparc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void QEMU_NORETURN sparc_cpu_do_unaligned_access(CPUState *cpu, vaddr addr, MMUAccessType access_type, diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h index b363ffcf106..b20be1f5814 100644 --- a/target/xtensa/cpu.h +++ b/target/xtensa/cpu.h @@ -569,7 +569,7 @@ void xtensa_cpu_dump_state(CPUState *cpu, FILE *f, int flags); hwaddr xtensa_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); void xtensa_count_regs(const XtensaConfig *config, unsigned *n_regs, unsigned *n_core_regs); -int xtensa_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int xtensa_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int xtensa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void xtensa_cpu_do_unaligned_access(CPUState *cpu, vaddr addr, MMUAccessType access_type, diff --git a/gdbstub.c b/gdbstub.c index 4c3e211890f..42c9b26932a 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -319,8 +319,8 @@ static int gdb_signal_to_target (int sig) typedef struct GDBRegisterState { int base_reg; int num_regs; - gdb_reg_cb get_reg; - gdb_reg_cb set_reg; + gdb_get_reg_cb get_reg; + gdb_set_reg_cb set_reg; const char *xml; struct GDBRegisterState *next; } GDBRegisterState; @@ -889,19 +889,19 @@ static const char *get_feature_xml(const GDBState *s, const char *p, return name ? xml_builtin[i][1] : NULL; } -static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg) +static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg) { CPUClass *cc = CPU_GET_CLASS(cpu); CPUArchState *env = cpu->env_ptr; GDBRegisterState *r; if (reg < cc->gdb_num_core_regs) { - return cc->gdb_read_register(cpu, mem_buf, reg); + return cc->gdb_read_register(cpu, buf, reg); } for (r = cpu->gdb_regs; r; r = r->next) { if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) { - return r->get_reg(env, mem_buf, reg - r->base_reg); + return r->get_reg(env, buf, reg - r->base_reg); } } return 0; @@ -932,7 +932,7 @@ static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg) */ void gdb_register_coprocessor(CPUState *cpu, - gdb_reg_cb get_reg, gdb_reg_cb set_reg, + gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg, int num_regs, const char *xml, int g_pos) { GDBRegisterState *s; @@ -1734,7 +1734,7 @@ static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx) return; } - reg_size = gdb_read_register(s->g_cpu, s->mem_buf->data, + reg_size = gdb_read_register(s->g_cpu, s->mem_buf, gdb_ctx->params[0].val_ull); if (!reg_size) { put_packet(s, "E14"); @@ -1832,13 +1832,12 @@ static void handle_read_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx) target_ulong addr, len; cpu_synchronize_state(s->g_cpu); + g_byte_array_set_size(s->mem_buf, 0); len = 0; for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) { - len += gdb_read_register(s->g_cpu, s->mem_buf->data + len, - addr); + len += gdb_read_register(s->g_cpu, s->mem_buf, addr); } - /* FIXME: This is after the fact sizing */ - g_byte_array_set_size(s->mem_buf, len); + g_assert(len == s->mem_buf->len); memtohex(s->str_buf, s->mem_buf->data, len); put_packet(s, s->str_buf->str); diff --git a/hw/core/cpu.c b/hw/core/cpu.c index db1a03c6bbb..9cd1a2a54fb 100644 --- a/hw/core/cpu.c +++ b/hw/core/cpu.c @@ -177,7 +177,7 @@ static int cpu_common_write_elf64_note(WriteCoreDumpFunction f, } -static int cpu_common_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg) +static int cpu_common_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg) { return 0; } diff --git a/target/alpha/gdbstub.c b/target/alpha/gdbstub.c index 7f9cc092a9c..0cd76ddaa9e 100644 --- a/target/alpha/gdbstub.c +++ b/target/alpha/gdbstub.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "exec/gdbstub.h" -int alpha_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int alpha_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { AlphaCPU *cpu = ALPHA_CPU(cs); CPUAlphaState *env = &cpu->env; diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c index 1239abd9842..4557775d245 100644 --- a/target/arm/gdbstub.c +++ b/target/arm/gdbstub.c @@ -32,7 +32,7 @@ typedef struct RegisterSysregXmlParam { We hack round this by giving the FPA regs zero size when talking to a newer gdb. */ -int arm_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int arm_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { ARMCPU *cpu = ARM_CPU(cs); CPUARMState *env = &cpu->env; diff --git a/target/arm/gdbstub64.c b/target/arm/gdbstub64.c index 665ebb3ef64..35d0b80c2de 100644 --- a/target/arm/gdbstub64.c +++ b/target/arm/gdbstub64.c @@ -20,7 +20,7 @@ #include "cpu.h" #include "exec/gdbstub.h" -int aarch64_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int aarch64_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { ARMCPU *cpu = ARM_CPU(cs); CPUARMState *env = &cpu->env; diff --git a/target/arm/helper.c b/target/arm/helper.c index bd821931b3d..2a2ac89951c 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -47,30 +47,27 @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address, static void switch_mode(CPUARMState *env, int mode); -static int vfp_gdb_get_reg(CPUARMState *env, uint8_t *buf, int reg) +static int vfp_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg) { int nregs; /* VFP data registers are always little-endian. */ nregs = arm_feature(env, ARM_FEATURE_VFP3) ? 32 : 16; if (reg < nregs) { - stq_le_p(buf, *aa32_vfp_dreg(env, reg)); - return 8; + return gdb_get_reg64(buf, *aa32_vfp_dreg(env, reg)); } if (arm_feature(env, ARM_FEATURE_NEON)) { /* Aliases for Q regs. */ nregs += 16; if (reg < nregs) { uint64_t *q = aa32_vfp_qreg(env, reg - 32); - stq_le_p(buf, q[0]); - stq_le_p(buf + 8, q[1]); - return 16; + return gdb_get_reg128(buf, q[0], q[1]); } } switch (reg - nregs) { - case 0: stl_p(buf, env->vfp.xregs[ARM_VFP_FPSID]); return 4; - case 1: stl_p(buf, vfp_get_fpscr(env)); return 4; - case 2: stl_p(buf, env->vfp.xregs[ARM_VFP_FPEXC]); return 4; + case 0: return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPSID]); break; + case 1: return gdb_get_reg32(buf, vfp_get_fpscr(env)); break; + case 2: return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPEXC]); break; } return 0; } @@ -101,7 +98,7 @@ static int vfp_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg) return 0; } -static int aarch64_fpu_gdb_get_reg(CPUARMState *env, uint8_t *buf, int reg) +static int aarch64_fpu_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg) { switch (reg) { case 0 ... 31: @@ -204,7 +201,7 @@ static void write_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri, } } -static int arm_gdb_get_sysreg(CPUARMState *env, uint8_t *buf, int reg) +static int arm_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg) { ARMCPU *cpu = env_archcpu(env); const ARMCPRegInfo *ri; diff --git a/target/cris/gdbstub.c b/target/cris/gdbstub.c index a3d76d2e8c2..b01b2aa0811 100644 --- a/target/cris/gdbstub.c +++ b/target/cris/gdbstub.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "exec/gdbstub.h" -int crisv10_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int crisv10_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { CRISCPU *cpu = CRIS_CPU(cs); CPUCRISState *env = &cpu->env; @@ -53,7 +53,7 @@ int crisv10_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) return 0; } -int cris_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int cris_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { CRISCPU *cpu = CRIS_CPU(cs); CPUCRISState *env = &cpu->env; diff --git a/target/hppa/gdbstub.c b/target/hppa/gdbstub.c index 341888a9da0..a6428a2893f 100644 --- a/target/hppa/gdbstub.c +++ b/target/hppa/gdbstub.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "exec/gdbstub.h" -int hppa_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int hppa_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { HPPACPU *cpu = HPPA_CPU(cs); CPUHPPAState *env = &cpu->env; diff --git a/target/i386/gdbstub.c b/target/i386/gdbstub.c index aef25b70f10..38324498f33 100644 --- a/target/i386/gdbstub.c +++ b/target/i386/gdbstub.c @@ -79,7 +79,7 @@ static const int gpr_map32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; #endif -int x86_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int x86_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { X86CPU *cpu = X86_CPU(cs); CPUX86State *env = &cpu->env; diff --git a/target/lm32/gdbstub.c b/target/lm32/gdbstub.c index 82ede436e12..b6fe12e1d61 100644 --- a/target/lm32/gdbstub.c +++ b/target/lm32/gdbstub.c @@ -22,7 +22,7 @@ #include "exec/gdbstub.h" #include "hw/lm32/lm32_pic.h" -int lm32_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int lm32_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { LM32CPU *cpu = LM32_CPU(cs); CPULM32State *env = &cpu->env; diff --git a/target/m68k/gdbstub.c b/target/m68k/gdbstub.c index fdc96f57fff..eb2d030e148 100644 --- a/target/m68k/gdbstub.c +++ b/target/m68k/gdbstub.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "exec/gdbstub.h" -int m68k_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int m68k_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { M68kCPU *cpu = M68K_CPU(cs); CPUM68KState *env = &cpu->env; diff --git a/target/m68k/helper.c b/target/m68k/helper.c index 70b0c0b5076..a11863a8545 100644 --- a/target/m68k/helper.c +++ b/target/m68k/helper.c @@ -68,7 +68,7 @@ void m68k_cpu_list(void) g_slist_free(list); } -static int cf_fpu_gdb_get_reg(CPUM68KState *env, uint8_t *mem_buf, int n) +static int cf_fpu_gdb_get_reg(CPUM68KState *env, GByteArray *buf, int n) { if (n < 8) { float_status s; @@ -105,7 +105,7 @@ static int cf_fpu_gdb_set_reg(CPUM68KState *env, uint8_t *mem_buf, int n) return 0; } -static int m68k_fpu_gdb_get_reg(CPUM68KState *env, uint8_t *mem_buf, int n) +static int m68k_fpu_gdb_get_reg(CPUM68KState *env, GByteArray *buf, int n) { if (n < 8) { int len = gdb_get_reg16(buf, env->fregs[n].l.upper); diff --git a/target/microblaze/gdbstub.c b/target/microblaze/gdbstub.c index 30677b6d1f4..f41ebf1f33b 100644 --- a/target/microblaze/gdbstub.c +++ b/target/microblaze/gdbstub.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "exec/gdbstub.h" -int mb_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int mb_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); CPUMBState *env = &cpu->env; diff --git a/target/mips/gdbstub.c b/target/mips/gdbstub.c index bbb25449391..98f56e660d2 100644 --- a/target/mips/gdbstub.c +++ b/target/mips/gdbstub.c @@ -22,7 +22,7 @@ #include "internal.h" #include "exec/gdbstub.h" -int mips_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int mips_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { MIPSCPU *cpu = MIPS_CPU(cs); CPUMIPSState *env = &cpu->env; diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c index ca9c7a6df5d..17d868421ed 100644 --- a/target/nios2/cpu.c +++ b/target/nios2/cpu.c @@ -124,7 +124,7 @@ static void nios2_cpu_disas_set_info(CPUState *cpu, disassemble_info *info) #endif } -static int nios2_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +static int nios2_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { Nios2CPU *cpu = NIOS2_CPU(cs); CPUClass *cc = CPU_GET_CLASS(cs); diff --git a/target/openrisc/gdbstub.c b/target/openrisc/gdbstub.c index 0fcdb79668c..095bf76c12c 100644 --- a/target/openrisc/gdbstub.c +++ b/target/openrisc/gdbstub.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "exec/gdbstub.h" -int openrisc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int openrisc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { OpenRISCCPU *cpu = OPENRISC_CPU(cs); CPUOpenRISCState *env = &cpu->env; diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c index 823759c92e7..6f08021cc22 100644 --- a/target/ppc/gdbstub.c +++ b/target/ppc/gdbstub.c @@ -114,10 +114,11 @@ void ppc_maybe_bswap_register(CPUPPCState *env, uint8_t *mem_buf, int len) * the FP regs zero size when talking to a newer gdb. */ -int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int ppc_cpu_gdb_read_register(CPUState *cs, GByteArray *buf, int n) { PowerPCCPU *cpu = POWERPC_CPU(cs); CPUPPCState *env = &cpu->env; + uint8_t *mem_buf; int r = ppc_gdb_register_len(n); if (!r) { @@ -126,17 +127,17 @@ int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) if (n < 32) { /* gprs */ - gdb_get_regl(mem_buf, env->gpr[n]); + gdb_get_regl(buf, env->gpr[n]); } else if (n < 64) { /* fprs */ - stfq_p(mem_buf, *cpu_fpr_ptr(env, n - 32)); + gdb_get_reg64(buf, *cpu_fpr_ptr(env, n - 32)); } else { switch (n) { case 64: - gdb_get_regl(mem_buf, env->nip); + gdb_get_regl(buf, env->nip); break; case 65: - gdb_get_regl(mem_buf, env->msr); + gdb_get_regl(buf, env->msr); break; case 66: { @@ -145,31 +146,33 @@ int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) for (i = 0; i < 8; i++) { cr |= env->crf[i] << (32 - ((i + 1) * 4)); } - gdb_get_reg32(mem_buf, cr); + gdb_get_reg32(buf, cr); break; } case 67: - gdb_get_regl(mem_buf, env->lr); + gdb_get_regl(buf, env->lr); break; case 68: - gdb_get_regl(mem_buf, env->ctr); + gdb_get_regl(buf, env->ctr); break; case 69: - gdb_get_reg32(mem_buf, env->xer); + gdb_get_reg32(buf, env->xer); break; case 70: - gdb_get_reg32(mem_buf, env->fpscr); + gdb_get_reg32(buf, env->fpscr); break; } } + mem_buf = buf->data - r; ppc_maybe_bswap_register(env, mem_buf, r); return r; } -int ppc_cpu_gdb_read_register_apple(CPUState *cs, uint8_t *mem_buf, int n) +int ppc_cpu_gdb_read_register_apple(CPUState *cs, GByteArray *buf, int n) { PowerPCCPU *cpu = POWERPC_CPU(cs); CPUPPCState *env = &cpu->env; + uint8_t *mem_buf; int r = ppc_gdb_register_len_apple(n); if (!r) { @@ -178,21 +181,21 @@ int ppc_cpu_gdb_read_register_apple(CPUState *cs, uint8_t *mem_buf, int n) if (n < 32) { /* gprs */ - gdb_get_reg64(mem_buf, env->gpr[n]); + gdb_get_reg64(buf, env->gpr[n]); } else if (n < 64) { /* fprs */ - stfq_p(mem_buf, *cpu_fpr_ptr(env, n - 32)); + gdb_get_reg64(buf, *cpu_fpr_ptr(env, n - 32)); } else if (n < 96) { /* Altivec */ - stq_p(mem_buf, n - 64); - stq_p(mem_buf + 8, 0); + gdb_get_reg64(buf, n - 64); + gdb_get_reg64(buf, 0); } else { switch (n) { case 64 + 32: - gdb_get_reg64(mem_buf, env->nip); + gdb_get_reg64(buf, env->nip); break; case 65 + 32: - gdb_get_reg64(mem_buf, env->msr); + gdb_get_reg64(buf, env->msr); break; case 66 + 32: { @@ -201,23 +204,24 @@ int ppc_cpu_gdb_read_register_apple(CPUState *cs, uint8_t *mem_buf, int n) for (i = 0; i < 8; i++) { cr |= env->crf[i] << (32 - ((i + 1) * 4)); } - gdb_get_reg32(mem_buf, cr); + gdb_get_reg32(buf, cr); break; } case 67 + 32: - gdb_get_reg64(mem_buf, env->lr); + gdb_get_reg64(buf, env->lr); break; case 68 + 32: - gdb_get_reg64(mem_buf, env->ctr); + gdb_get_reg64(buf, env->ctr); break; case 69 + 32: - gdb_get_reg32(mem_buf, env->xer); + gdb_get_reg32(buf, env->xer); break; case 70 + 32: - gdb_get_reg64(mem_buf, env->fpscr); + gdb_get_reg64(buf, env->fpscr); break; } } + mem_buf = buf->data - r; ppc_maybe_bswap_register(env, mem_buf, r); return r; } diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c index ba726dec4d0..154f876e44c 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -9587,7 +9587,7 @@ static int gdb_find_spr_idx(CPUPPCState *env, int n) return -1; } -static int gdb_get_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n) +static int gdb_get_spr_reg(CPUPPCState *env, GByteArray *buf, int n) { int reg; int len; @@ -9598,8 +9598,8 @@ static int gdb_get_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n) } len = TARGET_LONG_SIZE; - stn_p(mem_buf, len, env->spr[reg]); - ppc_maybe_bswap_register(env, mem_buf, len); + gdb_get_regl(buf, env->spr[reg]); + ppc_maybe_bswap_register(env, buf->data - len, len); return len; } @@ -9621,15 +9621,18 @@ static int gdb_set_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n) } #endif -static int gdb_get_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n) +static int gdb_get_float_reg(CPUPPCState *env, GByteArray *buf, int n) { + uint8_t *mem_buf; if (n < 32) { - stfq_p(mem_buf, *cpu_fpr_ptr(env, n)); + gdb_get_reg64(buf, *cpu_fpr_ptr(env, n)); + mem_buf = buf->data - 8; ppc_maybe_bswap_register(env, mem_buf, 8); return 8; } if (n == 32) { - stl_p(mem_buf, env->fpscr); + gdb_get_reg32(buf, env->fpscr); + mem_buf = buf->data - 4; ppc_maybe_bswap_register(env, mem_buf, 4); return 4; } @@ -9651,28 +9654,31 @@ static int gdb_set_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n) return 0; } -static int gdb_get_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n) +static int gdb_get_avr_reg(CPUPPCState *env, GByteArray *buf, int n) { + uint8_t *mem_buf; + if (n < 32) { ppc_avr_t *avr = cpu_avr_ptr(env, n); if (!avr_need_swap(env)) { - stq_p(mem_buf, avr->u64[0]); - stq_p(mem_buf + 8, avr->u64[1]); + gdb_get_reg128(buf, avr->u64[0] , avr->u64[1]); } else { - stq_p(mem_buf, avr->u64[1]); - stq_p(mem_buf + 8, avr->u64[0]); + gdb_get_reg128(buf, avr->u64[1] , avr->u64[0]); } + mem_buf = buf->data - 16; ppc_maybe_bswap_register(env, mem_buf, 8); ppc_maybe_bswap_register(env, mem_buf + 8, 8); return 16; } if (n == 32) { - stl_p(mem_buf, helper_mfvscr(env)); + gdb_get_reg32(buf, helper_mfvscr(env)); + mem_buf = buf->data - 4; ppc_maybe_bswap_register(env, mem_buf, 4); return 4; } if (n == 33) { - stl_p(mem_buf, (uint32_t)env->spr[SPR_VRSAVE]); + gdb_get_reg32(buf, (uint32_t)env->spr[SPR_VRSAVE]); + mem_buf = buf->data - 4; ppc_maybe_bswap_register(env, mem_buf, 4); return 4; } @@ -9707,25 +9713,25 @@ static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n) return 0; } -static int gdb_get_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n) +static int gdb_get_spe_reg(CPUPPCState *env, GByteArray *buf, int n) { if (n < 32) { #if defined(TARGET_PPC64) - stl_p(mem_buf, env->gpr[n] >> 32); - ppc_maybe_bswap_register(env, mem_buf, 4); + gdb_get_reg32(buf, env->gpr[n] >> 32); + ppc_maybe_bswap_register(env, buf->data - 4, 4); #else - stl_p(mem_buf, env->gprh[n]); + gdb_get_reg32(buf, env->gprh[n]); #endif return 4; } if (n == 32) { - stq_p(mem_buf, env->spe_acc); - ppc_maybe_bswap_register(env, mem_buf, 8); + gdb_get_reg64(buf, env->spe_acc); + ppc_maybe_bswap_register(env, buf->data - 8, 8); return 8; } if (n == 33) { - stl_p(mem_buf, env->spe_fscr); - ppc_maybe_bswap_register(env, mem_buf, 4); + gdb_get_reg32(buf, env->spe_fscr); + ppc_maybe_bswap_register(env, buf->data - 4, 4); return 4; } return 0; @@ -9760,11 +9766,11 @@ static int gdb_set_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n) return 0; } -static int gdb_get_vsx_reg(CPUPPCState *env, uint8_t *mem_buf, int n) +static int gdb_get_vsx_reg(CPUPPCState *env, GByteArray *buf, int n) { if (n < 32) { - stq_p(mem_buf, *cpu_vsrl_ptr(env, n)); - ppc_maybe_bswap_register(env, mem_buf, 8); + gdb_get_reg64(buf, *cpu_vsrl_ptr(env, n)); + ppc_maybe_bswap_register(env, buf->data - 8, 8); return 8; } return 0; diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c index 1a7947e0198..05442215a4b 100644 --- a/target/riscv/gdbstub.c +++ b/target/riscv/gdbstub.c @@ -269,7 +269,7 @@ static int csr_register_map[] = { CSR_MHCOUNTEREN, }; -int riscv_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { RISCVCPU *cpu = RISCV_CPU(cs); CPURISCVState *env = &cpu->env; @@ -300,10 +300,10 @@ int riscv_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) return 0; } -static int riscv_gdb_get_fpu(CPURISCVState *env, uint8_t *mem_buf, int n) +static int riscv_gdb_get_fpu(CPURISCVState *env, GByteArray *buf, int n) { if (n < 32) { - return gdb_get_reg64(mem_buf, env->fpr[n]); + return gdb_get_reg64(buf, env->fpr[n]); /* there is hole between ft11 and fflags in fpu.xml */ } else if (n < 36 && n > 32) { target_ulong val = 0; @@ -316,7 +316,7 @@ static int riscv_gdb_get_fpu(CPURISCVState *env, uint8_t *mem_buf, int n) result = riscv_csrrw_debug(env, n - 33 + csr_register_map[8], &val, 0, 0); if (result == 0) { - return gdb_get_regl(mem_buf, val); + return gdb_get_regl(buf, val); } } return 0; @@ -345,7 +345,7 @@ static int riscv_gdb_set_fpu(CPURISCVState *env, uint8_t *mem_buf, int n) return 0; } -static int riscv_gdb_get_csr(CPURISCVState *env, uint8_t *mem_buf, int n) +static int riscv_gdb_get_csr(CPURISCVState *env, GByteArray *buf, int n) { if (n < ARRAY_SIZE(csr_register_map)) { target_ulong val = 0; @@ -353,7 +353,7 @@ static int riscv_gdb_get_csr(CPURISCVState *env, uint8_t *mem_buf, int n) result = riscv_csrrw_debug(env, csr_register_map[n], &val, 0, 0); if (result == 0) { - return gdb_get_regl(mem_buf, val); + return gdb_get_regl(buf, val); } } return 0; @@ -373,13 +373,13 @@ static int riscv_gdb_set_csr(CPURISCVState *env, uint8_t *mem_buf, int n) return 0; } -static int riscv_gdb_get_virtual(CPURISCVState *cs, uint8_t *mem_buf, int n) +static int riscv_gdb_get_virtual(CPURISCVState *cs, GByteArray *buf, int n) { if (n == 0) { #ifdef CONFIG_USER_ONLY - return gdb_get_regl(mem_buf, 0); + return gdb_get_regl(buf, 0); #else - return gdb_get_regl(mem_buf, cs->priv); + return gdb_get_regl(buf, cs->priv); #endif } return 0; diff --git a/target/s390x/gdbstub.c b/target/s390x/gdbstub.c index e24a49f4a91..d6fce5ff1e1 100644 --- a/target/s390x/gdbstub.c +++ b/target/s390x/gdbstub.c @@ -27,7 +27,7 @@ #include "sysemu/hw_accel.h" #include "sysemu/tcg.h" -int s390_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int s390_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { S390CPU *cpu = S390_CPU(cs); CPUS390XState *env = &cpu->env; @@ -82,11 +82,11 @@ int s390_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) /* total number of registers in s390-acr.xml */ #define S390_NUM_AC_REGS 16 -static int cpu_read_ac_reg(CPUS390XState *env, uint8_t *mem_buf, int n) +static int cpu_read_ac_reg(CPUS390XState *env, GByteArray *buf, int n) { switch (n) { case S390_A0_REGNUM ... S390_A15_REGNUM: - return gdb_get_reg32(mem_buf, env->aregs[n]); + return gdb_get_reg32(buf, env->aregs[n]); default: return 0; } @@ -111,13 +111,13 @@ static int cpu_write_ac_reg(CPUS390XState *env, uint8_t *mem_buf, int n) /* total number of registers in s390-fpr.xml */ #define S390_NUM_FP_REGS 17 -static int cpu_read_fp_reg(CPUS390XState *env, uint8_t *mem_buf, int n) +static int cpu_read_fp_reg(CPUS390XState *env, GByteArray *buf, int n) { switch (n) { case S390_FPC_REGNUM: - return gdb_get_reg32(mem_buf, env->fpc); + return gdb_get_reg32(buf, env->fpc); case S390_F0_REGNUM ... S390_F15_REGNUM: - return gdb_get_reg64(mem_buf, *get_freg(env, n - S390_F0_REGNUM)); + return gdb_get_reg64(buf, *get_freg(env, n - S390_F0_REGNUM)); default: return 0; } @@ -145,17 +145,17 @@ static int cpu_write_fp_reg(CPUS390XState *env, uint8_t *mem_buf, int n) /* total number of registers in s390-vx.xml */ #define S390_NUM_VREGS 32 -static int cpu_read_vreg(CPUS390XState *env, uint8_t *mem_buf, int n) +static int cpu_read_vreg(CPUS390XState *env, GByteArray *buf, int n) { int ret; switch (n) { case S390_V0L_REGNUM ... S390_V15L_REGNUM: - ret = gdb_get_reg64(mem_buf, env->vregs[n][1]); + ret = gdb_get_reg64(buf, env->vregs[n][1]); break; case S390_V16_REGNUM ... S390_V31_REGNUM: - ret = gdb_get_reg64(mem_buf, env->vregs[n][0]); - ret += gdb_get_reg64(mem_buf + 8, env->vregs[n][1]); + ret = gdb_get_reg64(buf, env->vregs[n][0]); + ret += gdb_get_reg64(buf, env->vregs[n][1]); break; default: ret = 0; @@ -186,11 +186,11 @@ static int cpu_write_vreg(CPUS390XState *env, uint8_t *mem_buf, int n) #define S390_NUM_C_REGS 16 #ifndef CONFIG_USER_ONLY -static int cpu_read_c_reg(CPUS390XState *env, uint8_t *mem_buf, int n) +static int cpu_read_c_reg(CPUS390XState *env, GByteArray *buf, int n) { switch (n) { case S390_C0_REGNUM ... S390_C15_REGNUM: - return gdb_get_regl(mem_buf, env->cregs[n]); + return gdb_get_regl(buf, env->cregs[n]); default: return 0; } @@ -223,7 +223,7 @@ static int cpu_write_c_reg(CPUS390XState *env, uint8_t *mem_buf, int n) /* total number of registers in s390-virt.xml */ #define S390_NUM_VIRT_REGS 8 -static int cpu_read_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n) +static int cpu_read_virt_reg(CPUS390XState *env, GByteArray *mem_buf, int n) { switch (n) { case S390_VIRT_CKC_REGNUM: @@ -296,9 +296,9 @@ static int cpu_write_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n) /* total number of registers in s390-gs.xml */ #define S390_NUM_GS_REGS 4 -static int cpu_read_gs_reg(CPUS390XState *env, uint8_t *mem_buf, int n) +static int cpu_read_gs_reg(CPUS390XState *env, GByteArray *buf, int n) { - return gdb_get_regl(mem_buf, env->gscb[n]); + return gdb_get_regl(buf, env->gscb[n]); } static int cpu_write_gs_reg(CPUS390XState *env, uint8_t *mem_buf, int n) diff --git a/target/sh4/gdbstub.c b/target/sh4/gdbstub.c index 44c1679e9db..49fc4a0cc69 100644 --- a/target/sh4/gdbstub.c +++ b/target/sh4/gdbstub.c @@ -24,7 +24,7 @@ /* Hint: Use "set architecture sh4" in GDB to see fpu registers */ /* FIXME: We should use XML for this. */ -int superh_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int superh_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { SuperHCPU *cpu = SUPERH_CPU(cs); CPUSH4State *env = &cpu->env; diff --git a/target/sparc/gdbstub.c b/target/sparc/gdbstub.c index 8be742b5a3d..78dc8dcc980 100644 --- a/target/sparc/gdbstub.c +++ b/target/sparc/gdbstub.c @@ -27,7 +27,7 @@ #define gdb_get_rega(buf, val) gdb_get_regl(buf, val) #endif -int sparc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int sparc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { SPARCCPU *cpu = SPARC_CPU(cs); CPUSPARCState *env = &cpu->env; diff --git a/target/xtensa/gdbstub.c b/target/xtensa/gdbstub.c index 54727881f38..0ee3feabe54 100644 --- a/target/xtensa/gdbstub.c +++ b/target/xtensa/gdbstub.c @@ -63,7 +63,7 @@ void xtensa_count_regs(const XtensaConfig *config, } } -int xtensa_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) +int xtensa_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { XtensaCPU *cpu = XTENSA_CPU(cs); CPUXtensaState *env = &cpu->env; diff --git a/tests/tcg/multiarch/float_helpers.c b/tests/tcg/multiarch/float_helpers.c index 8ee7903c785..57b7acbb77d 100644 --- a/tests/tcg/multiarch/float_helpers.c +++ b/tests/tcg/multiarch/float_helpers.c @@ -78,12 +78,7 @@ char *fmt_16(uint16_t num) */ #ifndef SNANF -/* Signaling NaN macros, if supported. */ -# if __GNUC_PREREQ(3, 3) -# define SNANF (__builtin_nansf ("")) -# define SNAN (__builtin_nans ("")) -# define SNANL (__builtin_nansl ("")) -# endif +#error no SNANF - what happened? #endif static float f32_numbers[] = { From patchwork Fri Nov 15 17:29:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179515 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12761647ilf; Fri, 15 Nov 2019 09:37:19 -0800 (PST) X-Google-Smtp-Source: APXvYqyZBsrjSjWD+djQMcpkC36ns4p6BABDVRCTLZKVCXIR1LVRfCy/7YARDMO6Ghd0rPEyI7Mj X-Received: by 2002:ac8:758e:: with SMTP id s14mr15036793qtq.288.1573839439470; Fri, 15 Nov 2019 09:37:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839439; cv=none; d=google.com; s=arc-20160816; b=PRwRNq8ABeL4aeQ8qkUwsycllcEaS63wRvbizbnKWB4VD1o/c0nrCr4/FYunfST788 fFmm64+v3SRXjh+EV4OqdsueQoj30ydIs2i3xNQby2Bt8PpA2UB3J6G/EJxXpP6hTluV 1zxmUH5fqctoxJWLiMYGGP0Pr73Yvgz3gTwTvc3Rj/R8A53AoACHgFDLSw2MpREigoy2 fojsixINseGkBT4C07gzJASJvt3ZXRGJEwiNlg0+sHKXlrD2jviaIV+o17AknEbVTUaH kytE1+kyjXUQy7RTvjKRjsIcZXd8IVFQrvwMZW1WPSUO7GZvHOpfIS1Fct/r0e14en9u wvtQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=oZtAc1yXQIhyrWZiFMsHbDwOJI2w9ArxU1OJA7FmK0k=; b=HsAkoLQm39nOynUbrdq6yoHX/JyQWhxJQES81ZQkbfZQepaXzcPPKiSW151oiBbMGV YJE3EpYMG1CJvKZIj5csybV62YRGBuf+QhI56C79IDHfOogxDV7dNg5S95WmTJyIZ14S e4z43pTexot2hM3w1nJoV5uN4oqMEv8p6ZGiy8RTC5A5RFM3VmU3bKQsr8ABdpAWYUWc kKqVIidfTcuzT+0FEWnoR+XBK6d5kGty4CQtpgZuiUQCk8V/6ZXLlSz0/h7FrqSXGQSJ 1XuarC3sNTG1o60CTyDa1Slgr1aT+CARYG1OkcNBzcPoEE3wdVvhA9FTcKLyuW1xKbPs UvyQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=lSb2G55R; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id 8si5767085qvb.8.2019.11.15.09.37.19 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:37:19 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=lSb2G55R; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42846 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfX4-0002mG-9n for patch@linaro.org; Fri, 15 Nov 2019 12:37:18 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34996) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQJ-0007O5-El for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQH-00032d-AW for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:19 -0500 Received: from mail-wr1-x441.google.com ([2a00:1450:4864:20::441]:36697) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQH-0002yO-31 for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:17 -0500 Received: by mail-wr1-x441.google.com with SMTP id r10so11851935wrx.3 for ; Fri, 15 Nov 2019 09:30:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oZtAc1yXQIhyrWZiFMsHbDwOJI2w9ArxU1OJA7FmK0k=; b=lSb2G55RoHFSOG/ZkSGRnl4U0yKX9CvSc+MSbFgc+Z30bZIGzbCcTkj1195tNa7vu9 WuDGzoXxGSFJzpMu9sqB1a/cYsItlb3vU6gQqrk02fZI0G8IPFPLjB9l7hys+3QdMrHq O/aCwHblI8x0MIdDTuKAaw83jEBcU9ybWyQHkmWgOX/JazO9UwShkFSy5pXjz8+UQHiS FQrwXeXdWks1lHK2FM4stZzqNpMuy2EBxy0DSANbKF2loPWqSyMCgaY8wI33kH8ykVyC Sey1Qb8Q+4TFGfWJjX/zS27MYHRHcKNfPp1M87uWeficEHIvVLPNeyY5GvoVp48BtSDy H0GA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=oZtAc1yXQIhyrWZiFMsHbDwOJI2w9ArxU1OJA7FmK0k=; b=XorlDQkFAvsK5dMK7lwcV6BTPuBLGGOoAVdj/TlBXohfwzw+sDZcpRhbn/Bl3htluk APWRUkfyV+T9VDe7L0yTNGlI/yFM2Sao53SyFYwknP47RUT7Np+LALAideeuWudq8x4U Mn5XwH31isPsnr4mC5sfReokbgBuDfoaKErfZnQDGc7fntz7NviRkxVtOUBylc0SZ0Dd Pjtxg+pOBAeRseBz8kyMvTQ6d7t2kT/KPKVRPBNtLdSsL8fJ/xKkdbBikyDXDVwT6U0j KrwJox9flGf1lu3xoMWiN1XBqpQsHL7DpdKHUZ5+xVLtYBmsTBZJks1Hq3EWzW0csHwX rXpA== X-Gm-Message-State: APjAAAXrcADSifLwMrwKNgT5rInzNjDvin9/bMMOjDuIuKLB7y4C1v3u G1d9edwgY9QPtRaXtPuJgSS+cD3VB0M= X-Received: by 2002:adf:979a:: with SMTP id s26mr17027568wrb.92.1573839014766; Fri, 15 Nov 2019 09:30:14 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id z14sm11839552wrl.60.2019.11.15.09.30.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:09 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id D8ED91FF99; Fri, 15 Nov 2019 17:30:01 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 09/11] target/arm: prepare for multiple dynamic XMLs Date: Fri, 15 Nov 2019 17:29:58 +0000 Message-Id: <20191115173000.21891-10-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::441 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, Peter Maydell , luis.machado@linaro.org, richard.henderson@linaro.org, "open list:ARM TCG CPUs" , alan.hayward@arm.com, =?utf-8?q?Alex?= =?utf-8?q?_Benn=C3=A9e?= Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" We will want to generate similar dynamic XML for gdbstub support of SVE registers (the upstream doesn't use XML). To that end lightly rename a few things to make the distinction. Signed-off-by: Alex Bennée --- target/arm/cpu.h | 20 +++++++++++++------- target/arm/gdbstub.c | 30 +++++++++++++++--------------- target/arm/helper.c | 4 ++-- 3 files changed, 30 insertions(+), 24 deletions(-) -- 2.20.1 diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 0f4541af1ee..97744496f2d 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -128,14 +128,20 @@ enum { /** * DynamicGDBXMLInfo: * @desc: Contains the XML descriptions. - * @num_cpregs: Number of the Coprocessor registers seen by GDB. - * @cpregs_keys: Array that contains the corresponding Key of - * a given cpreg with the same order of the cpreg in the XML description. + * @num: Number of the registers in this XML seen by GDB. + * @data: A union with data specific to the set of registers + * @cpregs_keys: Array that contains the corresponding Key of + * a given cpreg with the same order of the cpreg + * in the XML description. */ typedef struct DynamicGDBXMLInfo { char *desc; - int num_cpregs; - uint32_t *cpregs_keys; + int num; + union { + struct { + uint32_t *keys; + } cpregs; + } data; } DynamicGDBXMLInfo; /* CPU state for each instance of a generic timer (in cp15 c14) */ @@ -751,7 +757,7 @@ struct ARMCPU { uint64_t *cpreg_vmstate_values; int32_t cpreg_vmstate_array_len; - DynamicGDBXMLInfo dyn_xml; + DynamicGDBXMLInfo dyn_sysreg_xml; /* Timers used by the generic (architected) timer */ QEMUTimer *gt_timer[NUM_GTIMERS]; @@ -958,7 +964,7 @@ int arm_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); /* Dynamically generates for gdb stub an XML description of the sysregs from * the cp_regs hashtable. Returns the registered sysregs number. */ -int arm_gen_dynamic_xml(CPUState *cpu); +int arm_gen_dynamic_sysreg_xml(CPUState *cpu); /* Returns the dynamically generated XML for the gdb stub. * Returns a pointer to the XML contents for the specified XML file or NULL diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c index 4557775d245..1f68ab98c3b 100644 --- a/target/arm/gdbstub.c +++ b/target/arm/gdbstub.c @@ -106,15 +106,15 @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) return 0; } -static void arm_gen_one_xml_reg_tag(GString *s, DynamicGDBXMLInfo *dyn_xml, - ARMCPRegInfo *ri, uint32_t ri_key, - int bitsize) +static void arm_gen_one_xml_sysreg_tag(GString *s, DynamicGDBXMLInfo *dyn_xml, + ARMCPRegInfo *ri, uint32_t ri_key, + int bitsize) { g_string_append_printf(s, "name); g_string_append_printf(s, " bitsize=\"%d\"", bitsize); g_string_append_printf(s, " group=\"cp_regs\"/>"); - dyn_xml->num_cpregs++; - dyn_xml->cpregs_keys[dyn_xml->num_cpregs - 1] = ri_key; + dyn_xml->data.cpregs.keys[dyn_xml->num] = ri_key; + dyn_xml->num++; } static void arm_register_sysreg_for_xml(gpointer key, gpointer value, @@ -126,12 +126,12 @@ static void arm_register_sysreg_for_xml(gpointer key, gpointer value, GString *s = param->s; ARMCPU *cpu = ARM_CPU(param->cs); CPUARMState *env = &cpu->env; - DynamicGDBXMLInfo *dyn_xml = &cpu->dyn_xml; + DynamicGDBXMLInfo *dyn_xml = &cpu->dyn_sysreg_xml; if (!(ri->type & (ARM_CP_NO_RAW | ARM_CP_NO_GDB))) { if (arm_feature(env, ARM_FEATURE_AARCH64)) { if (ri->state == ARM_CP_STATE_AA64) { - arm_gen_one_xml_reg_tag(s , dyn_xml, ri, ri_key, 64); + arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64); } } else { if (ri->state == ARM_CP_STATE_AA32) { @@ -140,30 +140,30 @@ static void arm_register_sysreg_for_xml(gpointer key, gpointer value, return; } if (ri->type & ARM_CP_64BIT) { - arm_gen_one_xml_reg_tag(s , dyn_xml, ri, ri_key, 64); + arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64); } else { - arm_gen_one_xml_reg_tag(s , dyn_xml, ri, ri_key, 32); + arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 32); } } } } } -int arm_gen_dynamic_xml(CPUState *cs) +int arm_gen_dynamic_sysreg_xml(CPUState *cs) { ARMCPU *cpu = ARM_CPU(cs); GString *s = g_string_new(NULL); RegisterSysregXmlParam param = {cs, s}; - cpu->dyn_xml.num_cpregs = 0; - cpu->dyn_xml.cpregs_keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs)); + cpu->dyn_sysreg_xml.num = 0; + cpu->dyn_sysreg_xml.data.cpregs.keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs)); g_string_printf(s, ""); g_string_append_printf(s, ""); g_string_append_printf(s, ""); g_hash_table_foreach(cpu->cp_regs, arm_register_sysreg_for_xml, ¶m); g_string_append_printf(s, ""); - cpu->dyn_xml.desc = g_string_free(s, false); - return cpu->dyn_xml.num_cpregs; + cpu->dyn_sysreg_xml.desc = g_string_free(s, false); + return cpu->dyn_sysreg_xml.num; } const char *arm_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname) @@ -171,7 +171,7 @@ const char *arm_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname) ARMCPU *cpu = ARM_CPU(cs); if (strcmp(xmlname, "system-registers.xml") == 0) { - return cpu->dyn_xml.desc; + return cpu->dyn_sysreg_xml.desc; } return NULL; } diff --git a/target/arm/helper.c b/target/arm/helper.c index 2a2ac89951c..3234e6d08df 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -207,7 +207,7 @@ static int arm_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg) const ARMCPRegInfo *ri; uint32_t key; - key = cpu->dyn_xml.cpregs_keys[reg]; + key = cpu->dyn_sysreg_xml.data.cpregs.keys[reg]; ri = get_arm_cp_reginfo(cpu->cp_regs, key); if (ri) { if (cpreg_field_is_64bit(ri)) { @@ -6911,7 +6911,7 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu) 19, "arm-vfp.xml", 0); } gdb_register_coprocessor(cs, arm_gdb_get_sysreg, arm_gdb_set_sysreg, - arm_gen_dynamic_xml(cs), + arm_gen_dynamic_sysreg_xml(cs), "system-registers.xml", 0); } From patchwork Fri Nov 15 17:29:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179518 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12764721ilf; Fri, 15 Nov 2019 09:40:01 -0800 (PST) X-Google-Smtp-Source: APXvYqyUdgvAXe52vHVXOGfqowXCjFwBiOb5c8u44MjGXbc54z4e3wqXEyw8V+jKHFQMivqKHbsl X-Received: by 2002:ac8:6bd9:: with SMTP id b25mr10833721qtt.295.1573839600976; Fri, 15 Nov 2019 09:40:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839600; cv=none; d=google.com; s=arc-20160816; b=EyQr2kmGWGkQsaLvkGOB8CCl2b/av8pK3qJXSZSaQLlrBuMfnGCIUlbJ8S40z9ecKV p83WwRgJZn7WlqNNrh3Wbp2UJ789EdixjtAnR4y6l18iTkaVQPZolZUIHVzi8uPsT7xx lVpz6PYC8oEplmsesjYiBuLJcHFxJ/hG6Ifn3YgqmpNvpBFDmxkvvqSlFq0s6CFfKJ3C SR2zSv2QUnLIb5pVnsf3G31UfJ4IP8HOCHsDBcNLrrBT6Y/RGpPm3LFulu6u6DC0MMDq gWDAxl+2ZhJw/2PdkfPdvF6t026sTyEll6Hw3C1jH6e1K18moSDBAanSJA+4UYkfdqRP 8VEw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=vnNRwr2vRwuzjjL8OmNZjy9dicnq34d5xs2bJ2LDUg0=; b=P2wuvBuKFdQsyB+NU+IqTD47yF73xCXO6zQRwJqyDGQPgSS/P6D6MWDmAnmP02P4Kg vLNgkDJDUsu7M0Ah/hsHxSQO/rqibbVgAUIvR/IcdZt3c8hkmr6yknAyBPMSeAE9AaNU hdQePvqnq7pKOHzYzJ/KYLbeOjamjw1oe38PBC7wM9NCkzS3mUfLnQLy13FCVLA+nw8k FMY3IGDzRpWnnAiupNFMwiSLq6oShLkKvKOaRfKD10bT3UK3SBSzfdDsfEm7Z8iB1xEG M1fn3CtYumtzQ68ll0WJxJjaCA3eIK3Ai3xYxqJ+CN/jPioUnl4yVC5+AeFVo0coGhG5 RVMA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=fuxbgCFy; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id t46si6147391qtb.168.2019.11.15.09.40.00 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:40:00 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=fuxbgCFy; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42880 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfZf-0001Xq-Ky for patch@linaro.org; Fri, 15 Nov 2019 12:39:59 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35003) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQJ-0007OK-Mi for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQH-00032t-GC for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:19 -0500 Received: from mail-wm1-x343.google.com ([2a00:1450:4864:20::343]:40153) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQH-00031w-8P for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:17 -0500 Received: by mail-wm1-x343.google.com with SMTP id f3so11274607wmc.5 for ; Fri, 15 Nov 2019 09:30:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vnNRwr2vRwuzjjL8OmNZjy9dicnq34d5xs2bJ2LDUg0=; b=fuxbgCFyKWI/o2nlUOK0cC1cFLCFF3306lRsAgUhMHcImC98oVGMzHDeGobWKOXkQw qVQfthSOj3oVBuzZlkcVDgtvX8x/ung8if3eWs2VlsYghu9/I/IFPQC++jbCjcnjbxyT ojM61dOLRBUXu243b+/N1AvnwxtogDMGAUZ6hg6mjfhTp7yN/zFD7oUNnC9NEiCk8sPq /0m5zKqVOSRx8dUq5wE4w37HtKs4yuxRo+NNglVZviCAfGAnJg3QrgI2Xhkt8Bs4e6Oo kdDswltJQ5wf3G20wIuiUhedmxJBvPTaEo1PD944Xmip1nTdEPRKhyH6xU6q+ONehT6Z Gafw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vnNRwr2vRwuzjjL8OmNZjy9dicnq34d5xs2bJ2LDUg0=; b=uZdVJF1XQymT7+Q9ROX8WuO8rN3zhoQ/xlW2G9HMq3PJGZezFluQXlNwauOjIxXpje aPmsN/ifF5SizYq5VHExhpBYxP0qWHK1Wijrxj9BcspSPDHDoADSOf1qDRdI76MLPg+t GGpCv4zQ59sGOR/rA3NKNK6O+stUPk+1Wy4rru6AJh12r9O7xxVEgBL2EXfT3/dyHrdB WC8vQjEWT3b7SPtgWGZ6JnAWBMb66MMsdgb8HlPa/UHVU2cwXeHUr81Sn/xZu2aJGEJN gWlM1WGQ91EPiOYWqA/XNX5Jbld77gCL+x6oz1pWDTiWQOgfU7xxbIwx/M/ecWJ4+x88 dKIg== X-Gm-Message-State: APjAAAUAyu0cOPbL5enGwMOp+ot1oZHUDEbVAjCv3fGEOjk1gt1THRGJ bnqe8gd5uys342cYNRGL7gsq5A== X-Received: by 2002:a1c:5fc4:: with SMTP id t187mr16734558wmb.142.1573839016064; Fri, 15 Nov 2019 09:30:16 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id m25sm9279194wmi.46.2019.11.15.09.30.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:09 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id F14AD1FF9A; Fri, 15 Nov 2019 17:30:01 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 10/11] target/arm: explicitly encode regnum in our XML Date: Fri, 15 Nov 2019 17:29:59 +0000 Message-Id: <20191115173000.21891-11-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::343 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, Peter Maydell , luis.machado@linaro.org, richard.henderson@linaro.org, "open list:ARM TCG CPUs" , alan.hayward@arm.com, =?utf-8?q?Alex?= =?utf-8?q?_Benn=C3=A9e?= Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" This is described as optional but I'm not convinced of the numbering when multiple target fragments are sent. Signed-off-by: Alex Bennée --- target/arm/cpu.h | 2 +- target/arm/gdbstub.c | 16 ++++++++++------ target/arm/helper.c | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) -- 2.20.1 Reviewed-by: Richard Henderson diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 97744496f2d..d5b6eeeb2f0 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -964,7 +964,7 @@ int arm_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); /* Dynamically generates for gdb stub an XML description of the sysregs from * the cp_regs hashtable. Returns the registered sysregs number. */ -int arm_gen_dynamic_sysreg_xml(CPUState *cpu); +int arm_gen_dynamic_sysreg_xml(CPUState *cpu, int base_reg); /* Returns the dynamically generated XML for the gdb stub. * Returns a pointer to the XML contents for the specified XML file or NULL diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c index 1f68ab98c3b..ca2abedd8cf 100644 --- a/target/arm/gdbstub.c +++ b/target/arm/gdbstub.c @@ -24,6 +24,7 @@ typedef struct RegisterSysregXmlParam { CPUState *cs; GString *s; + int n; } RegisterSysregXmlParam; /* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect @@ -108,10 +109,11 @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) static void arm_gen_one_xml_sysreg_tag(GString *s, DynamicGDBXMLInfo *dyn_xml, ARMCPRegInfo *ri, uint32_t ri_key, - int bitsize) + int bitsize, int regnum) { g_string_append_printf(s, "name); g_string_append_printf(s, " bitsize=\"%d\"", bitsize); + g_string_append_printf(s, " regnum=\"%d\"", regnum); g_string_append_printf(s, " group=\"cp_regs\"/>"); dyn_xml->data.cpregs.keys[dyn_xml->num] = ri_key; dyn_xml->num++; @@ -124,6 +126,7 @@ static void arm_register_sysreg_for_xml(gpointer key, gpointer value, ARMCPRegInfo *ri = value; RegisterSysregXmlParam *param = (RegisterSysregXmlParam *)p; GString *s = param->s; + int n = param->n; ARMCPU *cpu = ARM_CPU(param->cs); CPUARMState *env = &cpu->env; DynamicGDBXMLInfo *dyn_xml = &cpu->dyn_sysreg_xml; @@ -131,7 +134,7 @@ static void arm_register_sysreg_for_xml(gpointer key, gpointer value, if (!(ri->type & (ARM_CP_NO_RAW | ARM_CP_NO_GDB))) { if (arm_feature(env, ARM_FEATURE_AARCH64)) { if (ri->state == ARM_CP_STATE_AA64) { - arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64); + arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64, n); } } else { if (ri->state == ARM_CP_STATE_AA32) { @@ -140,20 +143,21 @@ static void arm_register_sysreg_for_xml(gpointer key, gpointer value, return; } if (ri->type & ARM_CP_64BIT) { - arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64); + arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64, n); } else { - arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 32); + arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 32, n); } } } } + param->n++; } -int arm_gen_dynamic_sysreg_xml(CPUState *cs) +int arm_gen_dynamic_sysreg_xml(CPUState *cs, int base_reg) { ARMCPU *cpu = ARM_CPU(cs); GString *s = g_string_new(NULL); - RegisterSysregXmlParam param = {cs, s}; + RegisterSysregXmlParam param = {cs, s, base_reg}; cpu->dyn_sysreg_xml.num = 0; cpu->dyn_sysreg_xml.data.cpregs.keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs)); diff --git a/target/arm/helper.c b/target/arm/helper.c index 3234e6d08df..421e27e0f32 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -6911,7 +6911,7 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu) 19, "arm-vfp.xml", 0); } gdb_register_coprocessor(cs, arm_gdb_get_sysreg, arm_gdb_set_sysreg, - arm_gen_dynamic_sysreg_xml(cs), + arm_gen_dynamic_sysreg_xml(cs, cs->gdb_num_regs), "system-registers.xml", 0); } From patchwork Fri Nov 15 17:30:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 179519 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp12765370ilf; Fri, 15 Nov 2019 09:40:35 -0800 (PST) X-Google-Smtp-Source: APXvYqxr3fiUS2ORkPJpJPOT9vkdFAbwENOGS279Qfbh2K3iTikrj14kkbMFQdMI6cUJsAIOJaKI X-Received: by 2002:a05:620a:113a:: with SMTP id p26mr13698066qkk.479.1573839634770; Fri, 15 Nov 2019 09:40:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573839634; cv=none; d=google.com; s=arc-20160816; b=hDB2WQZiThYs1lT5MnvWMJLKSMbcCIsvCXd4VaLz65MlzkGMwjW74g6knnMH4+zmmy VLDXaww6l9Ct89MUMit1YiBspduzX+v7USBch1riw3aFodIMrwS/IXE8dSnAC7DTI3JH NYIhlRga+V3krxZ6BK7CuDEk43osq+RCxUWwrYV7F/Ianphhzm2yGKdMa8lgCEA1/ZPl bbAGBXY58gRK1d6abp5t8vZQPr/lU1MSa/pfuqXb9d5T0NAs9vNfdYcQ5XDdqHmaC7gu MSrqzBBJlgY9/j4925fIua5yfLlwzuLz9QkyO9kMVcf1nKE86mdr0KIpU1MQnXHq7Tc8 460w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=gDNQ6jd5KtQyxOB0ZoMedQcNspZkCdSb8aZGFqdtZ3w=; b=q0Lv1y9khEtsB+yItqbxNsYQ+I42b1MeepRJ7d337Kf8O0MBHFqqDiztcm84FcSUgr cmU9gBhdyGNQdWQtBMrB4cl5n1s+2p7YgByt3lSKO2QNZllM8yZN7bjLP0Ap5SkyOewh ibWFhZ+tbR8P5tA/MndSqt4jC/HJYRLy+J4WFZh0UNqC5g/2j0a2WKt8nu262OHdZSbj MR2bFUtx5xrvoYzzgYSFkLvzwoyaGThrYG6AiGVhjsA7DReFCEDOOz2OLwSuvHl0Fpr7 c/aMHWt0vaJDiH8dYpYYP1usJL0OqQuGABN4xkh9NKEc6MaKhJ/ClEfJhZ7GEGmPoec8 +utg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b="QW9/hvzd"; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id z8si6246156qti.63.2019.11.15.09.40.33 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 15 Nov 2019 09:40:34 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b="QW9/hvzd"; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:42906 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfaC-0002aj-PS for patch@linaro.org; Fri, 15 Nov 2019 12:40:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:35111) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iVfQN-0007SK-18 for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iVfQJ-00034f-9J for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:22 -0500 Received: from mail-wm1-x344.google.com ([2a00:1450:4864:20::344]:40155) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iVfQI-00033r-W4 for qemu-devel@nongnu.org; Fri, 15 Nov 2019 12:30:19 -0500 Received: by mail-wm1-x344.google.com with SMTP id f3so11274702wmc.5 for ; Fri, 15 Nov 2019 09:30:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gDNQ6jd5KtQyxOB0ZoMedQcNspZkCdSb8aZGFqdtZ3w=; b=QW9/hvzdAuKfyS0eMvBz+I8scgYQ9K8h6m+yRISWSGNbUKXnd/NADyTTVtouItyDpL SBBrAaBdeBCJxMzsBEsfe/DMkVGILz/KCKAZzmEzUzRfdfxQNPLOpLdubCdMhtc3Hxk6 mn4Ix4c9KXqfhTg5luYSm83zc8Vvy4rXq6QT+70ep3kGPTNCWN/ePosZvqNDvOnb37VT sak50ENmN9IyioQ3BkNrr6rEfNiChOk9pcZ2SsjYhNlPKcdBTkWjpV1lUMsnpQ+1bBlb b+D6da6prYL6ruswXBUsAbXm9y2CymkLxGIRkdf2pUF6adFcKNT2tqeSRGmxDsXnwxHc 1mkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gDNQ6jd5KtQyxOB0ZoMedQcNspZkCdSb8aZGFqdtZ3w=; b=TZ79CJJ+itRvVFeNgpoojD/gNSxWViQs0XmHZjSIxFJGBwZKuced4UG3IpFQxIe5Zh rpp9veSWyAU7LyTW6rn6UBQ2Oqe3ka91kxc7T2iiid+XTPMdTllvlT8w7tb4CgHJU6OJ vGLcFwcfIvaPdi7xUqzgc19cRG7XQhAwIIn4xC/eidXAcuc0UvEQiKsXSIz3rIvUp5fd xN4guGqTJ77e6WiBcyHoeEiwC4mfM6d6c7R/k1uh06E/vjuN3SWn9N1/coQp0b3rqilB 2Zy1zrW67dvk+amVziyvStOFlUliyyLYevwgkc2OVp34dt/D2oHShHzC3VKlYu4SILNA MqYg== X-Gm-Message-State: APjAAAWzdXRBpIcmnoPAPka4WPBO0X4rR8Qiypppss3iJ2kn/Pzt1TKB iovAtBqHN0/QdzbSD6tX9ompUQ== X-Received: by 2002:a1c:20ce:: with SMTP id g197mr14906905wmg.99.1573839017761; Fri, 15 Nov 2019 09:30:17 -0800 (PST) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id a26sm2586691wmm.14.2019.11.15.09.30.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Nov 2019 09:30:13 -0800 (PST) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 16CA01FF9B; Fri, 15 Nov 2019 17:30:02 +0000 (GMT) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [RFC PATCH 11/11] target/arm: generate xml description of our SVE registers Date: Fri, 15 Nov 2019 17:30:00 +0000 Message-Id: <20191115173000.21891-12-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191115173000.21891-1-alex.bennee@linaro.org> References: <20191115173000.21891-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::344 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: damien.hedde@greensocs.com, Peter Maydell , luis.machado@linaro.org, richard.henderson@linaro.org, "open list:ARM TCG CPUs" , alan.hayward@arm.com, =?utf-8?q?Alex?= =?utf-8?q?_Benn=C3=A9e?= Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Alex Bennée --- target/arm/cpu.h | 10 ++++- target/arm/gdbstub.c | 99 ++++++++++++++++++++++++++++++++++++++++++++ target/arm/helper.c | 69 ++++++++++++++++++++++++++++-- 3 files changed, 173 insertions(+), 5 deletions(-) -- 2.20.1 diff --git a/target/arm/cpu.h b/target/arm/cpu.h index d5b6eeeb2f0..5470548a057 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -141,6 +141,9 @@ typedef struct DynamicGDBXMLInfo { struct { uint32_t *keys; } cpregs; + struct { + int fpsr_pos; + } sve; } data; } DynamicGDBXMLInfo; @@ -758,6 +761,7 @@ struct ARMCPU { int32_t cpreg_vmstate_array_len; DynamicGDBXMLInfo dyn_sysreg_xml; + DynamicGDBXMLInfo dyn_svereg_xml; /* Timers used by the generic (architected) timer */ QEMUTimer *gt_timer[NUM_GTIMERS]; @@ -961,10 +965,12 @@ hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr, int arm_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); int arm_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); -/* Dynamically generates for gdb stub an XML description of the sysregs from - * the cp_regs hashtable. Returns the registered sysregs number. +/* + * Helpers to dynamically generates XML descriptions of the sysregs + * and SVE registers. Returns the number of registers in each set. */ int arm_gen_dynamic_sysreg_xml(CPUState *cpu, int base_reg); +int arm_gen_dynamic_svereg_xml(CPUState *cpu, int base_reg); /* Returns the dynamically generated XML for the gdb stub. * Returns a pointer to the XML contents for the specified XML file or NULL diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c index ca2abedd8cf..62b17fccbe7 100644 --- a/target/arm/gdbstub.c +++ b/target/arm/gdbstub.c @@ -170,12 +170,111 @@ int arm_gen_dynamic_sysreg_xml(CPUState *cs, int base_reg) return cpu->dyn_sysreg_xml.num; } +struct TypeSize { + const char *gdb_type; + int size; + const char *suffix; +}; + +static struct TypeSize vec_lanes[] = { + { "uint128", 128, "qu"}, + { "int128", 128, "qs" }, + { "uint64", 64, "lu"}, + { "int64", 64, "ls" }, + { "uint32", 32, "u"}, + { "int32", 32, "s" }, + { "uint16", 16, "hu"}, + { "int16", 16, "hs" }, + { "uint8", 8, "ub"}, + { "int8", 8, "sb" }, + { "ieee_double", 64, "df" }, + { "ieee_single", 32, "sf" }, + { "ieee_half", 16, "hf" }, +}; + + +int arm_gen_dynamic_svereg_xml(CPUState *cs, int base_reg) +{ + ARMCPU *cpu = ARM_CPU(cs); + GString *s = g_string_new(NULL); + DynamicGDBXMLInfo *info = &cpu->dyn_svereg_xml; + g_autoptr(GString) ts = g_string_new(""); + g_autoptr(GString) us = g_string_new(""); + int i, j; + info->num = 0; + g_string_printf(s, ""); + g_string_append_printf(s, ""); + g_string_append_printf(s, ""); + /* first define types and the union they belong to */ + for (i = 0; i < ARRAY_SIZE(vec_lanes); i++) { + int count = 128 / vec_lanes[i].size; + g_string_printf(ts, "vq%d%s", count, vec_lanes[i].suffix); + g_string_append_printf(s, "", + ts->str, vec_lanes[i].gdb_type, count); + g_string_append_printf(us, "", + vec_lanes[i].suffix, ts->str); + } + /* wrap the union around define the overall vq type */ + us = g_string_prepend(us, ""); + us = g_string_append(us,""); + g_string_append(s, us->str); + + /* Then define each register in parts for each vq */ + for (i = 0; i < 32; i++) { + for (j = 0; j < cpu->sve_max_vq; j++) { + g_string_append_printf(s, + "", + i, j, base_reg++); + info->num++; + } + } + /* fpscr & status registers */ + info->data.sve.fpsr_pos = info->num; + g_string_append_printf(s, "", base_reg++); + g_string_append_printf(s, "", base_reg++); + info->num += 2; + /* + * Predicate registers aren't so big they are worth splitting up + * but we do need to define a type to hold the array of quad + * references. + */ + g_string_append_printf(s, + "", + cpu->sve_max_vq); + for (i = 0; i < 16; i++) { + g_string_append_printf(s, + "", + i, cpu->sve_max_vq * 16, base_reg++); + info->num++; + } + g_string_append_printf(s, + "", + cpu->sve_max_vq * 16, base_reg++); + info->num++; + g_string_append_printf(s, ""); + cpu->dyn_svereg_xml.desc = g_string_free(s, false); + return cpu->dyn_svereg_xml.num; +} + + const char *arm_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname) { ARMCPU *cpu = ARM_CPU(cs); if (strcmp(xmlname, "system-registers.xml") == 0) { return cpu->dyn_sysreg_xml.desc; + } else if (strcmp(xmlname, "sve-registers.xml") == 0) { + return cpu->dyn_svereg_xml.desc; } return NULL; } diff --git a/target/arm/helper.c b/target/arm/helper.c index 421e27e0f32..b517b88ba3c 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -201,6 +201,15 @@ static void write_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri, } } +/** + * arm_get/set_gdb_*: get/set a gdb register + * @env: the CPU state + * @buf: a buffer to copy to/from + * @reg: register number (offset from start of group) + * + * We return the number of bytes copied + */ + static int arm_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg) { ARMCPU *cpu = env_archcpu(env); @@ -224,6 +233,46 @@ static int arm_gdb_set_sysreg(CPUARMState *env, uint8_t *buf, int reg) return 0; } +#ifdef TARGET_AARCH64 +static int arm_gdb_get_svereg(CPUARMState *env, GByteArray *buf, int reg) +{ + ARMCPU *cpu = env_archcpu(env); + DynamicGDBXMLInfo *info = &cpu->dyn_svereg_xml; + + /* The first 32 * vq registers are the zNpQ regs */ + if (reg < (32 * cpu->sve_max_vq)) { + int vq = reg % cpu->sve_max_vq; + int z = reg / cpu->sve_max_vq; + return gdb_get_reg128(buf, + env->vfp.zregs[z].d[vq * 2 + 1], + env->vfp.zregs[z].d[vq * 2]); + } + switch (reg - info->data.sve.fpsr_pos) { + case 0: + return gdb_get_reg32(buf, vfp_get_fpsr(env)); + case 1: + return gdb_get_reg32(buf, vfp_get_fpsr(env)); + case 2 ... 19: + { + /* XXX FIXME: not quite right, we could be bigger */ + int preg = reg - info->data.sve.fpsr_pos - 2; + return gdb_get_reg64(buf, env->vfp.pregs[preg].p[0]); + } + default: + /* gdbstub asked for something out our range */ + break; + } + + return 0; +} + +static int arm_gdb_set_svereg(CPUARMState *env, uint8_t *buf, int reg) +{ + fprintf(stderr, "%s: %d\n", __func__, reg); + return 0; +} +#endif /* TARGET_AARCH64 */ + static bool raw_accessors_invalid(const ARMCPRegInfo *ri) { /* Return true if the regdef would cause an assertion if you called @@ -6897,9 +6946,22 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu) CPUARMState *env = &cpu->env; if (arm_feature(env, ARM_FEATURE_AARCH64)) { - gdb_register_coprocessor(cs, aarch64_fpu_gdb_get_reg, - aarch64_fpu_gdb_set_reg, - 34, "aarch64-fpu.xml", 0); + /* + * The lower part of each SVE register aliases to the FPU + * registers so we don't need to include both. + */ +#ifdef TARGET_AARCH64 + if (isar_feature_aa64_sve(&cpu->isar)) { + gdb_register_coprocessor(cs, arm_gdb_get_svereg, arm_gdb_set_svereg, + arm_gen_dynamic_svereg_xml(cs, cs->gdb_num_regs), + "sve-registers.xml", 0); + } else +#endif + { + gdb_register_coprocessor(cs, aarch64_fpu_gdb_get_reg, + aarch64_fpu_gdb_set_reg, + 34, "aarch64-fpu.xml", 0); + } } else if (arm_feature(env, ARM_FEATURE_NEON)) { gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg, 51, "arm-neon.xml", 0); @@ -6913,6 +6975,7 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu) gdb_register_coprocessor(cs, arm_gdb_get_sysreg, arm_gdb_set_sysreg, arm_gen_dynamic_sysreg_xml(cs, cs->gdb_num_regs), "system-registers.xml", 0); + } /* Sort alphabetically by type name, except for "any". */