diff options
author | Joel Brobecker <brobecker@adacore.com> | 2018-05-10 12:01:39 -0500 |
---|---|---|
committer | Joel Brobecker <brobecker@adacore.com> | 2018-05-10 13:01:39 -0400 |
commit | 55271bf969c2c09b98aecd97b36170fbf76c3fc4 (patch) | |
tree | 3e47af8afd8c7b550f58bc8a98165bf9114e8ecf /gdb/gdbserver | |
parent | 1a34f210bb9389e58d93caf4384800934fc7113a (diff) | |
download | gdb-55271bf969c2c09b98aecd97b36170fbf76c3fc4.zip gdb-55271bf969c2c09b98aecd97b36170fbf76c3fc4.tar.gz gdb-55271bf969c2c09b98aecd97b36170fbf76c3fc4.tar.bz2 |
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.
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/gdbserver/lynx-i386-low.c | 38 |
2 files changed, 46 insertions, 1 deletions
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 <brobecker@adacore.com> + + * 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 <tom@tromey.com> * 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. */ |