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)); \