From patchwork Thu May 10 17:04:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Brobecker X-Patchwork-Id: 27202 Received: (qmail 51787 invoked by alias); 10 May 2018 17:04:39 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 51763 invoked by uid 89); 10 May 2018 17:04:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 10 May 2018 17:04:36 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 5ED631161A6; Thu, 10 May 2018 13:04:35 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 6TIlWdQaTymk; Thu, 10 May 2018 13:04:35 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 2A5011161A3; Thu, 10 May 2018 13:04:35 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id 72D7D8304F; Thu, 10 May 2018 10:04:33 -0700 (PDT) Date: Thu, 10 May 2018 10:04:33 -0700 From: Joel Brobecker To: Simon Marchi Cc: gdb-patches@sourceware.org Subject: Re: [RFA/gdbserver] x86 LynxOS-178: Adjust floating-point context structure Message-ID: <20180510170433.mmw4wmdkmneu223x@adacore.com> References: <1525964730-8822-1-git-send-email-brobecker@adacore.com> <1525964730-8822-2-git-send-email-brobecker@adacore.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170113 (1.7.2) > > gdb/gdbserver/ChangeLog: > > > > * lynx-i386-low.c (LYNXOS_178): New macro. > > (usr_fcontext_t) : Provide a definition that matches > > the layout on LynxOS-178. > > This syntax (with < >) is usually meant to denote fields (as if you were > referring to field LYNXOS_178 in structure usr_fcontext_t). To denote an > #ifdef context (which is what I understand you want to do), I usually see > this syntax: > > [LYNXOS_178] (usr_fcontext_t): ... > > For example: > > https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/ChangeLog-2017;h=aaadf142a4641ecd3feb26bc1dfa83dcc19e713c;hb=HEAD#l13806 Grumpf. I keep getting confused over this. Of course, you are right, and this is explained in the GCS. > > > (lynx_i386_fill_fpregset, lynx_i386_store_fpregset): Do not > > handle floating point registers that are not supported by > > LynxOS-178. > > > > OK to push to master? > > Otherwise, it looks good to me. Thanks. Attached is the patch I ended up pushing to master. gdb/gdbserver/ChangeLog: * lynx-i386-low.c (LYNXOS_178): New macro. [LYNXOS_178] (usr_fcontext_t): Provide a definition that matches the layout on LynxOS-178. (lynx_i386_fill_fpregset, lynx_i386_store_fpregset): Do not handle floating point registers that are not supported by LynxOS-178. From 55271bf969c2c09b98aecd97b36170fbf76c3fc4 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Thu, 10 May 2018 12:01:39 -0500 Subject: [PATCH] x86 LynxOS-178: Adjust floating-point context structure The floating point context structure on x86 LynxOS-178 is not the same as on LynxOS 5.x. As a consequence, trying to print the return value of a function returning a float, for instance, yields incorrect results. This patch fixes the issue by providing an updated definition for LynxOS-178 (the reason why we cannot access the actual definition provided by the system still remains true). gdb/gdbserver/ChangeLog: * lynx-i386-low.c (LYNXOS_178): New macro. [LYNXOS_178] (usr_fcontext_t): Provide a definition that matches the layout on LynxOS-178. (lynx_i386_fill_fpregset, lynx_i386_store_fpregset): Do not handle floating point registers that are not supported by LynxOS-178. --- gdb/gdbserver/ChangeLog | 9 +++++++++ gdb/gdbserver/lynx-i386-low.c | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 36915cf..5e7ea10 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,12 @@ +2018-05-10 Joel Brobecker + + * lynx-i386-low.c (LYNXOS_178): New macro. + [LYNXOS_178] (usr_fcontext_t): Provide a definition that matches + the layout on LynxOS-178. + (lynx_i386_fill_fpregset, lynx_i386_store_fpregset): Do not + handle floating point registers that are not supported by + LynxOS-178. + 2018-05-10 Tom Tromey * configure: Rebuild. diff --git a/gdb/gdbserver/lynx-i386-low.c b/gdb/gdbserver/lynx-i386-low.c index 37c0dc9..a8817b4 100644 --- a/gdb/gdbserver/lynx-i386-low.c +++ b/gdb/gdbserver/lynx-i386-low.c @@ -25,7 +25,15 @@ /* The following two typedefs are defined in a .h file which is not in the standard include path (/sys/include/family/x86/ucontext.h), - so we just duplicate them here. */ + so we just duplicate them here. + + Unfortunately for us, the definition of this structure differs between + LynxOS 5.x and LynxOS 178. Rather than duplicate the code, we use + different definitions depending on the target. */ + +#ifdef VMOS_DEV +#define LYNXOS_178 +#endif /* General register context */ typedef struct usr_econtext { @@ -52,6 +60,28 @@ typedef struct usr_econtext { uint32_t uec_gs; } usr_econtext_t; +#if defined(LYNXOS_178) + +/* Floating point register context */ +typedef struct usr_fcontext { + uint32_t ufc_control; + uint32_t ufc_status; + uint32_t ufc_tag; + uint8_t *ufc_inst_off; + uint32_t ufc_inst_sel; + uint8_t *ufc_data_off; + uint32_t ufc_data_sel; + struct ufp387_real { + uint16_t umant4; + uint16_t umant3; + uint16_t umant2; + uint16_t umant1; + uint16_t us_and_e; + } ufc_reg[8]; +} usr_fcontext_t; + +#else /* This is LynxOS 5.x. */ + /* Floating point and SIMD register context */ typedef struct usr_fcontext { uint16_t ufc_control; @@ -87,6 +117,8 @@ typedef struct usr_fcontext { char ureserved[16][14]; } usr_fcontext_t; +#endif + /* The index of various registers inside the regcache. */ enum lynx_i386_gdb_regnum @@ -219,6 +251,7 @@ lynx_i386_fill_fpregset (struct regcache *regcache, char *buf) buf + offsetof (usr_fcontext_t, ufc_data_sel)); collect_register (regcache, I386_FOOFF_REGNUM, buf + offsetof (usr_fcontext_t, ufc_data_off)); +#if !defined(LYNXOS_178) collect_16bit_register (regcache, I386_FOP_REGNUM, buf + offsetof (usr_fcontext_t, ufc_opcode)); @@ -229,6 +262,7 @@ lynx_i386_fill_fpregset (struct regcache *regcache, char *buf) + i * sizeof (struct uxmm_register)); collect_register (regcache, I386_MXCSR_REGNUM, buf + offsetof (usr_fcontext_t, usse_mxcsr)); +#endif } /* This is the supply counterpart for collect_16bit_register: @@ -277,6 +311,7 @@ lynx_i386_store_fpregset (struct regcache *regcache, const char *buf) buf + offsetof (usr_fcontext_t, ufc_data_sel)); supply_register (regcache, I386_FOOFF_REGNUM, buf + offsetof (usr_fcontext_t, ufc_data_off)); +#if !defined(LYNXOS_178) supply_16bit_register (regcache, I386_FOP_REGNUM, buf + offsetof (usr_fcontext_t, ufc_opcode)); @@ -287,6 +322,7 @@ lynx_i386_store_fpregset (struct regcache *regcache, const char *buf) + i * sizeof (struct uxmm_register)); supply_register (regcache, I386_MXCSR_REGNUM, buf + offsetof (usr_fcontext_t, usse_mxcsr)); +#endif } /* Implements the lynx_target_ops.arch_setup routine. */ -- 2.1.4