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.
This commit is contained in:
Joel Brobecker 2018-05-10 12:01:39 -05:00
parent 1a34f210bb
commit 55271bf969
2 changed files with 46 additions and 1 deletions

View File

@ -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.

View File

@ -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. */