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:
parent
1a34f210bb
commit
55271bf969
2 changed files with 46 additions and 1 deletions
|
@ -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.
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue