[gnu.gdb.bug] better support for isi and sun3 w/o fpu

adam@UUNET.UU.NET (Adam de Boor) (08/12/89)

Enclosed please find modifications to the isi and sun3 configuration files to
better support (i.e. w/o core dumps) non-fpu systems. My impression that these
form the bulk of the systems sun and isi distribute, but that could be my
own skewed perspective of the world.

The changes to m-isi.h are to be applied to the file I assigned to the FSF
last month. The changes to m-sun3.h are missing one change that I made
in the 3.1 config file and transfered to the 3.2 before I placed the thing
under RCS. The change is the alter the number of registers, as:

#ifdef HAVEFPU
#define NUM_REGS 31
#else
#define NUM_REGS 18
#endif

"patch" will reject one of the patches for this file because it caught the
leading edge of this change. The patch contains a comment explaining the choice
of "HAVEFPU" and the reason for the reduction.

With these patches, I am now able (yea!) to call functions in the inferior,
much to my delight.

a


*** /tmp/,RCSt1a27965	Fri Aug 11 23:04:15 1989
--- m-isi.h	Fri Aug 11 23:03:56 1989
***************
*** 464,469 ****
--- 464,478 ----
  
  /* Push an empty stack frame, to record the current PC, etc.  */
  
+ #ifdef ISI68881
+ #define PUSH_FP_REGS \
+   for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)		\
+     { read_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12);	\
+       sp = push_bytes (sp, raw_buffer, 12); }
+ #else
+ #define PUSH_FP_REGS
+ #endif
+ 
  #define PUSH_DUMMY_FRAME \
  { register CORE_ADDR sp = read_register (SP_REGNUM);			\
    register int regnum;							\
***************
*** 471,479 ****
    sp = push_word (sp, read_register (PC_REGNUM));			\
    sp = push_word (sp, read_register (FP_REGNUM));			\
    write_register (FP_REGNUM, sp);					\
!   for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)		\
!     { read_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12);	\
!       sp = push_bytes (sp, raw_buffer, 12); }				\
    for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)			\
      sp = push_word (sp, read_register (regnum));			\
    sp = push_word (sp, read_register (PS_REGNUM));			\
--- 480,486 ----
    sp = push_word (sp, read_register (PC_REGNUM));			\
    sp = push_word (sp, read_register (FP_REGNUM));			\
    write_register (FP_REGNUM, sp);					\
!   PUSH_FP_REGS								\
    for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)			\
      sp = push_word (sp, read_register (regnum));			\
    sp = push_word (sp, read_register (PS_REGNUM));			\
***************
*** 481,486 ****
--- 488,503 ----
  
  /* Discard from the stack the innermost frame, restoring all registers.  */
  
+ #ifdef ISI68881
+ #define POP_FP_REGS \
+   for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)		\
+     if (fsr.regs[regnum])						\
+       { read_memory (fsr.regs[regnum], raw_buffer, 12);			\
+         write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12); }
+ #else
+ #define POP_FP_REGS
+ #endif
+ 
  #define POP_FRAME  \
  { register FRAME frame = get_current_frame ();			 	\
    register CORE_ADDR fp;					 	\
***************
*** 491,500 ****
    fi = get_frame_info (frame);					 	\
    fp = fi->frame;						 	\
    get_frame_saved_regs (fi, &fsr);					\
!   for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)		\
!     if (fsr.regs[regnum])						\
!       { read_memory (fsr.regs[regnum], raw_buffer, 12);			\
!         write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12); }\
    for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)			\
      if (fsr.regs[regnum])						\
        write_register (regnum, read_memory_integer (fsr.regs[regnum], 4)); \
--- 508,514 ----
    fi = get_frame_info (frame);					 	\
    fp = fi->frame;						 	\
    get_frame_saved_regs (fi, &fsr);					\
!   POP_FP_REGS								\
    for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)			\
      if (fsr.regs[regnum])						\
        write_register (regnum, read_memory_integer (fsr.regs[regnum], 4)); \

*** /tmp/,RCSt1a27965	Fri Aug 11 23:04:20 1989
--- m-sun3.h	Fri Aug 11 23:04:03 1989
***************
*** 101,107 ****
  
  #define REGISTER_TYPE long
  
! /* Number of machine registers */
  
  #ifdef HAVEFPU
  #define NUM_REGS 31
--- 101,112 ----
  
  #define REGISTER_TYPE long
  
! /* Number of machine registers
!    If HAVEFPU not defined, no floating-point coprocessor is assumed to exist.
!    We reduce the number of registers to avoid fetching and trying to convert
!    any of the fp registers, since convert_to_68881 and convert_from_68881
!    will cause us to die if they are executed. I'm assuming that most
!    suns don't come with an FPU, hence the default is no FPU */
  
  #ifdef HAVEFPU
  #define NUM_REGS 31
***************
*** 389,394 ****
--- 394,408 ----
  
  /* Push an empty stack frame, to record the current PC, etc.  */
  
+ #ifdef HAVEFPU
+ #define PUSH_FP_REGS \
+   for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)		\
+     { read_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12);	\
+       sp = push_bytes (sp, raw_buffer, 12); }
+ #else
+ #define PUSH_FP_REGS
+ #endif
+ 
  #define PUSH_DUMMY_FRAME \
  { register CORE_ADDR sp = read_register (SP_REGNUM);			\
    register int regnum;							\
***************
*** 396,404 ****
    sp = push_word (sp, read_register (PC_REGNUM));			\
    sp = push_word (sp, read_register (FP_REGNUM));			\
    write_register (FP_REGNUM, sp);					\
!   for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)		\
!     { read_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12);	\
!       sp = push_bytes (sp, raw_buffer, 12); }				\
    for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)			\
      sp = push_word (sp, read_register (regnum));			\
    sp = push_word (sp, read_register (PS_REGNUM));			\
--- 410,416 ----
    sp = push_word (sp, read_register (PC_REGNUM));			\
    sp = push_word (sp, read_register (FP_REGNUM));			\
    write_register (FP_REGNUM, sp);					\
!   PUSH_FP_REGS								\
    for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)			\
      sp = push_word (sp, read_register (regnum));			\
    sp = push_word (sp, read_register (PS_REGNUM));			\
***************
*** 407,412 ****
--- 419,434 ----
  /* Discard from the stack the innermost frame, 
     restoring all saved registers.  */
  
+ #ifdef HAVEFPU
+ #define POP_FP_REGS \
+   for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)		\
+     if (fsr.regs[regnum])						\
+       { read_memory (fsr.regs[regnum], raw_buffer, 12);			\
+         write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12); }
+ #else
+ #define POP_FP_REGS
+ #endif
+ 
  #define POP_FRAME  \
  { register FRAME frame = get_current_frame ();				\
    register CORE_ADDR fp;						\
***************
*** 417,426 ****
    fi = get_frame_info (frame);						\
    fp = fi->frame;							\
    get_frame_saved_regs (fi, &fsr);					\
!   for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)		\
!     if (fsr.regs[regnum])						\
!       { read_memory (fsr.regs[regnum], raw_buffer, 12);			\
!         write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12); }\
    for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)			\
      if (fsr.regs[regnum])						\
        write_register (regnum, read_memory_integer (fsr.regs[regnum], 4)); \
--- 439,445 ----
    fi = get_frame_info (frame);						\
    fp = fi->frame;							\
    get_frame_saved_regs (fi, &fsr);					\
!   POP_FP_REGS								\
    for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)			\
      if (fsr.regs[regnum])						\
        write_register (regnum, read_memory_integer (fsr.regs[regnum], 4)); \