home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / gdb-4.12-src.lha / GNU / src / amiga / gdb-4.12 / gdb / irix5-nat.c < prev    next >
C/C++ Source or Header  |  1994-02-03  |  29KB  |  1,073 lines

  1. /* Native support for the SGI Iris running IRIX version 5, for GDB.
  2.    Copyright 1988, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
  3.    Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
  4.    and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
  5.    Implemented for Irix 4.x by Garrett A. Wollman.
  6.    Modified for Irix 5.x by Ian Lance Taylor.
  7.  
  8. This file is part of GDB.
  9.  
  10. This program is free software; you can redistribute it and/or modify
  11. it under the terms of the GNU General Public License as published by
  12. the Free Software Foundation; either version 2 of the License, or
  13. (at your option) any later version.
  14.  
  15. This program is distributed in the hope that it will be useful,
  16. but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. GNU General Public License for more details.
  19.  
  20. You should have received a copy of the GNU General Public License
  21. along with this program; if not, write to the Free Software
  22. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  23.  
  24. #include "defs.h"
  25. #include "inferior.h"
  26. #include "gdbcore.h"
  27. #include "target.h"
  28.  
  29. #include <sys/time.h>
  30. #include <sys/procfs.h>
  31. #include <setjmp.h>        /* For JB_XXX.  */
  32.  
  33. /* Size of elements in jmpbuf */
  34.  
  35. #define JB_ELEMENT_SIZE 4
  36.  
  37. /*
  38.  * See the comment in m68k-tdep.c regarding the utility of these functions.
  39.  *
  40.  * These definitions are from the MIPS SVR4 ABI, so they may work for
  41.  * any MIPS SVR4 target.
  42.  */
  43.  
  44. void 
  45. supply_gregset (gregsetp)
  46.      gregset_t *gregsetp;
  47. {
  48.   register int regi;
  49.   register greg_t *regp = &(*gregsetp)[0];
  50.  
  51.   for(regi = 0; regi <= CTX_RA; regi++)
  52.     supply_register (regi, (char *)(regp + regi));
  53.  
  54.   supply_register (PC_REGNUM, (char *)(regp + CTX_EPC));
  55.   supply_register (HI_REGNUM, (char *)(regp + CTX_MDHI));
  56.   supply_register (LO_REGNUM, (char *)(regp + CTX_MDLO));
  57.   supply_register (CAUSE_REGNUM, (char *)(regp + CTX_CAUSE));
  58. }
  59.  
  60. void
  61. fill_gregset (gregsetp, regno)
  62.      gregset_t *gregsetp;
  63.      int regno;
  64. {
  65.   int regi;
  66.   register greg_t *regp = &(*gregsetp)[0];
  67.  
  68.   for (regi = 0; regi <= CTX_RA; regi++)
  69.     if ((regno == -1) || (regno == regi))
  70.       *(regp + regi) = *(greg_t *) ®isters[REGISTER_BYTE (regi)];
  71.  
  72.   if ((regno == -1) || (regno == PC_REGNUM))
  73.     *(regp + CTX_EPC) = *(greg_t *) ®isters[REGISTER_BYTE (PC_REGNUM)];
  74.  
  75.   if ((regno == -1) || (regno == CAUSE_REGNUM))
  76.     *(regp + CTX_CAUSE) = *(greg_t *) ®isters[REGISTER_BYTE (PS_REGNUM)];
  77.  
  78.   if ((regno == -1) || (regno == HI_REGNUM))
  79.     *(regp + CTX_MDHI) = *(greg_t *) ®isters[REGISTER_BYTE (HI_REGNUM)];
  80.  
  81.   if ((regno == -1) || (regno == LO_REGNUM))
  82.     *(regp + CTX_MDLO) = *(greg_t *) ®isters[REGISTER_BYTE (LO_REGNUM)];
  83. }
  84.  
  85. /*
  86.  * Now we do the same thing for floating-point registers.
  87.  * We don't bother to condition on FP0_REGNUM since any
  88.  * reasonable MIPS configuration has an R3010 in it.
  89.  *
  90.  * Again, see the comments in m68k-tdep.c.
  91.  */
  92.  
  93. void
  94. supply_fpregset (fpregsetp)
  95.      fpregset_t *fpregsetp;
  96. {
  97.   register int regi;
  98.  
  99.   for (regi = 0; regi < 32; regi++)
  100.     supply_register (FP0_REGNUM + regi,
  101.              (char *)&fpregsetp->fp_r.fp_regs[regi]);
  102.  
  103.   supply_register (FCRCS_REGNUM, (char *)&fpregsetp->fp_csr);
  104.  
  105.   /* FIXME: how can we supply FCRIR_REGNUM?  SGI doesn't tell us. */
  106. }
  107.  
  108. void
  109. fill_fpregset (fpregsetp, regno)
  110.      fpregset_t *fpregsetp;
  111.      int regno;
  112. {
  113.   int regi;
  114.   char *from, *to;
  115.  
  116.   for (regi = FP0_REGNUM; regi < FP0_REGNUM + 32; regi++)
  117.     {
  118.       if ((regno == -1) || (regno == regi))
  119.     {
  120.       from = (char *) ®isters[REGISTER_BYTE (regi)];
  121.       to = (char *) &(fpregsetp->fp_r.fp_regs[regi - FP0_REGNUM]);
  122.       memcpy(to, from, REGISTER_RAW_SIZE (regi));
  123.     }
  124.     }
  125.  
  126.   if ((regno == -1) || (regno == FCRCS_REGNUM))
  127.     fpregsetp->fp_csr = *(unsigned *) ®isters[REGISTER_BYTE(FCRCS_REGNUM)];
  128. }
  129.  
  130.  
  131. /* Figure out where the longjmp will land.
  132.    We expect the first arg to be a pointer to the jmp_buf structure from which
  133.    we extract the pc (JB_PC) that we will land at.  The pc is copied into PC.
  134.    This routine returns true on success. */
  135.  
  136. int
  137. get_longjmp_target (pc)
  138.      CORE_ADDR *pc;
  139. {
  140.   char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
  141.   CORE_ADDR jb_addr;
  142.  
  143.   jb_addr = read_register (A0_REGNUM);
  144.  
  145.   if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
  146.               TARGET_PTR_BIT / TARGET_CHAR_BIT))
  147.     return 0;
  148.  
  149.   *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
  150.  
  151.   return 1;
  152. }
  153.  
  154. void
  155. fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
  156.      char *core_reg_sect;
  157.      unsigned core_reg_size;
  158.      int which;            /* Unused */
  159.      unsigned int reg_addr;    /* Unused */
  160. {
  161.   if (core_reg_size != REGISTER_BYTES)
  162.     {
  163.       warning ("wrong size gregset struct in core file");
  164.       return;
  165.     }
  166.  
  167.   memcpy ((char *)registers, core_reg_sect, core_reg_size);
  168. }
  169.  
  170. /* Irix 5 uses what appears to be a unique form of shared library
  171.    support.  This is a copy of solib.c modified for Irix 5.  */
  172.  
  173. #include <sys/types.h>
  174. #include <signal.h>
  175. #include <string.h>
  176. #include <sys/param.h>
  177. #include <fcntl.h>
  178.  
  179. /* <obj.h> includes <sym.h> and <symconst.h>, which causes conflicts
  180.    with our versions of those files included by tm-mips.h.  Prevent
  181.    <obj.h> from including them with some appropriate defines.  */
  182. #define __SYM_H__
  183. #define __SYMCONST_H__
  184. #include <obj.h>
  185.  
  186. #include "symtab.h"
  187. #include "bfd.h"
  188. #include "symfile.h"
  189. #include "objfiles.h"
  190. #include "command.h"
  191. #include "frame.h"
  192. #include "regex.h"
  193. #include "inferior.h"
  194. #include "language.h"
  195.  
  196. /* We need to set a breakpoint at a point when we know that the
  197.    mapping of shared libraries is complete.  dbx simply breaks at main
  198.    (or, for FORTRAN, MAIN__), so we do the same.  We can not break at
  199.    the very beginning of main, because the startup code will jump into
  200.    main after the GP initialization instructions.  SOLIB_BKPT_OFFSET
  201.    is used to skip those instructions.  */
  202.  
  203. #define SOLIB_BKPT_OFFSET 12
  204.  
  205. static char *bkpt_names[] = {
  206.   "main",
  207.   "MAIN__",
  208.   NULL
  209. };
  210.  
  211. /* The symbol which starts off the list of shared libraries.  */
  212. #define DEBUG_BASE "__rld_obj_head"
  213.  
  214. /* How to get the loaded address of a shared library.  */
  215. #define LM_ADDR(so) ((so)->lm.o_base_address)
  216.  
  217. char shadow_contents[BREAKPOINT_MAX];    /* Stash old bkpt addr contents */
  218.  
  219. extern CORE_ADDR sigtramp_address, sigtramp_end;
  220.  
  221. struct so_list {
  222.   struct so_list *next;            /* next structure in linked list */
  223.   struct obj_list ll;
  224.   struct obj lm;            /* copy of link map from inferior */
  225.   struct obj_list *lladdr;        /* addr in inferior lm was read from */
  226.   CORE_ADDR lmend;            /* upper addr bound of mapped object */
  227.   char symbols_loaded;            /* flag: symbols read in yet? */
  228.   char from_tty;            /* flag: print msgs? */
  229.   struct objfile *objfile;        /* objfile for loaded lib */
  230.   struct section_table *sections;
  231.   struct section_table *sections_end;
  232.   struct section_table *textsection;
  233.   bfd *abfd;
  234. };
  235.  
  236. static struct so_list *so_list_head;    /* List of known shared objects */
  237. static CORE_ADDR debug_base;        /* Base of dynamic linker structures */
  238. static CORE_ADDR breakpoint_addr;    /* Address where end bkpt is set */
  239.  
  240. /* Local function prototypes */
  241.  
  242. static void
  243. sharedlibrary_command PARAMS ((char *, int));
  244.  
  245. static int
  246. enable_break PARAMS ((void));
  247.  
  248. static int
  249. disable_break PARAMS ((void));
  250.  
  251. static void
  252. info_sharedlibrary_command PARAMS ((char *, int));
  253.  
  254. static int
  255. symbol_add_stub PARAMS ((char *));
  256.  
  257. static struct so_list *
  258. find_solib PARAMS ((struct so_list *));
  259.  
  260. static struct obj_list *
  261. first_link_map_member PARAMS ((void));
  262.  
  263. static CORE_ADDR
  264. locate_base PARAMS ((void));
  265.  
  266. static void
  267. solib_map_sections PARAMS ((struct so_list *));
  268.  
  269. /*
  270.  
  271. LOCAL FUNCTION
  272.  
  273.     solib_map_sections -- open bfd and build sections for shared lib
  274.  
  275. SYNOPSIS
  276.  
  277.     static void solib_map_sections (struct so_list *so)
  278.  
  279. DESCRIPTION
  280.  
  281.     Given a pointer to one of the shared objects in our list
  282.     of mapped objects, use the recorded name to open a bfd
  283.     descriptor for the object, build a section table, and then
  284.     relocate all the section addresses by the base address at
  285.     which the shared object was mapped.
  286.  
  287. FIXMES
  288.  
  289.     In most (all?) cases the shared object file name recorded in the
  290.     dynamic linkage tables will be a fully qualified pathname.  For
  291.     cases where it i