1 /* Target-dependent code for GNU/Linux on MIPS processors.
2 
3    Copyright 2001, 2002, 2004 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21 
22 #include "defs.h"
23 #include "gdbcore.h"
24 #include "target.h"
25 #include "solib-svr4.h"
26 #include "osabi.h"
27 #include "mips-tdep.h"
28 #include "gdb_string.h"
29 #include "gdb_assert.h"
30 #include "frame.h"
31 #include "trad-frame.h"
32 #include "tramp-frame.h"
33 
34 /* Copied from <asm/elf.h>.  */
35 #define ELF_NGREG       45
36 #define ELF_NFPREG      33
37 
38 typedef unsigned char elf_greg_t[4];
39 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
40 
41 typedef unsigned char elf_fpreg_t[8];
42 typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
43 
44 /* 0 - 31 are integer registers, 32 - 63 are fp registers.  */
45 #define FPR_BASE        32
46 #define PC              64
47 #define CAUSE           65
48 #define BADVADDR        66
49 #define MMHI            67
50 #define MMLO            68
51 #define FPC_CSR         69
52 #define FPC_EIR         70
53 
54 #define EF_REG0			6
55 #define EF_REG31		37
56 #define EF_LO			38
57 #define EF_HI			39
58 #define EF_CP0_EPC		40
59 #define EF_CP0_BADVADDR		41
60 #define EF_CP0_STATUS		42
61 #define EF_CP0_CAUSE		43
62 
63 #define EF_SIZE			180
64 
65 /* Figure out where the longjmp will land.
66    We expect the first arg to be a pointer to the jmp_buf structure from
67    which we extract the pc (MIPS_LINUX_JB_PC) that we will land at.  The pc
68    is copied into PC.  This routine returns 1 on success.  */
69 
70 #define MIPS_LINUX_JB_ELEMENT_SIZE 4
71 #define MIPS_LINUX_JB_PC 0
72 
73 static int
74 mips_linux_get_longjmp_target (CORE_ADDR *pc)
75 {
76   CORE_ADDR jb_addr;
77   char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
78 
79   jb_addr = read_register (A0_REGNUM);
80 
81   if (target_read_memory (jb_addr
82 			  + MIPS_LINUX_JB_PC * MIPS_LINUX_JB_ELEMENT_SIZE,
83 			  buf, TARGET_PTR_BIT / TARGET_CHAR_BIT))
84     return 0;
85 
86   *pc = extract_unsigned_integer (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
87 
88   return 1;
89 }
90 
91 /* Transform the bits comprising a 32-bit register to the right size
92    for regcache_raw_supply().  This is needed when mips_isa_regsize()
93    is 8.  */
94 
95 static void
96 supply_32bit_reg (int regnum, const void *addr)
97 {
98   char buf[MAX_REGISTER_SIZE];
99   store_signed_integer (buf, register_size (current_gdbarch, regnum),
100                         extract_signed_integer (addr, 4));
101   regcache_raw_supply (current_regcache, regnum, buf);
102 }
103 
104 /* Unpack an elf_gregset_t into GDB's register cache.  */
105 
106 void
107 supply_gregset (elf_gregset_t *gregsetp)
108 {
109   int regi;
110   elf_greg_t *regp = *gregsetp;
111   char zerobuf[MAX_REGISTER_SIZE];
112 
113   memset (zerobuf, 0, MAX_REGISTER_SIZE);
114 
115   for (regi = EF_REG0; regi <= EF_REG31; regi++)
116     supply_32bit_reg ((regi - EF_REG0), (char *)(regp + regi));
117 
118   supply_32bit_reg (mips_regnum (current_gdbarch)->lo,
119 		    (char *)(regp + EF_LO));
120   supply_32bit_reg (mips_regnum (current_gdbarch)->hi,
121 		    (char *)(regp + EF_HI));
122 
123   supply_32bit_reg (mips_regnum (current_gdbarch)->pc,
124 		    (char *)(regp + EF_CP0_EPC));
125   supply_32bit_reg (mips_regnum (current_gdbarch)->badvaddr,
126 		    (char *)(regp + EF_CP0_BADVADDR));
127   supply_32bit_reg (PS_REGNUM, (char *)(regp + EF_CP0_STATUS));
128   supply_32bit_reg (mips_regnum (current_gdbarch)->cause,
129 		    (char *)(regp + EF_CP0_CAUSE));
130 
131   /* Fill inaccessible registers with zero.  */
132   regcache_raw_supply (current_regcache, UNUSED_REGNUM, zerobuf);
133   for (regi = FIRST_EMBED_REGNUM; regi < LAST_EMBED_REGNUM; regi++)
134     regcache_raw_supply (current_regcache, regi, zerobuf);
135 }
136 
137 /* Pack our registers (or one register) into an elf_gregset_t.  */
138 
139 void
140 fill_gregset (elf_gregset_t *gregsetp, int regno)
141 {
142   int regaddr, regi;
143   elf_greg_t *regp = *gregsetp;
144   void *dst;
145 
146   if (regno == -1)
147     {
148       memset (regp, 0, sizeof (elf_gregset_t));
149       for (regi = 0; regi < 32; regi++)
150         fill_gregset (gregsetp, regi);
151       fill_gregset (gregsetp, mips_regnum (current_gdbarch)->lo);
152       fill_gregset (gregsetp, mips_regnum (current_gdbarch)->hi);
153       fill_gregset (gregsetp, mips_regnum (current_gdbarch)->pc);
154       fill_gregset (gregsetp, mips_regnum (current_gdbarch)->badvaddr);
155       fill_gregset (gregsetp, PS_REGNUM);
156       fill_gregset (gregsetp, mips_regnum (current_gdbarch)->cause);
157 
158       return;
159    }
160 
161   if (regno < 32)
162     {
163       dst = regp + regno + EF_REG0;
164       regcache_raw_collect (current_regcache, regno, dst);
165       return;
166     }
167 
168   if (regno == mips_regnum (current_gdbarch)->lo)
169     regaddr = EF_LO;
170   else if (regno == mips_regnum (current_gdbarch)->hi)
171     regaddr = EF_HI;
172   else if (regno == mips_regnum (current_gdbarch)->pc)
173     regaddr = EF_CP0_EPC;
174   else if (regno == mips_regnum (current_gdbarch)->badvaddr)
175     regaddr = EF_CP0_BADVADDR;
176   else if (regno == PS_REGNUM)
177     regaddr = EF_CP0_STATUS;
178   else if (regno == mips_regnum (current_gdbarch)->cause)
179     regaddr = EF_CP0_CAUSE;
180   else
181     regaddr = -1;
182 
183   if (regaddr != -1)
184     {
185       dst = regp + regaddr;
186       regcache_raw_collect (current_regcache, regno, dst);
187     }
188 }
189 
190 /* Likewise, unpack an elf_fpregset_t.  */
191 
192 void
193 supply_fpregset (elf_fpregset_t *fpregsetp)
194 {
195   int regi;
196   char zerobuf[MAX_REGISTER_SIZE];
197 
198   memset (zerobuf, 0, MAX_REGISTER_SIZE);
199 
200   for (regi = 0; regi < 32; regi++)
201     regcache_raw_supply (current_regcache, FP0_REGNUM + regi,
202 			 (char *)(*fpregsetp + regi));
203 
204   regcache_raw_supply (current_regcache,
205 		       mips_regnum (current_gdbarch)->fp_control_status,
206 		       (char *)(*fpregsetp + 32));
207 
208   /* FIXME: how can we supply FCRIR?  The ABI doesn't tell us. */
209   regcache_raw_supply (current_regcache,
210 		       mips_regnum (current_gdbarch)->fp_implementation_revision,
211 		       zerobuf);
212 }
213 
214 /* Likewise, pack one or all floating point registers into an
215    elf_fpregset_t.  */
216 
217 void
218 fill_fpregset (elf_fpregset_t *fpregsetp, int regno)
219 {
220   char *from, *to;
221 
222   if ((regno >= FP0_REGNUM) && (regno < FP0_REGNUM + 32))
223     {
224       from = (char *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)];
225       to = (char *) (*fpregsetp + regno - FP0_REGNUM);
226       memcpy (to, from, register_size (current_gdbarch, regno - FP0_REGNUM));
227     }
228   else if (regno == mips_regnum (current_gdbarch)->fp_control_status)
229     {
230       from = (char *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)];
231       to = (char *) (*fpregsetp + 32);
232       memcpy (to, from, register_size (current_gdbarch, regno));
233     }
234   else if (regno == -1)
235     {
236       int regi;
237 
238       for (regi = 0; regi < 32; regi++)
239 	fill_fpregset (fpregsetp, FP0_REGNUM + regi);
240       fill_fpregset(fpregsetp, mips_regnum (current_gdbarch)->fp_control_status);
241     }
242 }
243 
244 /* Map gdb internal register number to ptrace ``address''.
245    These ``addresses'' are normally defined in <asm/ptrace.h>.  */
246 
247 static CORE_ADDR
248 mips_linux_register_addr (int regno, CORE_ADDR blockend)
249 {
250   int regaddr;
251 
252   if (regno < 0 || regno >= NUM_REGS)
253     error ("Bogon register number %d.", regno);
254 
255   if (regno < 32)
256     regaddr = regno;
257   else if ((regno >= mips_regnum (current_gdbarch)->fp0)
258 	   && (regno < mips_regnum (current_gdbarch)->fp0 + 32))
259     regaddr = FPR_BASE + (regno - mips_regnum (current_gdbarch)->fp0);
260   else if (regno == mips_regnum (current_gdbarch)->pc)
261     regaddr = PC;
262   else if (regno == mips_regnum (current_gdbarch)->cause)
263     regaddr = CAUSE;
264   else if (regno == mips_regnum (current_gdbarch)->badvaddr)
265     regaddr = BADVADDR;
266   else if (regno == mips_regnum (current_gdbarch)->lo)
267     regaddr = MMLO;
268   else if (regno == mips_regnum (current_gdbarch)->hi)
269     regaddr = MMHI;
270   else if (regno == mips_regnum (current_gdbarch)->fp_control_status)
271     regaddr = FPC_CSR;
272   else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision)
273     regaddr = FPC_EIR;
274   else
275     error ("Unknowable register number %d.", regno);
276 
277   return regaddr;
278 }
279 
280 
281 /* Fetch (and possibly build) an appropriate link_map_offsets
282    structure for native GNU/Linux MIPS targets using the struct offsets
283    defined in link.h (but without actual reference to that file).
284 
285    This makes it possible to access GNU/Linux MIPS shared libraries from a
286    GDB that was built on a different host platform (for cross debugging).  */
287 
288 static struct link_map_offsets *
289 mips_linux_svr4_fetch_link_map_offsets (void)
290 {
291   static struct link_map_offsets lmo;
292   static struct link_map_offsets *lmp = NULL;
293 
294   if (lmp == NULL)
295     {
296       lmp = &lmo;
297 
298       lmo.r_debug_size = 8;	/* The actual size is 20 bytes, but
299 				   this is all we need.  */
300       lmo.r_map_offset = 4;
301       lmo.r_map_size   = 4;
302 
303       lmo.link_map_size = 20;
304 
305       lmo.l_addr_offset = 0;
306       lmo.l_addr_size   = 4;
307 
308       lmo.l_name_offset = 4;
309       lmo.l_name_size   = 4;
310 
311       lmo.l_next_offset = 12;
312       lmo.l_next_size   = 4;
313 
314       lmo.l_prev_offset = 16;
315       lmo.l_prev_size   = 4;
316     }
317 
318   return lmp;
319 }
320 
321 /* Support for 64-bit ABIs.  */
322 
323 /* Copied from <asm/elf.h>.  */
324 #define MIPS64_ELF_NGREG       45
325 #define MIPS64_ELF_NFPREG      33
326 
327 typedef unsigned char mips64_elf_greg_t[8];
328 typedef mips64_elf_greg_t mips64_elf_gregset_t[MIPS64_ELF_NGREG];
329 
330 typedef unsigned char mips64_elf_fpreg_t[8];
331 typedef mips64_elf_fpreg_t mips64_elf_fpregset_t[MIPS64_ELF_NFPREG];
332 
333 /* 0 - 31 are integer registers, 32 - 63 are fp registers.  */
334 #define MIPS64_FPR_BASE                 32
335 #define MIPS64_PC                       64
336 #define MIPS64_CAUSE                    65
337 #define MIPS64_BADVADDR                 66
338 #define MIPS64_MMHI                     67
339 #define MIPS64_MMLO                     68
340 #define MIPS64_FPC_CSR                  69
341 #define MIPS64_FPC_EIR                  70
342 
343 #define MIPS64_EF_REG0			 0
344 #define MIPS64_EF_REG31			31
345 #define MIPS64_EF_LO			32
346 #define MIPS64_EF_HI			33
347 #define MIPS64_EF_CP0_EPC		34
348 #define MIPS64_EF_CP0_BADVADDR		35
349 #define MIPS64_EF_CP0_STATUS		36
350 #define MIPS64_EF_CP0_CAUSE		37
351 
352 #define MIPS64_EF_SIZE			304
353 
354 /* Figure out where the longjmp will land.
355    We expect the first arg to be a pointer to the jmp_buf structure from
356    which we extract the pc (MIPS_LINUX_JB_PC) that we will land at.  The pc
357    is copied into PC.  This routine returns 1 on success.  */
358 
359 /* Details about jmp_buf.  */
360 
361 #define MIPS64_LINUX_JB_PC 0
362 
363 static int
364 mips64_linux_get_longjmp_target (CORE_ADDR *pc)
365 {
366   CORE_ADDR jb_addr;
367   void *buf = alloca (TARGET_PTR_BIT / TARGET_CHAR_BIT);
368   int element_size = TARGET_PTR_BIT == 32 ? 4 : 8;
369 
370   jb_addr = read_register (A0_REGNUM);
371 
372   if (target_read_memory (jb_addr + MIPS64_LINUX_JB_PC * element_size,
373 			  buf, TARGET_PTR_BIT / TARGET_CHAR_BIT))
374     return 0;
375 
376   *pc = extract_unsigned_integer (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
377 
378   return 1;
379 }
380 
381 /* Unpack an elf_gregset_t into GDB's register cache.  */
382 
383 static void
384 mips64_supply_gregset (mips64_elf_gregset_t *gregsetp)
385 {
386   int regi;
387   mips64_elf_greg_t *regp = *gregsetp;
388   char zerobuf[MAX_REGISTER_SIZE];
389 
390   memset (zerobuf, 0, MAX_REGISTER_SIZE);
391 
392   for (regi = MIPS64_EF_REG0; regi <= MIPS64_EF_REG31; regi++)
393     regcache_raw_supply (current_regcache, (regi - MIPS64_EF_REG0),
394 			 (char *)(regp + regi));
395 
396   regcache_raw_supply (current_regcache, mips_regnum (current_gdbarch)->lo,
397 		       (char *)(regp + MIPS64_EF_LO));
398   regcache_raw_supply (current_regcache, mips_regnum (current_gdbarch)->hi,
399 		       (char *)(regp + MIPS64_EF_HI));
400 
401   regcache_raw_supply (current_regcache, mips_regnum (current_gdbarch)->pc,
402 		       (char *)(regp + MIPS64_EF_CP0_EPC));
403   regcache_raw_supply (current_regcache, mips_regnum (current_gdbarch)->badvaddr,
404 		       (char *)(regp + MIPS64_EF_CP0_BADVADDR));
405   regcache_raw_supply (current_regcache, PS_REGNUM,
406 		       (char *)(regp + MIPS64_EF_CP0_STATUS));
407   regcache_raw_supply (current_regcache, mips_regnum (current_gdbarch)->cause,
408 		       (char *)(regp + MIPS64_EF_CP0_CAUSE));
409 
410   /* Fill inaccessible registers with zero.  */
411   regcache_raw_supply (current_regcache, UNUSED_REGNUM, zerobuf);
412   for (regi = FIRST_EMBED_REGNUM; regi < LAST_EMBED_REGNUM; regi++)
413     regcache_raw_supply (current_regcache, regi, zerobuf);
414 }
415 
416 /* Pack our registers (or one register) into an elf_gregset_t.  */
417 
418 static void
419 mips64_fill_gregset (mips64_elf_gregset_t *gregsetp, int regno)
420 {
421   int regaddr, regi;
422   mips64_elf_greg_t *regp = *gregsetp;
423   void *src, *dst;
424 
425   if (regno == -1)
426     {
427       memset (regp, 0, sizeof (mips64_elf_gregset_t));
428       for (regi = 0; regi < 32; regi++)
429         mips64_fill_gregset (gregsetp, regi);
430       mips64_fill_gregset (gregsetp, mips_regnum (current_gdbarch)->lo);
431       mips64_fill_gregset (gregsetp, mips_regnum (current_gdbarch)->hi);
432       mips64_fill_gregset (gregsetp, mips_regnum (current_gdbarch)->pc);
433       mips64_fill_gregset (gregsetp, mips_regnum (current_gdbarch)->badvaddr);
434       mips64_fill_gregset (gregsetp, PS_REGNUM);
435       mips64_fill_gregset (gregsetp, mips_regnum (current_gdbarch)->cause);
436 
437       return;
438    }
439 
440   if (regno < 32)
441     {
442       dst = regp + regno + MIPS64_EF_REG0;
443       regcache_raw_collect (current_regcache, regno, dst);
444       return;
445     }
446 
447   if (regno == mips_regnum (current_gdbarch)->lo)
448     regaddr = MIPS64_EF_LO;
449   else if (regno == mips_regnum (current_gdbarch)->hi)
450     regaddr = MIPS64_EF_HI;
451   else if (regno == mips_regnum (current_gdbarch)->pc)
452     regaddr = MIPS64_EF_CP0_EPC;
453   else if (regno == mips_regnum (current_gdbarch)->badvaddr)
454     regaddr = MIPS64_EF_CP0_BADVADDR;
455   else if (regno == PS_REGNUM)
456     regaddr = MIPS64_EF_CP0_STATUS;
457   else if (regno == mips_regnum (current_gdbarch)->cause)
458     regaddr = MIPS64_EF_CP0_CAUSE;
459   else
460     regaddr = -1;
461 
462   if (regaddr != -1)
463     {
464       dst = regp + regaddr;
465       regcache_raw_collect (current_regcache, regno, dst);
466     }
467 }
468 
469 /* Likewise, unpack an elf_fpregset_t.  */
470 
471 static void
472 mips64_supply_fpregset (mips64_elf_fpregset_t *fpregsetp)
473 {
474   int regi;
475   char zerobuf[MAX_REGISTER_SIZE];
476 
477   memset (zerobuf, 0, MAX_REGISTER_SIZE);
478 
479   for (regi = 0; regi < 32; regi++)
480     regcache_raw_supply (current_regcache, FP0_REGNUM + regi,
481 			 (char *)(*fpregsetp + regi));
482 
483   regcache_raw_supply (current_regcache,
484 		       mips_regnum (current_gdbarch)->fp_control_status,
485 		       (char *)(*fpregsetp + 32));
486 
487   /* FIXME: how can we supply FCRIR?  The ABI doesn't tell us. */
488   regcache_raw_supply (current_regcache,
489 		       mips_regnum (current_gdbarch)->fp_implementation_revision,
490 		       zerobuf);
491 }
492 
493 /* Likewise, pack one or all floating point registers into an
494    elf_fpregset_t.  */
495 
496 static void
497 mips64_fill_fpregset (mips64_elf_fpregset_t *fpregsetp, int regno)
498 {
499   char *from, *to;
500 
501   if ((regno >= FP0_REGNUM) && (regno < FP0_REGNUM + 32))
502     {
503       from = (char *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)];
504       to = (char *) (*fpregsetp + regno - FP0_REGNUM);
505       memcpy (to, from, register_size (current_gdbarch, regno - FP0_REGNUM));
506     }
507   else if (regno == mips_regnum (current_gdbarch)->fp_control_status)
508     {
509       from = (char *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)];
510       to = (char *) (*fpregsetp + 32);
511       memcpy (to, from, register_size (current_gdbarch, regno));
512     }
513   else if (regno == -1)
514     {
515       int regi;
516 
517       for (regi = 0; regi < 32; regi++)
518 	mips64_fill_fpregset (fpregsetp, FP0_REGNUM + regi);
519       mips64_fill_fpregset(fpregsetp,
520 			   mips_regnum (current_gdbarch)->fp_control_status);
521     }
522 }
523 
524 
525 /* Map gdb internal register number to ptrace ``address''.
526    These ``addresses'' are normally defined in <asm/ptrace.h>.  */
527 
528 static CORE_ADDR
529 mips64_linux_register_addr (int regno, CORE_ADDR blockend)
530 {
531   int regaddr;
532 
533   if (regno < 0 || regno >= NUM_REGS)
534     error ("Bogon register number %d.", regno);
535 
536   if (regno < 32)
537     regaddr = regno;
538   else if ((regno >= mips_regnum (current_gdbarch)->fp0)
539 	   && (regno < mips_regnum (current_gdbarch)->fp0 + 32))
540     regaddr = MIPS64_FPR_BASE + (regno - FP0_REGNUM);
541   else if (regno == mips_regnum (current_gdbarch)->pc)
542     regaddr = MIPS64_PC;
543   else if (regno == mips_regnum (current_gdbarch)->cause)
544     regaddr = MIPS64_CAUSE;
545   else if (regno == mips_regnum (current_gdbarch)->badvaddr)
546     regaddr = MIPS64_BADVADDR;
547   else if (regno == mips_regnum (current_gdbarch)->lo)
548     regaddr = MIPS64_MMLO;
549   else if (regno == mips_regnum (current_gdbarch)->hi)
550     regaddr = MIPS64_MMHI;
551   else if (regno == mips_regnum (current_gdbarch)->fp_control_status)
552     regaddr = MIPS64_FPC_CSR;
553   else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision)
554     regaddr = MIPS64_FPC_EIR;
555   else
556     error ("Unknowable register number %d.", regno);
557 
558   return regaddr;
559 }
560 
561 /*  Use a local version of this function to get the correct types for
562     regsets, until multi-arch core support is ready.  */
563 
564 static void
565 fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
566 		      int which, CORE_ADDR reg_addr)
567 {
568   elf_gregset_t gregset;
569   elf_fpregset_t fpregset;
570   mips64_elf_gregset_t gregset64;
571   mips64_elf_fpregset_t fpregset64;
572 
573   if (which == 0)
574     {
575       if (core_reg_size == sizeof (gregset))
576 	{
577 	  memcpy ((char *) &gregset, core_reg_sect, sizeof (gregset));
578 	  supply_gregset (&gregset);
579 	}
580       else if (core_reg_size == sizeof (gregset64))
581 	{
582 	  memcpy ((char *) &gregset64, core_reg_sect, sizeof (gregset64));
583 	  mips64_supply_gregset (&gregset64);
584 	}
585       else
586 	{
587 	  warning ("wrong size gregset struct in core file");
588 	}
589     }
590   else if (which == 2)
591     {
592       if (core_reg_size == sizeof (fpregset))
593 	{
594 	  memcpy ((char *) &fpregset, core_reg_sect, sizeof (fpregset));
595 	  supply_fpregset (&fpregset);
596 	}
597       else if (core_reg_size == sizeof (fpregset64))
598 	{
599 	  memcpy ((char *) &fpregset64, core_reg_sect, sizeof (fpregset64));
600 	  mips64_supply_fpregset (&fpregset64);
601 	}
602       else
603 	{
604 	  warning ("wrong size fpregset struct in core file");
605 	}
606     }
607 }
608 
609 /* Register that we are able to handle ELF file formats using standard
610    procfs "regset" structures.  */
611 
612 static struct core_fns regset_core_fns =
613 {
614   bfd_target_elf_flavour,		/* core_flavour */
615   default_check_format,			/* check_format */
616   default_core_sniffer,			/* core_sniffer */
617   fetch_core_registers,			/* core_read_registers */
618   NULL					/* next */
619 };
620 
621 /* Fetch (and possibly build) an appropriate link_map_offsets
622    structure for native GNU/Linux MIPS targets using the struct offsets
623    defined in link.h (but without actual reference to that file).
624 
625    This makes it possible to access GNU/Linux MIPS shared libraries from a
626    GDB that was built on a different host platform (for cross debugging).  */
627 
628 static struct link_map_offsets *
629 mips64_linux_svr4_fetch_link_map_offsets (void)
630 {
631   static struct link_map_offsets lmo;
632   static struct link_map_offsets *lmp = NULL;
633 
634   if (lmp == NULL)
635     {
636       lmp = &lmo;
637 
638       lmo.r_debug_size = 16;	/* The actual size is 40 bytes, but
639 				   this is all we need.  */
640       lmo.r_map_offset = 8;
641       lmo.r_map_size   = 8;
642 
643       lmo.link_map_size = 40;
644 
645       lmo.l_addr_offset = 0;
646       lmo.l_addr_size   = 8;
647 
648       lmo.l_name_offset = 8;
649       lmo.l_name_size   = 8;
650 
651       lmo.l_next_offset = 24;
652       lmo.l_next_size   = 8;
653 
654       lmo.l_prev_offset = 32;
655       lmo.l_prev_size   = 8;
656     }
657 
658   return lmp;
659 }
660 
661 /* Handle for obtaining pointer to the current register_addr() function
662    for a given architecture.  */
663 static struct gdbarch_data *register_addr_data;
664 
665 CORE_ADDR
666 register_addr (int regno, CORE_ADDR blockend)
667 {
668   CORE_ADDR (*register_addr_ptr) (int, CORE_ADDR) =
669     gdbarch_data (current_gdbarch, register_addr_data);
670 
671   gdb_assert (register_addr_ptr != 0);
672 
673   return register_addr_ptr (regno, blockend);
674 }
675 
676 static void
677 set_mips_linux_register_addr (struct gdbarch *gdbarch,
678                               CORE_ADDR (*register_addr_ptr) (int, CORE_ADDR))
679 {
680   deprecated_set_gdbarch_data (gdbarch, register_addr_data, register_addr_ptr);
681 }
682 
683 static void *
684 init_register_addr_data (struct gdbarch *gdbarch)
685 {
686   return 0;
687 }
688 
689 /* Check the code at PC for a dynamic linker lazy resolution stub.  Because
690    they aren't in the .plt section, we pattern-match on the code generated
691    by GNU ld.  They look like this:
692 
693    lw t9,0x8010(gp)
694    addu t7,ra
695    jalr t9,ra
696    addiu t8,zero,INDEX
697 
698    (with the appropriate doubleword instructions for N64).  Also return the
699    dynamic symbol index used in the last instruction.  */
700 
701 static int
702 mips_linux_in_dynsym_stub (CORE_ADDR pc, char *name)
703 {
704   unsigned char buf[28], *p;
705   ULONGEST insn, insn1;
706   int n64 = (mips_abi (current_gdbarch) == MIPS_ABI_N64);
707 
708   read_memory (pc - 12, buf, 28);
709 
710   if (n64)
711     {
712       /* ld t9,0x8010(gp) */
713       insn1 = 0xdf998010;
714     }
715   else
716     {
717       /* lw t9,0x8010(gp) */
718       insn1 = 0x8f998010;
719     }
720 
721   p = buf + 12;
722   while (p >= buf)
723     {
724       insn = extract_unsigned_integer (p, 4);
725       if (insn == insn1)
726 	break;
727       p -= 4;
728     }
729   if (p < buf)
730     return 0;
731 
732   insn = extract_unsigned_integer (p + 4, 4);
733   if (n64)
734     {
735       /* daddu t7,ra */
736       if (insn != 0x03e0782d)
737 	return 0;
738     }
739   else
740     {
741       /* addu t7,ra */
742       if (insn != 0x03e07821)
743 	return 0;
744     }
745 
746   insn = extract_unsigned_integer (p + 8, 4);
747   /* jalr t9,ra */
748   if (insn != 0x0320f809)
749     return 0;
750 
751   insn = extract_unsigned_integer (p + 12, 4);
752   if (n64)
753     {
754       /* daddiu t8,zero,0 */
755       if ((insn & 0xffff0000) != 0x64180000)
756 	return 0;
757     }
758   else
759     {
760       /* addiu t8,zero,0 */
761       if ((insn & 0xffff0000) != 0x24180000)
762 	return 0;
763     }
764 
765   return (insn & 0xffff);
766 }
767 
768 /* Return non-zero iff PC belongs to the dynamic linker resolution code
769    or to a stub.  */
770 
771 int
772 mips_linux_in_dynsym_resolve_code (CORE_ADDR pc)
773 {
774   /* Check whether PC is in the dynamic linker.  This also checks whether
775      it is in the .plt section, which MIPS does not use.  */
776   if (in_solib_dynsym_resolve_code (pc))
777     return 1;
778 
779   /* Pattern match for the stub.  It would be nice if there were a more
780      efficient way to avoid this check.  */
781   if (mips_linux_in_dynsym_stub (pc, NULL))
782     return 1;
783 
784   return 0;
785 }
786 
787 /* See the comments for SKIP_SOLIB_RESOLVER at the top of infrun.c,
788    and glibc_skip_solib_resolver in glibc-tdep.c.  The normal glibc
789    implementation of this triggers at "fixup" from the same objfile as
790    "_dl_runtime_resolve"; MIPS GNU/Linux can trigger at
791    "__dl_runtime_resolve" directly.  An unresolved PLT entry will
792    point to _dl_runtime_resolve, which will first call
793    __dl_runtime_resolve, and then pass control to the resolved
794    function.  */
795 
796 static CORE_ADDR
797 mips_linux_skip_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
798 {
799   struct minimal_symbol *resolver;
800 
801   resolver = lookup_minimal_symbol ("__dl_runtime_resolve", NULL, NULL);
802 
803   if (resolver && SYMBOL_VALUE_ADDRESS (resolver) == pc)
804     return frame_pc_unwind (get_current_frame ());
805 
806   return 0;
807 }
808 
809 /* Signal trampoline support.  There are four supported layouts for a
810    signal frame: o32 sigframe, o32 rt_sigframe, n32 rt_sigframe, and
811    n64 rt_sigframe.  We handle them all independently; not the most
812    efficient way, but simplest.  First, declare all the unwinders.  */
813 
814 static void mips_linux_o32_sigframe_init (const struct tramp_frame *self,
815 					  struct frame_info *next_frame,
816 					  struct trad_frame_cache *this_cache,
817 					  CORE_ADDR func);
818 
819 static void mips_linux_n32n64_sigframe_init (const struct tramp_frame *self,
820 					     struct frame_info *next_frame,
821 					     struct trad_frame_cache *this_cache,
822 					     CORE_ADDR func);
823 
824 #define MIPS_NR_LINUX 4000
825 #define MIPS_NR_N64_LINUX 5000
826 #define MIPS_NR_N32_LINUX 6000
827 
828 #define MIPS_NR_sigreturn MIPS_NR_LINUX + 119
829 #define MIPS_NR_rt_sigreturn MIPS_NR_LINUX + 193
830 #define MIPS_NR_N64_rt_sigreturn MIPS_NR_N64_LINUX + 211
831 #define MIPS_NR_N32_rt_sigreturn MIPS_NR_N32_LINUX + 211
832 
833 #define MIPS_INST_LI_V0_SIGRETURN 0x24020000 + MIPS_NR_sigreturn
834 #define MIPS_INST_LI_V0_RT_SIGRETURN 0x24020000 + MIPS_NR_rt_sigreturn
835 #define MIPS_INST_LI_V0_N64_RT_SIGRETURN 0x24020000 + MIPS_NR_N64_rt_sigreturn
836 #define MIPS_INST_LI_V0_N32_RT_SIGRETURN 0x24020000 + MIPS_NR_N32_rt_sigreturn
837 #define MIPS_INST_SYSCALL 0x0000000c
838 
839 static const struct tramp_frame mips_linux_o32_sigframe = {
840   SIGTRAMP_FRAME,
841   4,
842   {
843     { MIPS_INST_LI_V0_SIGRETURN, -1 },
844     { MIPS_INST_SYSCALL, -1 },
845     { TRAMP_SENTINEL_INSN, -1 }
846   },
847   mips_linux_o32_sigframe_init
848 };
849 
850 static const struct tramp_frame mips_linux_o32_rt_sigframe = {
851   SIGTRAMP_FRAME,
852   4,
853   {
854     { MIPS_INST_LI_V0_RT_SIGRETURN, -1 },
855     { MIPS_INST_SYSCALL, -1 },
856     { TRAMP_SENTINEL_INSN, -1 } },
857   mips_linux_o32_sigframe_init
858 };
859 
860 static const struct tramp_frame mips_linux_n32_rt_sigframe = {
861   SIGTRAMP_FRAME,
862   4,
863   {
864     { MIPS_INST_LI_V0_N32_RT_SIGRETURN, -1 },
865     { MIPS_INST_SYSCALL, -1 },
866     { TRAMP_SENTINEL_INSN, -1 }
867   },
868   mips_linux_n32n64_sigframe_init
869 };
870 
871 static const struct tramp_frame mips_linux_n64_rt_sigframe = {
872   SIGTRAMP_FRAME,
873   4,
874   { MIPS_INST_LI_V0_N64_RT_SIGRETURN, MIPS_INST_SYSCALL, TRAMP_SENTINEL_INSN },
875   mips_linux_n32n64_sigframe_init
876 };
877 
878 /* *INDENT-OFF* */
879 /* The unwinder for o32 signal frames.  The legacy structures look
880    like this:
881 
882    struct sigframe {
883      u32 sf_ass[4];            [argument save space for o32]
884      u32 sf_code[2];           [signal trampoline]
885      struct sigcontext sf_sc;
886      sigset_t sf_mask;
887    };
888 
889    struct sigcontext {
890         unsigned int       sc_regmask;          [Unused]
891         unsigned int       sc_status;
892         unsigned long long sc_pc;
893         unsigned long long sc_regs[32];
894         unsigned long long sc_fpregs[32];
895         unsigned int       sc_ownedfp;
896         unsigned int       sc_fpc_csr;
897         unsigned int       sc_fpc_eir;          [Unused]
898         unsigned int       sc_used_math;
899         unsigned int       sc_ssflags;          [Unused]
900 	[Alignment hole of four bytes]
901         unsigned long long sc_mdhi;
902         unsigned long long sc_mdlo;
903 
904         unsigned int       sc_cause;            [Unused]
905         unsigned int       sc_badvaddr;         [Unused]
906 
907         unsigned long      sc_sigset[4];        [kernel's sigset_t]
908    };
909 
910    The RT signal frames look like this:
911 
912    struct rt_sigframe {
913      u32 rs_ass[4];            [argument save space for o32]
914      u32 rs_code[2]            [signal trampoline]
915      struct siginfo rs_info;
916      struct ucontext rs_uc;
917    };
918 
919    struct ucontext {
920      unsigned long     uc_flags;
921      struct ucontext  *uc_link;
922      stack_t           uc_stack;
923      [Alignment hole of four bytes]
924      struct sigcontext uc_mcontext;
925      sigset_t          uc_sigmask;
926    };  */
927 /* *INDENT-ON* */
928 
929 #define SIGFRAME_CODE_OFFSET         (4 * 4)
930 #define SIGFRAME_SIGCONTEXT_OFFSET   (6 * 4)
931 
932 #define RTSIGFRAME_SIGINFO_SIZE      128
933 #define STACK_T_SIZE                 (3 * 4)
934 #define UCONTEXT_SIGCONTEXT_OFFSET   (2 * 4 + STACK_T_SIZE + 4)
935 #define RTSIGFRAME_SIGCONTEXT_OFFSET (SIGFRAME_SIGCONTEXT_OFFSET \
936 				      + RTSIGFRAME_SIGINFO_SIZE \
937 				      + UCONTEXT_SIGCONTEXT_OFFSET)
938 
939 #define SIGCONTEXT_PC       (1 * 8)
940 #define SIGCONTEXT_REGS     (2 * 8)
941 #define SIGCONTEXT_FPREGS   (34 * 8)
942 #define SIGCONTEXT_FPCSR    (66 * 8 + 4)
943 #define SIGCONTEXT_HI       (69 * 8)
944 #define SIGCONTEXT_LO       (70 * 8)
945 #define SIGCONTEXT_CAUSE    (71 * 8 + 0)
946 #define SIGCONTEXT_BADVADDR (71 * 8 + 4)
947 
948 #define SIGCONTEXT_REG_SIZE 8
949 
950 static void
951 mips_linux_o32_sigframe_init (const struct tramp_frame *self,
952 			      struct frame_info *next_frame,
953 			      struct trad_frame_cache *this_cache,
954 			      CORE_ADDR func)
955 {
956   int ireg, reg_position;
957   CORE_ADDR sigcontext_base = func - SIGFRAME_CODE_OFFSET;
958   const struct mips_regnum *regs = mips_regnum (current_gdbarch);
959 
960   if (self == &mips_linux_o32_sigframe)
961     sigcontext_base += SIGFRAME_SIGCONTEXT_OFFSET;
962   else
963     sigcontext_base += RTSIGFRAME_SIGCONTEXT_OFFSET;
964 
965   /* I'm not proud of this hack.  Eventually we will have the infrastructure
966      to indicate the size of saved registers on a per-frame basis, but
967      right now we don't; the kernel saves eight bytes but we only want
968      four.  */
969   if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
970     sigcontext_base += 4;
971 
972 #if 0
973   trad_frame_set_reg_addr (this_cache, ORIG_ZERO_REGNUM + NUM_REGS,
974 			   sigcontext_base + SIGCONTEXT_REGS);
975 #endif
976 
977   for (ireg = 1; ireg < 32; ireg++)
978     trad_frame_set_reg_addr (this_cache, ireg + ZERO_REGNUM + NUM_REGS,
979 			     sigcontext_base + SIGCONTEXT_REGS
980 			     + ireg * SIGCONTEXT_REG_SIZE);
981 
982   for (ireg = 0; ireg < 32; ireg++)
983     trad_frame_set_reg_addr (this_cache, ireg + regs->fp0 + NUM_REGS,
984 			     sigcontext_base + SIGCONTEXT_FPREGS
985 			     + ireg * SIGCONTEXT_REG_SIZE);
986 
987   trad_frame_set_reg_addr (this_cache, regs->pc + NUM_REGS,
988 			   sigcontext_base + SIGCONTEXT_PC);
989 
990   trad_frame_set_reg_addr (this_cache, regs->fp_control_status + NUM_REGS,
991 			   sigcontext_base + SIGCONTEXT_FPCSR);
992   trad_frame_set_reg_addr (this_cache, regs->hi + NUM_REGS,
993 			   sigcontext_base + SIGCONTEXT_HI);
994   trad_frame_set_reg_addr (this_cache, regs->lo + NUM_REGS,
995 			   sigcontext_base + SIGCONTEXT_LO);
996   trad_frame_set_reg_addr (this_cache, regs->cause + NUM_REGS,
997 			   sigcontext_base + SIGCONTEXT_CAUSE);
998   trad_frame_set_reg_addr (this_cache, regs->badvaddr + NUM_REGS,
999 			   sigcontext_base + SIGCONTEXT_BADVADDR);
1000 
1001   /* Choice of the bottom of the sigframe is somewhat arbitrary.  */
1002   trad_frame_set_id (this_cache,
1003 		     frame_id_build (func - SIGFRAME_CODE_OFFSET, func));
1004 }
1005 
1006 /* *INDENT-OFF* */
1007 /* For N32/N64 things look different.  There is no non-rt signal frame.
1008 
1009   struct rt_sigframe_n32 {
1010     u32 rs_ass[4];                  [ argument save space for o32 ]
1011     u32 rs_code[2];                 [ signal trampoline ]
1012     struct siginfo rs_info;
1013     struct ucontextn32 rs_uc;
1014   };
1015 
1016   struct ucontextn32 {
1017     u32                 uc_flags;
1018     s32                 uc_link;
1019     stack32_t           uc_stack;
1020     struct sigcontext   uc_mcontext;
1021     sigset_t            uc_sigmask;   [ mask last for extensibility ]
1022   };
1023 
1024   struct rt_sigframe_n32 {
1025     u32 rs_ass[4];                  [ argument save space for o32 ]
1026     u32 rs_code[2];                 [ signal trampoline ]
1027     struct siginfo rs_info;
1028     struct ucontext rs_uc;
1029   };
1030 
1031   struct ucontext {
1032     unsigned long     uc_flags;
1033     struct ucontext  *uc_link;
1034     stack_t           uc_stack;
1035     struct sigcontext uc_mcontext;
1036     sigset_t          uc_sigmask;   [ mask last for extensibility ]
1037   };
1038 
1039   And the sigcontext is different (this is for both n32 and n64):
1040 
1041   struct sigcontext {
1042     unsigned long long sc_regs[32];
1043     unsigned long long sc_fpregs[32];
1044     unsigned long long sc_mdhi;
1045     unsigned long long sc_mdlo;
1046     unsigned long long sc_pc;
1047     unsigned int       sc_status;
1048     unsigned int       sc_fpc_csr;
1049     unsigned int       sc_fpc_eir;
1050     unsigned int       sc_used_math;
1051     unsigned int       sc_cause;
1052     unsigned int       sc_badvaddr;
1053   };  */
1054 /* *INDENT-ON* */
1055 
1056 #define N32_STACK_T_SIZE		STACK_T_SIZE
1057 #define N64_STACK_T_SIZE		(2 * 8 + 4)
1058 #define N32_UCONTEXT_SIGCONTEXT_OFFSET  (2 * 4 + N32_STACK_T_SIZE + 4)
1059 #define N64_UCONTEXT_SIGCONTEXT_OFFSET  (2 * 8 + N64_STACK_T_SIZE + 4)
1060 #define N32_SIGFRAME_SIGCONTEXT_OFFSET	(SIGFRAME_SIGCONTEXT_OFFSET \
1061 					 + RTSIGFRAME_SIGINFO_SIZE \
1062 					 + N32_UCONTEXT_SIGCONTEXT_OFFSET)
1063 #define N64_SIGFRAME_SIGCONTEXT_OFFSET	(SIGFRAME_SIGCONTEXT_OFFSET \
1064 					 + RTSIGFRAME_SIGINFO_SIZE \
1065 					 + N64_UCONTEXT_SIGCONTEXT_OFFSET)
1066 
1067 #define N64_SIGCONTEXT_REGS     (0 * 8)
1068 #define N64_SIGCONTEXT_FPREGS   (32 * 8)
1069 #define N64_SIGCONTEXT_HI       (64 * 8)
1070 #define N64_SIGCONTEXT_LO       (65 * 8)
1071 #define N64_SIGCONTEXT_PC       (66 * 8)
1072 #define N64_SIGCONTEXT_FPCSR    (67 * 8 + 1 * 4)
1073 #define N64_SIGCONTEXT_FIR      (67 * 8 + 2 * 4)
1074 #define N64_SIGCONTEXT_CAUSE    (67 * 8 + 4 * 4)
1075 #define N64_SIGCONTEXT_BADVADDR (67 * 8 + 5 * 4)
1076 
1077 #define N64_SIGCONTEXT_REG_SIZE 8
1078 
1079 static void
1080 mips_linux_n32n64_sigframe_init (const struct tramp_frame *self,
1081 				 struct frame_info *next_frame,
1082 				 struct trad_frame_cache *this_cache,
1083 				 CORE_ADDR func)
1084 {
1085   int ireg, reg_position;
1086   CORE_ADDR sigcontext_base = func - SIGFRAME_CODE_OFFSET;
1087   const struct mips_regnum *regs = mips_regnum (current_gdbarch);
1088 
1089   if (self == &mips_linux_n32_rt_sigframe)
1090     sigcontext_base += N32_SIGFRAME_SIGCONTEXT_OFFSET;
1091   else
1092     sigcontext_base += N64_SIGFRAME_SIGCONTEXT_OFFSET;
1093 
1094 #if 0
1095   trad_frame_set_reg_addr (this_cache, ORIG_ZERO_REGNUM + NUM_REGS,
1096 			   sigcontext_base + N64_SIGCONTEXT_REGS);
1097 #endif
1098 
1099   for (ireg = 1; ireg < 32; ireg++)
1100     trad_frame_set_reg_addr (this_cache, ireg + ZERO_REGNUM + NUM_REGS,
1101 			     sigcontext_base + N64_SIGCONTEXT_REGS
1102 			     + ireg * N64_SIGCONTEXT_REG_SIZE);
1103 
1104   for (ireg = 0; ireg < 32; ireg++)
1105     trad_frame_set_reg_addr (this_cache, ireg + regs->fp0 + NUM_REGS,
1106 			     sigcontext_base + N64_SIGCONTEXT_FPREGS
1107 			     + ireg * N64_SIGCONTEXT_REG_SIZE);
1108 
1109   trad_frame_set_reg_addr (this_cache, regs->pc + NUM_REGS,
1110 			   sigcontext_base + N64_SIGCONTEXT_PC);
1111 
1112   trad_frame_set_reg_addr (this_cache, regs->fp_control_status + NUM_REGS,
1113 			   sigcontext_base + N64_SIGCONTEXT_FPCSR);
1114   trad_frame_set_reg_addr (this_cache, regs->hi + NUM_REGS,
1115 			   sigcontext_base + N64_SIGCONTEXT_HI);
1116   trad_frame_set_reg_addr (this_cache, regs->lo + NUM_REGS,
1117 			   sigcontext_base + N64_SIGCONTEXT_LO);
1118   trad_frame_set_reg_addr (this_cache, regs->cause + NUM_REGS,
1119 			   sigcontext_base + N64_SIGCONTEXT_CAUSE);
1120   trad_frame_set_reg_addr (this_cache, regs->badvaddr + NUM_REGS,
1121 			   sigcontext_base + N64_SIGCONTEXT_BADVADDR);
1122 
1123   /* Choice of the bottom of the sigframe is somewhat arbitrary.  */
1124   trad_frame_set_id (this_cache,
1125 		     frame_id_build (func - SIGFRAME_CODE_OFFSET, func));
1126 }
1127 
1128 /* Initialize one of the GNU/Linux OS ABIs.  */
1129 
1130 static void
1131 mips_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
1132 {
1133   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1134   enum mips_abi abi = mips_abi (gdbarch);
1135 
1136   switch (abi)
1137     {
1138       case MIPS_ABI_O32:
1139 	set_gdbarch_get_longjmp_target (gdbarch,
1140 	                                mips_linux_get_longjmp_target);
1141 	set_solib_svr4_fetch_link_map_offsets
1142 	  (gdbarch, mips_linux_svr4_fetch_link_map_offsets);
1143 	set_mips_linux_register_addr (gdbarch, mips_linux_register_addr);
1144 	tramp_frame_prepend_unwinder (gdbarch, &mips_linux_o32_sigframe);
1145 	tramp_frame_prepend_unwinder (gdbarch, &mips_linux_o32_rt_sigframe);
1146 	break;
1147       case MIPS_ABI_N32:
1148 	set_gdbarch_get_longjmp_target (gdbarch,
1149 	                                mips_linux_get_longjmp_target);
1150 	set_solib_svr4_fetch_link_map_offsets
1151 	  (gdbarch, mips_linux_svr4_fetch_link_map_offsets);
1152 	set_mips_linux_register_addr (gdbarch, mips64_linux_register_addr);
1153 	tramp_frame_prepend_unwinder (gdbarch, &mips_linux_n32_rt_sigframe);
1154 	break;
1155       case MIPS_ABI_N64:
1156 	set_gdbarch_get_longjmp_target (gdbarch,
1157 	                                mips64_linux_get_longjmp_target);
1158 	set_solib_svr4_fetch_link_map_offsets
1159 	  (gdbarch, mips64_linux_svr4_fetch_link_map_offsets);
1160 	set_mips_linux_register_addr (gdbarch, mips64_linux_register_addr);
1161 	tramp_frame_prepend_unwinder (gdbarch, &mips_linux_n64_rt_sigframe);
1162 	break;
1163       default:
1164 	internal_error (__FILE__, __LINE__, "can't handle ABI");
1165 	break;
1166     }
1167 
1168   set_gdbarch_skip_solib_resolver (gdbarch, mips_linux_skip_resolver);
1169 
1170   /* This overrides the MIPS16 stub support from mips-tdep.  But no
1171      one uses MIPS16 on GNU/Linux yet, so this isn't much of a loss.  */
1172   set_gdbarch_in_solib_call_trampoline (gdbarch, mips_linux_in_dynsym_stub);
1173 }
1174 
1175 void
1176 _initialize_mips_linux_tdep (void)
1177 {
1178   const struct bfd_arch_info *arch_info;
1179 
1180   register_addr_data =
1181     gdbarch_data_register_post_init (init_register_addr_data);
1182 
1183   for (arch_info = bfd_lookup_arch (bfd_arch_mips, 0);
1184        arch_info != NULL;
1185        arch_info = arch_info->next)
1186     {
1187       gdbarch_register_osabi (bfd_arch_mips, arch_info->mach, GDB_OSABI_LINUX,
1188 			      mips_linux_init_abi);
1189     }
1190 
1191   deprecated_add_core_fns (&regset_core_fns);
1192 }
1193