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