From patchwork Tue Dec 19 14:48:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 82513 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 19797385E44E for ; Tue, 19 Dec 2023 14:48:48 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-io1-xd2a.google.com (mail-io1-xd2a.google.com [IPv6:2607:f8b0:4864:20::d2a]) by sourceware.org (Postfix) with ESMTPS id E88ED3858C42 for ; Tue, 19 Dec 2023 14:48:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E88ED3858C42 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E88ED3858C42 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::d2a ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702997314; cv=none; b=sPuts/wlDJkDvv/nCUDcwxFi6OaNZKIz4Oz/2xRcND1MQ8Gmse1Hs3reusEJfNTq5rFUhraHWY+JxjXaA2BdGq7f7PUBP9e15Oa44VqPo3b35x3UbpxMnKz839xWeXoH7gh34LgK5GEBfkjCu7pz4qjo3hehHcT5vVJQzbW5gFs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702997314; c=relaxed/simple; bh=887ZOGpInB8clI+NYbEJPtzzjLj31dvVoHBikwzZ8fA=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=F451mMJmywi5xw19VHQwH/V9lXj7Wb/j3jD6MBhaKjL1MSK0yJcvpkESbD0D8Yr3uobrZaEkyN/3XaEuCNz02hO1Smd6q9mK2qsp5uxKUYvyynO5547KiQiaoFpiD1j7cgtjYTCCmp8rvpvSLW0/xspVBZ7RQdNs/0egFdCu6Fs= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-io1-xd2a.google.com with SMTP id ca18e2360f4ac-7b798e6f702so213644039f.2 for ; Tue, 19 Dec 2023 06:48:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1702997312; x=1703602112; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Zzz/LHpW1jne49nwfZUJCHiFR27FFRa0loMxGYnVSs8=; b=WdMKr59mggAJZ6bZLl5KgQUvw4bDkLJ2joksScmIzt7X5lK+pse0JpYaBmpJ4zJIza /UVKEsOCgWYMYIAAvAvGc6lYWCuFlbEqqi8ibFK4eGNB6cgQzXkfHvSGtBAzvHK3GjIm 3m1kcJT6h7wYMgd8eIpyuk7mpBYe4jCIEiGfoPpMKJDQdKf1QYuIvzRQzoqVgWGvJp8R 5lSPr/H9dEjFQkF98rJPQNJvdUri3RXCodcVVuwJ4tGwT39mKc4uAG36Q5bf1YeUjsy8 gwKJjETqcrE2p05BY/3DzP/9k8A/J+0jJQGC1TtNGoLbf8dgUaWz2aq7PjtQ7oyie32j cv+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702997312; x=1703602112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Zzz/LHpW1jne49nwfZUJCHiFR27FFRa0loMxGYnVSs8=; b=D5JpXHjd8/ws6PqkCdHUR0LpVHWMFSqePuG1pMxYWVN+/tHJl88dguAAwIazM4fLGe yZmld2CvU0YcO2uQvLCa899LTkopzWSifqa3oBTJTvKqYB+qTqFpJYPKXVRRjaBas2PU Mj9dKIjfW8wdPwX7vatEn2jBr7/hj7q4rpJihHNwQ8HDepoNklPxYQQOrzPYhMiCJcXw 1yqOVf0Kpge55BrVTJLPeJKyMbC2mHGpN+dlJfGgDGykcFyxYK6sfmVNPIlumVZ6OLdW pEg9jF/uK3MhOr5GeoHjQV29srGNmHa0l/jW+J8TkqqhoZ1sKFj5oRRVOPgRUixbWU+I RUfg== X-Gm-Message-State: AOJu0Yz4o9HYaI1/Zp5ersfWzm9KRCRKGCAyzM1mTUcuegtQQstBLzUh QyAlGUz5pKytbiRAVTugYeYAJ3FQmYQ3Aq/It3c= X-Google-Smtp-Source: AGHT+IGGsLDQe1c1wy6SxXTfR65J1DCEpCflBWhjzkVAH8s0OsbAvvTNu8scafCDDqBylwkXW9AE8Q== X-Received: by 2002:a6b:c9cb:0:b0:7b6:e765:1d17 with SMTP id z194-20020a6bc9cb000000b007b6e7651d17mr23647694iof.40.1702997312145; Tue, 19 Dec 2023 06:48:32 -0800 (PST) Received: from localhost.localdomain (71-211-161-25.hlrn.qwest.net. [71.211.161.25]) by smtp.gmail.com with ESMTPSA id bs17-20020a056638451100b0046b14785710sm124947jab.113.2023.12.19.06.48.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Dec 2023 06:48:31 -0800 (PST) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Mask x86 segment registers in Windows gdbserver Date: Tue, 19 Dec 2023 07:48:23 -0700 Message-ID: <20231219144823.1070597-1-tromey@adacore.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, 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 A test internal to AdaCore prints the segment registers. When run using gdbserver, it shows: (gdb) print /x $gs $6 = 0x2b0000 However, the segment registers are only 16 bits -- so this has some invalid bits. gdb's windows-nat.c has long had a fix for this problem. This patch applies the fix to gdbserver as well. Reviewed-By: John Baldwin --- gdbserver/win32-i386-low.cc | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/gdbserver/win32-i386-low.cc b/gdbserver/win32-i386-low.cc index f78e0120678..d60ff83c15d 100644 --- a/gdbserver/win32-i386-low.cc +++ b/gdbserver/win32-i386-low.cc @@ -35,6 +35,12 @@ using namespace windows_nat; #define FCS_REGNUM 27 #define FOP_REGNUM 31 +#define I386_CS_REGNUM 10 +#define I386_GS_REGNUM 15 + +#define AMD64_CS_REGNUM 18 +#define AMD64_GS_REGNUM 23 + #define FLAG_TRACE_BIT 0x100 static struct x86_debug_reg_state debug_reg_state; @@ -459,6 +465,18 @@ static const int amd64_mappings[] = #endif /* __x86_64__ */ +/* Return true if R is a segment register. */ +static bool +is_segment_register (int r) +{ +#ifdef __x86_64__ + if (!windows_process.wow64_process) + return r >= AMD64_CS_REGNUM && r <= AMD64_GS_REGNUM; + else +#endif + return r >= I386_CS_REGNUM && r <= I386_GS_REGNUM; +} + /* Fetch register from gdbserver regcache data. */ static void i386_fetch_inferior_register (struct regcache *regcache, @@ -491,6 +509,14 @@ i386_fetch_inferior_register (struct regcache *regcache, l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1); supply_register (regcache, r, (char *) &l); } + else if (is_segment_register (r)) + { + /* GDB treats segment registers as 32bit registers, but they are + in fact only 16 bits long. Make sure we do not read extra + bits from our source buffer. */ + l = *((long *) context_offset) & 0xffff; + supply_register (regcache, r, (char *) &l); + } else supply_register (regcache, r, context_offset); }