Replace copyreloc-main.c with copyreloc-main.S
[platform/upstream/binutils.git] / gdb / i386obsd-tdep.c
1 /* Target-dependent code for OpenBSD/i386.
2
3    Copyright (C) 1988-2014 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 3 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, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include "arch-utils.h"
22 #include "frame.h"
23 #include "frame-unwind.h"
24 #include "gdbcore.h"
25 #include "regcache.h"
26 #include "regset.h"
27 #include "symtab.h"
28 #include "objfiles.h"
29 #include "osabi.h"
30 #include "target.h"
31 #include "trad-frame.h"
32
33 #include "obsd-tdep.h"
34 #include "i386-tdep.h"
35 #include "i387-tdep.h"
36 #include "solib-svr4.h"
37 #include "bsd-uthread.h"
38
39 /* Support for signal handlers.  */
40
41 /* Since OpenBSD 3.2, the sigtramp routine is mapped at a random page
42    in virtual memory.  The randomness makes it somewhat tricky to
43    detect it, but fortunately we can rely on the fact that the start
44    of the sigtramp routine is page-aligned.  We recognize the
45    trampoline by looking for the code that invokes the sigreturn
46    system call.  The offset where we can find that code varies from
47    release to release.
48
49    By the way, the mapping mentioned above is read-only, so you cannot
50    place a breakpoint in the signal trampoline.  */
51
52 /* Default page size.  */
53 static const int i386obsd_page_size = 4096;
54
55 /* Offset for sigreturn(2).  */
56 static const int i386obsd_sigreturn_offset[] = {
57   0x0a,                         /* OpenBSD 3.2 */
58   0x14,                         /* OpenBSD 3.6 */
59   0x3a,                         /* OpenBSD 3.8 */
60   -1
61 };
62
63 /* Return whether THIS_FRAME corresponds to an OpenBSD sigtramp
64    routine.  */
65
66 static int
67 i386obsd_sigtramp_p (struct frame_info *this_frame)
68 {
69   CORE_ADDR pc = get_frame_pc (this_frame);
70   CORE_ADDR start_pc = (pc & ~(i386obsd_page_size - 1));
71   /* The call sequence invoking sigreturn(2).  */
72   const gdb_byte sigreturn[] =
73   {
74     0xb8,
75     0x67, 0x00, 0x00, 0x00,     /* movl $SYS_sigreturn, %eax */
76     0xcd, 0x80                  /* int $0x80 */
77   };
78   size_t buflen = sizeof sigreturn;
79   const int *offset;
80   gdb_byte *buf;
81   const char *name;
82
83   /* If the function has a valid symbol name, it isn't a
84      trampoline.  */
85   find_pc_partial_function (pc, &name, NULL, NULL);
86   if (name != NULL)
87     return 0;
88
89   /* If the function lives in a valid section (even without a starting
90      point) it isn't a trampoline.  */
91   if (find_pc_section (pc) != NULL)
92     return 0;
93
94   /* Allocate buffer.  */
95   buf = alloca (buflen);
96
97   /* Loop over all offsets.  */
98   for (offset = i386obsd_sigreturn_offset; *offset != -1; offset++)
99     {
100       /* If we can't read the instructions, return zero.  */
101       if (!safe_frame_unwind_memory (this_frame, start_pc + *offset,
102                                      buf, buflen))
103         return 0;
104
105       /* Check for sigreturn(2).  */
106       if (memcmp (buf, sigreturn, buflen) == 0)
107         return 1;
108     }
109
110   return 0;
111 }
112 \f
113 /* Mapping between the general-purpose registers in `struct reg'
114    format and GDB's register cache layout.  */
115
116 /* From <machine/reg.h>.  */
117 static int i386obsd_r_reg_offset[] =
118 {
119   0 * 4,                        /* %eax */
120   1 * 4,                        /* %ecx */
121   2 * 4,                        /* %edx */
122   3 * 4,                        /* %ebx */
123   4 * 4,                        /* %esp */
124   5 * 4,                        /* %ebp */
125   6 * 4,                        /* %esi */
126   7 * 4,                        /* %edi */
127   8 * 4,                        /* %eip */
128   9 * 4,                        /* %eflags */
129   10 * 4,                       /* %cs */
130   11 * 4,                       /* %ss */
131   12 * 4,                       /* %ds */
132   13 * 4,                       /* %es */
133   14 * 4,                       /* %fs */
134   15 * 4                        /* %gs */
135 };
136
137 static void
138 i386obsd_aout_supply_regset (const struct regset *regset,
139                              struct regcache *regcache, int regnum,
140                              const void *regs, size_t len)
141 {
142   struct gdbarch *gdbarch = get_regcache_arch (regcache);
143   const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
144   const gdb_byte *gregs = regs;
145
146   gdb_assert (len >= tdep->sizeof_gregset + I387_SIZEOF_FSAVE);
147
148   i386_supply_gregset (regset, regcache, regnum, regs, tdep->sizeof_gregset);
149   i387_supply_fsave (regcache, regnum, gregs + tdep->sizeof_gregset);
150 }
151
152 static const struct regset i386obsd_aout_gregset =
153   {
154     NULL, i386obsd_aout_supply_regset, NULL
155   };
156
157 static void
158 i386obsd_aout_iterate_over_regset_sections (struct gdbarch *gdbarch,
159                                             iterate_over_regset_sections_cb *cb,
160                                             void *cb_data,
161                                             const struct regcache *regcache)
162 {
163   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
164
165   /* OpenBSD a.out core dumps don't use seperate register sets for the
166      general-purpose and floating-point registers.  */
167
168   cb (".reg", tdep->sizeof_gregset + I387_SIZEOF_FSAVE,
169       &i386obsd_aout_gregset, NULL, cb_data);
170 }
171 \f
172
173 /* Sigtramp routine location for OpenBSD 3.1 and earlier releases.  */
174 CORE_ADDR i386obsd_sigtramp_start_addr = 0xbfbfdf20;
175 CORE_ADDR i386obsd_sigtramp_end_addr = 0xbfbfdff0;
176
177 /* From <machine/signal.h>.  */
178 int i386obsd_sc_reg_offset[I386_NUM_GREGS] =
179 {
180   10 * 4,                       /* %eax */
181   9 * 4,                        /* %ecx */
182   8 * 4,                        /* %edx */
183   7 * 4,                        /* %ebx */
184   14 * 4,                       /* %esp */
185   6 * 4,                        /* %ebp */
186   5 * 4,                        /* %esi */
187   4 * 4,                        /* %edi */
188   11 * 4,                       /* %eip */
189   13 * 4,                       /* %eflags */
190   12 * 4,                       /* %cs */
191   15 * 4,                       /* %ss */
192   3 * 4,                        /* %ds */
193   2 * 4,                        /* %es */
194   1 * 4,                        /* %fs */
195   0 * 4                         /* %gs */
196 };
197
198 /* From /usr/src/lib/libpthread/arch/i386/uthread_machdep.c.  */
199 static int i386obsd_uthread_reg_offset[] =
200 {
201   11 * 4,                       /* %eax */
202   10 * 4,                       /* %ecx */
203   9 * 4,                        /* %edx */
204   8 * 4,                        /* %ebx */
205   -1,                           /* %esp */
206   6 * 4,                        /* %ebp */
207   5 * 4,                        /* %esi */
208   4 * 4,                        /* %edi */
209   12 * 4,                       /* %eip */
210   -1,                           /* %eflags */
211   13 * 4,                       /* %cs */
212   -1,                           /* %ss */
213   3 * 4,                        /* %ds */
214   2 * 4,                        /* %es */
215   1 * 4,                        /* %fs */
216   0 * 4                         /* %gs */
217 };
218
219 /* Offset within the thread structure where we can find the saved
220    stack pointer (%esp).  */
221 #define I386OBSD_UTHREAD_ESP_OFFSET     176
222
223 static void
224 i386obsd_supply_uthread (struct regcache *regcache,
225                          int regnum, CORE_ADDR addr)
226 {
227   struct gdbarch *gdbarch = get_regcache_arch (regcache);
228   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
229   CORE_ADDR sp_addr = addr + I386OBSD_UTHREAD_ESP_OFFSET;
230   CORE_ADDR sp = 0;
231   gdb_byte buf[4];
232   int i;
233
234   gdb_assert (regnum >= -1);
235
236   if (regnum == -1 || regnum == I386_ESP_REGNUM)
237     {
238       int offset;
239
240       /* Fetch stack pointer from thread structure.  */
241       sp = read_memory_unsigned_integer (sp_addr, 4, byte_order);
242
243       /* Adjust the stack pointer such that it looks as if we just
244          returned from _thread_machdep_switch.  */
245       offset = i386obsd_uthread_reg_offset[I386_EIP_REGNUM] + 4;
246       store_unsigned_integer (buf, 4, byte_order, sp + offset);
247       regcache_raw_supply (regcache, I386_ESP_REGNUM, buf);
248     }
249
250   for (i = 0; i < ARRAY_SIZE (i386obsd_uthread_reg_offset); i++)
251     {
252       if (i386obsd_uthread_reg_offset[i] != -1
253           && (regnum == -1 || regnum == i))
254         {
255           /* Fetch stack pointer from thread structure (if we didn't
256              do so already).  */
257           if (sp == 0)
258             sp = read_memory_unsigned_integer (sp_addr, 4, byte_order);
259
260           /* Read the saved register from the stack frame.  */
261           read_memory (sp + i386obsd_uthread_reg_offset[i], buf, 4);
262           regcache_raw_supply (regcache, i, buf);
263         }
264     }
265 }
266
267 static void
268 i386obsd_collect_uthread (const struct regcache *regcache,
269                           int regnum, CORE_ADDR addr)
270 {
271   struct gdbarch *gdbarch = get_regcache_arch (regcache);
272   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
273   CORE_ADDR sp_addr = addr + I386OBSD_UTHREAD_ESP_OFFSET;
274   CORE_ADDR sp = 0;
275   gdb_byte buf[4];
276   int i;
277
278   gdb_assert (regnum >= -1);
279
280   if (regnum == -1 || regnum == I386_ESP_REGNUM)
281     {
282       int offset;
283
284       /* Calculate the stack pointer (frame pointer) that will be
285          stored into the thread structure.  */
286       offset = i386obsd_uthread_reg_offset[I386_EIP_REGNUM] + 4;
287       regcache_raw_collect (regcache, I386_ESP_REGNUM, buf);
288       sp = extract_unsigned_integer (buf, 4, byte_order) - offset;
289
290       /* Store the stack pointer.  */
291       write_memory_unsigned_integer (sp_addr, 4, byte_order, sp);
292
293       /* The stack pointer was (potentially) modified.  Make sure we
294          build a proper stack frame.  */
295       regnum = -1;
296     }
297
298   for (i = 0; i < ARRAY_SIZE (i386obsd_uthread_reg_offset); i++)
299     {
300       if (i386obsd_uthread_reg_offset[i] != -1
301           && (regnum == -1 || regnum == i))
302         {
303           /* Fetch stack pointer from thread structure (if we didn't
304              calculate it already).  */
305           if (sp == 0)
306             sp = read_memory_unsigned_integer (sp_addr, 4, byte_order);
307
308           /* Write the register into the stack frame.  */
309           regcache_raw_collect (regcache, i, buf);
310           write_memory (sp + i386obsd_uthread_reg_offset[i], buf, 4);
311         }
312     }
313 }
314 \f
315 /* Kernel debugging support.  */
316
317 /* From <machine/frame.h>.  Note that %esp and %ess are only saved in
318    a trap frame when entering the kernel from user space.  */
319 static int i386obsd_tf_reg_offset[] =
320 {
321   10 * 4,                       /* %eax */
322   9 * 4,                        /* %ecx */
323   8 * 4,                        /* %edx */
324   7 * 4,                        /* %ebx */
325   -1,                           /* %esp */
326   6 * 4,                        /* %ebp */
327   5 * 4,                        /* %esi */
328   4 * 4,                        /* %edi */
329   13 * 4,                       /* %eip */
330   15 * 4,                       /* %eflags */
331   14 * 4,                       /* %cs */
332   -1,                           /* %ss */
333   3 * 4,                        /* %ds */
334   2 * 4,                        /* %es */
335   0 * 4,                        /* %fs */
336   1 * 4                         /* %gs */
337 };
338
339 static struct trad_frame_cache *
340 i386obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
341 {
342   struct gdbarch *gdbarch = get_frame_arch (this_frame);
343   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
344   struct trad_frame_cache *cache;
345   CORE_ADDR func, sp, addr;
346   ULONGEST cs;
347   const char *name;
348   int i;
349
350   if (*this_cache)
351     return *this_cache;
352
353   cache = trad_frame_cache_zalloc (this_frame);
354   *this_cache = cache;
355
356   func = get_frame_func (this_frame);
357   sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM);
358
359   find_pc_partial_function (func, &name, NULL, NULL);
360   if (name && strncmp (name, "Xintr", 5) == 0)
361     addr = sp + 8;              /* It's an interrupt frame.  */
362   else
363     addr = sp;
364
365   for (i = 0; i < ARRAY_SIZE (i386obsd_tf_reg_offset); i++)
366     if (i386obsd_tf_reg_offset[i] != -1)
367       trad_frame_set_reg_addr (cache, i, addr + i386obsd_tf_reg_offset[i]);
368
369   /* Read %cs from trap frame.  */
370   addr += i386obsd_tf_reg_offset[I386_CS_REGNUM];
371   cs = read_memory_unsigned_integer (addr, 4, byte_order);
372   if ((cs & I386_SEL_RPL) == I386_SEL_UPL)
373     {
374       /* Trap from user space; terminate backtrace.  */
375       trad_frame_set_id (cache, outer_frame_id);
376     }
377   else
378     {
379       /* Construct the frame ID using the function start.  */
380       trad_frame_set_id (cache, frame_id_build (sp + 8, func));
381     }
382
383   return cache;
384 }
385
386 static void
387 i386obsd_trapframe_this_id (struct frame_info *this_frame,
388                             void **this_cache, struct frame_id *this_id)
389 {
390   struct trad_frame_cache *cache =
391     i386obsd_trapframe_cache (this_frame, this_cache);
392   
393   trad_frame_get_id (cache, this_id);
394 }
395
396 static struct value *
397 i386obsd_trapframe_prev_register (struct frame_info *this_frame,
398                                   void **this_cache, int regnum)
399 {
400   struct trad_frame_cache *cache =
401     i386obsd_trapframe_cache (this_frame, this_cache);
402
403   return trad_frame_get_register (cache, this_frame, regnum);
404 }
405
406 static int
407 i386obsd_trapframe_sniffer (const struct frame_unwind *self,
408                             struct frame_info *this_frame,
409                             void **this_prologue_cache)
410 {
411   ULONGEST cs;
412   const char *name;
413
414   /* Check Current Privilege Level and bail out if we're not executing
415      in kernel space.  */
416   cs = get_frame_register_unsigned (this_frame, I386_CS_REGNUM);
417   if ((cs & I386_SEL_RPL) == I386_SEL_UPL)
418     return 0;
419
420   find_pc_partial_function (get_frame_pc (this_frame), &name, NULL, NULL);
421   return (name && (strcmp (name, "calltrap") == 0
422                    || strcmp (name, "syscall1") == 0
423                    || strncmp (name, "Xintr", 5) == 0
424                    || strncmp (name, "Xsoft", 5) == 0));
425 }
426
427 static const struct frame_unwind i386obsd_trapframe_unwind = {
428   /* FIXME: kettenis/20051219: This really is more like an interrupt
429      frame, but SIGTRAMP_FRAME would print <signal handler called>,
430      which really is not what we want here.  */
431   NORMAL_FRAME,
432   default_frame_unwind_stop_reason,
433   i386obsd_trapframe_this_id,
434   i386obsd_trapframe_prev_register,
435   NULL,
436   i386obsd_trapframe_sniffer
437 };
438 \f
439
440 static void 
441 i386obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
442 {
443   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
444
445   /* Obviously OpenBSD is BSD-based.  */
446   i386bsd_init_abi (info, gdbarch);
447   obsd_init_abi (info, gdbarch);
448
449   /* OpenBSD has a different `struct reg'.  */
450   tdep->gregset_reg_offset = i386obsd_r_reg_offset;
451   tdep->gregset_num_regs = ARRAY_SIZE (i386obsd_r_reg_offset);
452   tdep->sizeof_gregset = 16 * 4;
453
454   /* OpenBSD uses -freg-struct-return by default.  */
455   tdep->struct_return = reg_struct_return;
456
457   /* OpenBSD uses a different memory layout.  */
458   tdep->sigtramp_start = i386obsd_sigtramp_start_addr;
459   tdep->sigtramp_end = i386obsd_sigtramp_end_addr;
460   tdep->sigtramp_p = i386obsd_sigtramp_p;
461
462   /* OpenBSD has a `struct sigcontext' that's different from the
463      original 4.3 BSD.  */
464   tdep->sc_reg_offset = i386obsd_sc_reg_offset;
465   tdep->sc_num_regs = ARRAY_SIZE (i386obsd_sc_reg_offset);
466
467   /* OpenBSD provides a user-level threads implementation.  */
468   bsd_uthread_set_supply_uthread (gdbarch, i386obsd_supply_uthread);
469   bsd_uthread_set_collect_uthread (gdbarch, i386obsd_collect_uthread);
470
471   /* Unwind kernel trap frames correctly.  */
472   frame_unwind_prepend_unwinder (gdbarch, &i386obsd_trapframe_unwind);
473 }
474
475 /* OpenBSD a.out.  */
476
477 static void
478 i386obsd_aout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
479 {
480   i386obsd_init_abi (info, gdbarch);
481
482   /* OpenBSD a.out has a single register set.  */
483   set_gdbarch_iterate_over_regset_sections
484     (gdbarch, i386obsd_aout_iterate_over_regset_sections);
485 }
486
487 /* OpenBSD ELF.  */
488
489 static void
490 i386obsd_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
491 {
492   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
493
494   /* It's still OpenBSD.  */
495   i386obsd_init_abi (info, gdbarch);
496
497   /* But ELF-based.  */
498   i386_elf_init_abi (info, gdbarch);
499
500   /* OpenBSD ELF uses SVR4-style shared libraries.  */
501   set_solib_svr4_fetch_link_map_offsets
502     (gdbarch, svr4_ilp32_fetch_link_map_offsets);
503 }
504 \f
505
506 /* Provide a prototype to silence -Wmissing-prototypes.  */
507 void _initialize_i386obsd_tdep (void);
508
509 void
510 _initialize_i386obsd_tdep (void)
511 {
512   /* FIXME: kettenis/20021020: Since OpenBSD/i386 binaries are
513      indistingushable from NetBSD/i386 a.out binaries, building a GDB
514      that should support both these targets will probably not work as
515      expected.  */
516 #define GDB_OSABI_OPENBSD_AOUT GDB_OSABI_NETBSD_AOUT
517
518   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_OPENBSD_AOUT,
519                           i386obsd_aout_init_abi);
520   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_OPENBSD_ELF,
521                           i386obsd_elf_init_abi);
522 }