From patchwork Thu Dec 14 20:22:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 82169 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3F435384F02F for ; Thu, 14 Dec 2023 20:23:19 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) by sourceware.org (Postfix) with ESMTPS id 1D5E4386188E for ; Thu, 14 Dec 2023 20:22:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1D5E4386188E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1D5E4386188E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702585373; cv=none; b=GDyRDy1CN6vlmzFrbn97ZKQl/AMqJMLeVoGBo85tnhyebN9oPHGHBleG/5RaPZg2hWmFvkVu66oLhWt010x+slQO779kwb+vMVzQBdHh0+N9bPc5Dms1wG6MFkVv6QtgxelUZxDDx65fcTOwAYWT3NzNGys3A6a07uPYB1jvBc4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702585373; c=relaxed/simple; bh=cMEciRgwilbSSSaV4e9UdWUCdf2W2drWN475p4+jrms=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=bUZ6i/kDG0q6zFnFRgeEtaHlum6hxMD7XQHLy7iHn135dYjo/eKl869zzT9+ZfAc63Hsn49kHnwlCcbxxZL0Bv5mb1lsjyh42g09bg71orm79jej47pgNzE/yBS/GCkrbA+PBvtxs/W2HcMgtxgubkrMUVsSWaJOIwzHj9dBNtc= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-40c68c1990dso2699975e9.0 for ; Thu, 14 Dec 2023 12:22:52 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702585370; x=1703190170; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4eDjbyBobp3oHIVPFVu+rV37b/E/bVOIE/BV7bj8YwQ=; b=w+kXFr7bBc9GgBZEtjSjdLLbQ5l+I7fhT/jxgCT8yDLidd1n83PZrCZ2Kc2tZiulGW RDN7VrXmRjExwEJhQl4zYgyWrwVPVF68xauRFU1OXX8f6bf5swN+RjdApXZ9gdO5iDft zb33m3ftFeVi0x78VFCyKg9An80XbJGswdtzJKUDmZ3eDDog6u1ASfhZAWHDF3AUneNZ gLyjAMaGoW1whSBu57QjN38dGmWP9Eyv/TvnOaWzxKHKGwspCWDkgESO8/+XMDyjLfKf um0RisrNiIv1aJpGjdL/ZeXyYYJ9vsKKbzBFTsV2ge3f/SlA4ag6z5Xx6slR3MR5G6hr H7zg== X-Gm-Message-State: AOJu0YwfINDVFJIJ7zBvOH08yV6VFfoub/OilrjYOWVt9jGi7jwfTGBo J0R1sGTw5OKjwwHcPHsiAPqiHWdgcp2NTA== X-Google-Smtp-Source: AGHT+IHc51zl9VavjTTmwY+btA+Z9gMwMYf1z0U6QsrUAHkHqOEFtpEzEjbDGmsae+DVfHyKdFR1qA== X-Received: by 2002:a05:600c:ad0:b0:40c:2a4c:b265 with SMTP id c16-20020a05600c0ad000b0040c2a4cb265mr3838897wmr.124.1702585370490; Thu, 14 Dec 2023 12:22:50 -0800 (PST) Received: from localhost ([168.182.197.117]) by smtp.gmail.com with UTF8SMTPSA id a11-20020adfeecb000000b00333b17432c0sm16898661wrp.28.2023.12.14.12.22.49 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 14 Dec 2023 12:22:49 -0800 (PST) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 3/8] displaced_step_finish: Don't fetch the regcache of exited threads Date: Thu, 14 Dec 2023 20:22:33 +0000 Message-ID: <20231214202238.1065676-4-pedro@palves.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231214202238.1065676-1-pedro@palves.net> References: <20231214202238.1065676-1-pedro@palves.net> MIME-Version: 1.0 X-Spam-Status: No, score=-10.7 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org displaced_step_finish can be called with event_status.kind == TARGET_WAITKIND_THREAD_EXITED, and in that case it is not possible to get at the already-exited thread's registers. This patch moves the get_thread_regcache calls to branches that actually need it, where we know the thread is still alive. It also adds an assertion to get_thread_regcache, to help catching these broken cases sooner. Change-Id: I63b5eacb3e02a538fc5087c270d8025adfda88c3 --- gdb/infrun.c | 19 ++++++++++++------- gdb/regcache.c | 2 ++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/gdb/infrun.c b/gdb/infrun.c index 6dc0a2bb9a5..76693a30611 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -2021,8 +2021,6 @@ displaced_step_finish (thread_info *event_thread, const target_waitstatus &event_status) { /* Check whether the parent is displaced stepping. */ - struct regcache *regcache = get_thread_regcache (event_thread); - struct gdbarch *gdbarch = regcache->arch (); inferior *parent_inf = event_thread->inf; /* If this was a fork/vfork/clone, this event indicates that the @@ -2040,10 +2038,15 @@ displaced_step_finish (thread_info *event_thread, gdbarch_displaced_step_restore_all_in_ptid. This is not enforced during gdbarch validation to support architectures which support displaced stepping but not forks. */ - if (event_status.kind () == TARGET_WAITKIND_FORKED - && gdbarch_supports_displaced_stepping (gdbarch)) - gdbarch_displaced_step_restore_all_in_ptid - (gdbarch, parent_inf, event_status.child_ptid ()); + if (event_status.kind () == TARGET_WAITKIND_FORKED) + { + struct regcache *parent_regcache = get_thread_regcache (event_thread); + struct gdbarch *gdbarch = parent_regcache->arch (); + + if (gdbarch_supports_displaced_stepping (gdbarch)) + gdbarch_displaced_step_restore_all_in_ptid + (gdbarch, parent_inf, event_status.child_ptid ()); + } displaced_step_thread_state *displaced = &event_thread->displaced_step_state; @@ -2082,11 +2085,13 @@ displaced_step_finish (thread_info *event_thread, child hasn't been added to the inferior list yet at this point. */ + struct regcache *parent_regcache = get_thread_regcache (event_thread); + struct gdbarch *gdbarch = parent_regcache->arch (); struct regcache *child_regcache = get_thread_arch_regcache (parent_inf, event_status.child_ptid (), gdbarch); /* Read PC value of parent. */ - CORE_ADDR parent_pc = regcache_read_pc (regcache); + CORE_ADDR parent_pc = regcache_read_pc (parent_regcache); displaced_debug_printf ("write child pc from %s to %s", paddress (gdbarch, diff --git a/gdb/regcache.c b/gdb/regcache.c index e46a0b58f50..f9bf1ecbe12 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -411,6 +411,8 @@ get_thread_regcache (process_stratum_target *target, ptid_t ptid) struct regcache * get_thread_regcache (thread_info *thread) { + gdb_assert (thread->state != THREAD_EXITED); + return get_thread_regcache (thread->inf->process_target (), thread->ptid); }