home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / gnu / gdb-4.14-src.lha / gdb-4.14 / gdb / alpha-nat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-12  |  5.9 KB  |  216 lines

  1. /* Low level Alpha interface, for GDB when running native.
  2.    Copyright 1993, 1995 Free Software Foundation, Inc.
  3.  
  4. This file is part of GDB.
  5.  
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "defs.h"
  21. #include "inferior.h"
  22. #include "gdbcore.h"
  23. #include "target.h"
  24. #include <sys/ptrace.h>
  25. #include <machine/reg.h>
  26.  
  27. /* Size of elements in jmpbuf */
  28.  
  29. #define JB_ELEMENT_SIZE 8
  30.  
  31. /* The definition for JB_PC in machine/reg.h is wrong.
  32.    And we can't get at the correct definition in setjmp.h as it is
  33.    not always available (eg. if _POSIX_SOURCE is defined which is the
  34.    default). As the defintion is unlikely to change (see comment
  35.    in <setjmp.h>, define the correct value here.  */
  36.  
  37. #undef JB_PC
  38. #define JB_PC 2
  39.  
  40. /* Figure out where the longjmp will land.
  41.    We expect the first arg to be a pointer to the jmp_buf structure from which
  42.    we extract the pc (JB_PC) that we will land at.  The pc is copied into PC.
  43.    This routine returns true on success. */
  44.  
  45. int
  46. get_longjmp_target (pc)
  47.      CORE_ADDR *pc;
  48. {
  49.   CORE_ADDR jb_addr;
  50.   char raw_buffer[MAX_REGISTER_RAW_SIZE];
  51.  
  52.   jb_addr = read_register(A0_REGNUM);
  53.  
  54.   if (target_read_memory(jb_addr + JB_PC * JB_ELEMENT_SIZE, raw_buffer,
  55.              sizeof(CORE_ADDR)))
  56.     return 0;
  57.  
  58.   *pc = extract_address (raw_buffer, sizeof(CORE_ADDR));
  59.   return 1;
  60. }
  61.  
  62. /* Extract the register values out of the core file and store
  63.    them where `read_register' will find them.
  64.  
  65.    CORE_REG_SECT points to the register values themselves, read into memory.
  66.    CORE_REG_SIZE is the size of that area.
  67.    WHICH says which set of registers we are handling (0 = int, 2 = float
  68.          on machines where they are discontiguous).
  69.    REG_ADDR is the offset from u.u_ar0 to the register values relative to
  70.             core_reg_sect.  This is used with old-fashioned core files to
  71.         locate the registers in a large upage-plus-stack ".reg" section.
  72.         Original upage address X is at location core_reg_sect+x+reg_addr.
  73.  */
  74.  
  75. void
  76. fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
  77.      char *core_reg_sect;
  78.      unsigned core_reg_size;
  79.      int which;
  80.      unsigned reg_addr;
  81. {
  82.   register int regno;
  83.   register int addr;
  84.   int bad_reg = -1;
  85.  
  86.   /* Table to map a gdb regnum to an index in the core register section.
  87.      The floating point register values are garbage in OSF/1.2 core files.  */
  88.   static int core_reg_mapping[NUM_REGS] =
  89.   {
  90. #define EFL (EF_SIZE / 8)
  91.     EF_V0,    EF_T0,    EF_T1,    EF_T2,    EF_T3,    EF_T4,    EF_T5,    EF_T6,
  92.     EF_T7,    EF_S0,    EF_S1,    EF_S2,    EF_S3,    EF_S4,    EF_S5,    EF_S6,
  93.     EF_A0,    EF_A1,    EF_A2,    EF_A3,    EF_A4,    EF_A5,    EF_T8,    EF_T9,
  94.     EF_T10,    EF_T11,    EF_RA,    EF_T12,    EF_AT,    EF_GP,    EF_SP,    -1,
  95.     EFL+0,    EFL+1,    EFL+2,    EFL+3,    EFL+4,    EFL+5,    EFL+6,    EFL+7,
  96.     EFL+8,    EFL+9,    EFL+10,    EFL+11,    EFL+12,    EFL+13,    EFL+14,    EFL+15,
  97.     EFL+16,    EFL+17,    EFL+18,    EFL+19,    EFL+20,    EFL+21,    EFL+22,    EFL+23,
  98.     EFL+24,    EFL+25,    EFL+26,    EFL+27,    EFL+28,    EFL+29,    EFL+30,    EFL+31,
  99.     EF_PC,    -1
  100.   };
  101.   static char zerobuf[MAX_REGISTER_RAW_SIZE] = {0};
  102.  
  103.   for (regno = 0; regno < NUM_REGS; regno++)
  104.     {
  105.       if (CANNOT_FETCH_REGISTER (regno))
  106.     {
  107.       supply_register (regno, zerobuf);
  108.       continue;
  109.     }
  110.       addr = 8 * core_reg_mapping[regno];
  111.       if (addr < 0 || addr >= core_reg_size)
  112.     {
  113.       if (bad_reg < 0)
  114.         bad_reg = regno;
  115.     }
  116.       else
  117.     {
  118.       supply_register (regno, core_reg_sect + addr);
  119.     }
  120.     }
  121.   if (bad_reg >= 0)
  122.     {
  123.       error ("Register %s not found in core file.", reg_names[bad_reg]);
  124.     }
  125. }
  126.  
  127. /* Map gdb internal register number to a ptrace ``address''.
  128.    These ``addresses'' are defined in <sys/ptrace.h> */
  129.  
  130. #define REGISTER_PTRACE_ADDR(regno) \
  131.    (regno < FP0_REGNUM ?     GPR_BASE + (regno) \
  132.   : regno == PC_REGNUM ?    PC    \
  133.   : regno >= FP0_REGNUM ?    FPR_BASE + ((regno) - FP0_REGNUM) \
  134.   : 0)
  135.  
  136. /* Return the ptrace ``address'' of register REGNO. */
  137.  
  138. unsigned int
  139. register_addr (regno, blockend)
  140.      int regno;
  141.      int blockend;
  142. {
  143.   return REGISTER_PTRACE_ADDR (regno);
  144. }
  145.  
  146. #ifdef USE_PROC_FS
  147. #include <sys/procfs.h>
  148.  
  149. /*
  150.  * See the comment in m68k-tdep.c regarding the utility of these functions.
  151.  */
  152.  
  153. void 
  154. supply_gregset (gregsetp)
  155.      gregset_t *gregsetp;
  156. {
  157.   register int regi;
  158.   register long *regp = gregsetp->regs;
  159.  
  160.   for (regi = 0; regi < 31; regi++)
  161.     supply_register (regi, (char *)(regp + regi));
  162.  
  163.   supply_register (PC_REGNUM, (char *)(regp + 31));
  164. }
  165.  
  166. void
  167. fill_gregset (gregsetp, regno)
  168.      gregset_t *gregsetp;
  169.      int regno;
  170. {
  171.   int regi;
  172.   register long *regp = gregsetp->regs;
  173.  
  174.   for (regi = 0; regi < 31; regi++)
  175.     if ((regno == -1) || (regno == regi))
  176.       *(regp + regi) = *(long *) ®isters[REGISTER_BYTE (regi)];
  177.  
  178.   if ((regno == -1) || (regno == PC_REGNUM))
  179.     *(regp + 31) = *(long *) ®isters[REGISTER_BYTE (PC_REGNUM)];
  180. }
  181.  
  182. /*
  183.  * Now we do the same thing for floating-point registers.
  184.  * Again, see the comments in m68k-tdep.c.
  185.  */
  186.  
  187. void
  188. supply_fpregset (fpregsetp)
  189.      fpregset_t *fpregsetp;
  190. {
  191.   register int regi;
  192.   register long *regp = fpregsetp->regs;
  193.  
  194.   for (regi = 0; regi < 32; regi++)
  195.     supply_register (regi + FP0_REGNUM, (char *)(regp + regi));
  196. }
  197.  
  198. void
  199. fill_fpregset (fpregsetp, regno)
  200.      fpregset_t *fpregsetp;
  201.      int regno;
  202. {
  203.   int regi;
  204.   register long *regp = fpregsetp->regs;
  205.  
  206.   for (regi = FP0_REGNUM; regi < FP0_REGNUM + 32; regi++)
  207.     {
  208.       if ((regno == -1) || (regno == regi))
  209.     {
  210.       *(regp + regi - FP0_REGNUM) =
  211.         *(long *) ®isters[REGISTER_BYTE (regi)];
  212.     }
  213.     }
  214. }
  215. #endif
  216.