diff options
Diffstat (limited to 'gdb/gdbserver/lynx-i386-low.c')
-rw-r--r-- | gdb/gdbserver/lynx-i386-low.c | 38 |
1 files changed, 37 insertions, 1 deletions
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. */ |