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 36915cf736..5e7ea108b5 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 37c0dc9747..a8817b4151 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. */