OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [gdb/] [amd64fbsd-nat.c] - Blame information for rev 853

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 24 jeremybenn
/* Native-dependent code for FreeBSD/amd64.
2
 
3
   Copyright (C) 2003, 2004, 2007, 2008 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 "inferior.h"
22
#include "regcache.h"
23
#include "target.h"
24
 
25
#include "gdb_assert.h"
26
#include <signal.h>
27
#include <stddef.h>
28
#include <sys/types.h>
29
#include <sys/ptrace.h>
30
#include <sys/sysctl.h>
31
#include <machine/reg.h>
32
 
33
#include "fbsd-nat.h"
34
#include "amd64-tdep.h"
35
#include "amd64-nat.h"
36
 
37
 
38
/* Offset in `struct reg' where MEMBER is stored.  */
39
#define REG_OFFSET(member) offsetof (struct reg, member)
40
 
41
/* At amd64fbsd64_r_reg_offset[REGNUM] you'll find the offset in
42
   `struct reg' location where the GDB register REGNUM is stored.
43
   Unsupported registers are marked with `-1'.  */
44
static int amd64fbsd64_r_reg_offset[] =
45
{
46
  REG_OFFSET (r_rax),
47
  REG_OFFSET (r_rbx),
48
  REG_OFFSET (r_rcx),
49
  REG_OFFSET (r_rdx),
50
  REG_OFFSET (r_rsi),
51
  REG_OFFSET (r_rdi),
52
  REG_OFFSET (r_rbp),
53
  REG_OFFSET (r_rsp),
54
  REG_OFFSET (r_r8),
55
  REG_OFFSET (r_r9),
56
  REG_OFFSET (r_r10),
57
  REG_OFFSET (r_r11),
58
  REG_OFFSET (r_r12),
59
  REG_OFFSET (r_r13),
60
  REG_OFFSET (r_r14),
61
  REG_OFFSET (r_r15),
62
  REG_OFFSET (r_rip),
63
  REG_OFFSET (r_rflags),
64
  REG_OFFSET (r_cs),
65
  REG_OFFSET (r_ss),
66
  -1,
67
  -1,
68
  -1,
69
  -1
70
};
71
 
72
 
73
/* Mapping between the general-purpose registers in FreeBSD/amd64
74
   `struct reg' format and GDB's register cache layout for
75
   FreeBSD/i386.
76
 
77
   Note that most FreeBSD/amd64 registers are 64-bit, while the
78
   FreeBSD/i386 registers are all 32-bit, but since we're
79
   little-endian we get away with that.  */
80
 
81
/* From <machine/reg.h>.  */
82
static int amd64fbsd32_r_reg_offset[I386_NUM_GREGS] =
83
{
84
  14 * 8, 13 * 8,               /* %eax, %ecx */
85
  12 * 8, 11 * 8,               /* %edx, %ebx */
86
  20 * 8, 10 * 8,               /* %esp, %ebp */
87
  9 * 8, 8 * 8,                 /* %esi, %edi */
88
  17 * 8, 19 * 8,               /* %eip, %eflags */
89
  18 * 8, 21 * 8,               /* %cs, %ss */
90
  -1, -1, -1, -1                /* %ds, %es, %fs, %gs */
91
};
92
 
93
 
94
/* Support for debugging kernel virtual memory images.  */
95
 
96
#include <sys/types.h>
97
#include <machine/pcb.h>
98
 
99
#include "bsd-kvm.h"
100
 
101
static int
102
amd64fbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
103
{
104
  /* The following is true for FreeBSD 5.2:
105
 
106
     The pcb contains %rip, %rbx, %rsp, %rbp, %r12, %r13, %r14, %r15,
107
     %ds, %es, %fs and %gs.  This accounts for all callee-saved
108
     registers specified by the psABI and then some.  Here %esp
109
     contains the stack pointer at the point just after the call to
110
     cpu_switch().  From this information we reconstruct the register
111
     state as it would like when we just returned from cpu_switch().  */
112
 
113
  /* The stack pointer shouldn't be zero.  */
114
  if (pcb->pcb_rsp == 0)
115
    return 0;
116
 
117
  pcb->pcb_rsp += 8;
118
  regcache_raw_supply (regcache, AMD64_RIP_REGNUM, &pcb->pcb_rip);
119
  regcache_raw_supply (regcache, AMD64_RBX_REGNUM, &pcb->pcb_rbx);
120
  regcache_raw_supply (regcache, AMD64_RSP_REGNUM, &pcb->pcb_rsp);
121
  regcache_raw_supply (regcache, AMD64_RBP_REGNUM, &pcb->pcb_rbp);
122
  regcache_raw_supply (regcache, 12, &pcb->pcb_r12);
123
  regcache_raw_supply (regcache, 13, &pcb->pcb_r13);
124
  regcache_raw_supply (regcache, 14, &pcb->pcb_r14);
125
  regcache_raw_supply (regcache, 15, &pcb->pcb_r15);
126
  regcache_raw_supply (regcache, AMD64_DS_REGNUM, &pcb->pcb_ds);
127
  regcache_raw_supply (regcache, AMD64_ES_REGNUM, &pcb->pcb_es);
128
  regcache_raw_supply (regcache, AMD64_FS_REGNUM, &pcb->pcb_fs);
129
  regcache_raw_supply (regcache, AMD64_GS_REGNUM, &pcb->pcb_gs);
130
 
131
  return 1;
132
}
133
 
134
 
135
/* Provide a prototype to silence -Wmissing-prototypes.  */
136
void _initialize_amd64fbsd_nat (void);
137
 
138
void
139
_initialize_amd64fbsd_nat (void)
140
{
141
  struct target_ops *t;
142
  int offset;
143
 
144
  amd64_native_gregset32_reg_offset = amd64fbsd32_r_reg_offset;
145
  amd64_native_gregset64_reg_offset = amd64fbsd64_r_reg_offset;
146
 
147
  /* Add some extra features to the common *BSD/i386 target.  */
148
  t = amd64bsd_target ();
149
  t->to_pid_to_exec_file = fbsd_pid_to_exec_file;
150
  t->to_find_memory_regions = fbsd_find_memory_regions;
151
  t->to_make_corefile_notes = fbsd_make_corefile_notes;
152
  add_target (t);
153
 
154
  /* Support debugging kernel virtual memory images.  */
155
  bsd_kvm_add_target (amd64fbsd_supply_pcb);
156
 
157
  /* To support the recognition of signal handlers, i386bsd-tdep.c
158
     hardcodes some constants.  Inclusion of this file means that we
159
     are compiling a native debugger, which means that we can use the
160
     system header files and sysctl(3) to get at the relevant
161
     information.  */
162
 
163
#define SC_REG_OFFSET amd64fbsd_sc_reg_offset
164
 
165
  /* We only check the program counter, stack pointer and frame
166
     pointer since these members of `struct sigcontext' are essential
167
     for providing backtraces.  */
168
 
169
#define SC_RIP_OFFSET SC_REG_OFFSET[AMD64_RIP_REGNUM]
170
#define SC_RSP_OFFSET SC_REG_OFFSET[AMD64_RSP_REGNUM]
171
#define SC_RBP_OFFSET SC_REG_OFFSET[AMD64_RBP_REGNUM]
172
 
173
  /* Override the default value for the offset of the program counter
174
     in the sigcontext structure.  */
175
  offset = offsetof (struct sigcontext, sc_rip);
176
 
177
  if (SC_RIP_OFFSET != offset)
178
    {
179
      warning (_("\
180
offsetof (struct sigcontext, sc_rip) yields %d instead of %d.\n\
181
Please report this to <bug-gdb@gnu.org>."),
182
               offset, SC_RIP_OFFSET);
183
    }
184
 
185
  SC_RIP_OFFSET = offset;
186
 
187
  /* Likewise for the stack pointer.  */
188
  offset = offsetof (struct sigcontext, sc_rsp);
189
 
190
  if (SC_RSP_OFFSET != offset)
191
    {
192
      warning (_("\
193
offsetof (struct sigcontext, sc_rsp) yields %d instead of %d.\n\
194
Please report this to <bug-gdb@gnu.org>."),
195
               offset, SC_RSP_OFFSET);
196
    }
197
 
198
  SC_RSP_OFFSET = offset;
199
 
200
  /* And the frame pointer.  */
201
  offset = offsetof (struct sigcontext, sc_rbp);
202
 
203
  if (SC_RBP_OFFSET != offset)
204
    {
205
      warning (_("\
206
offsetof (struct sigcontext, sc_rbp) yields %d instead of %d.\n\
207
Please report this to <bug-gdb@gnu.org>."),
208
               offset, SC_RBP_OFFSET);
209
    }
210
 
211
  SC_RBP_OFFSET = offset;
212
 
213
  /* FreeBSD provides a kern.ps_strings sysctl that we can use to
214
     locate the sigtramp.  That way we can still recognize a sigtramp
215
     if its location is changed in a new kernel.  Of course this is
216
     still based on the assumption that the sigtramp is placed
217
     directly under the location where the program arguments and
218
     environment can be found.  */
219
  {
220
    int mib[2];
221
    long ps_strings;
222
    size_t len;
223
 
224
    mib[0] = CTL_KERN;
225
    mib[1] = KERN_PS_STRINGS;
226
    len = sizeof (ps_strings);
227
    if (sysctl (mib, 2, &ps_strings, &len, NULL, 0) == 0)
228
      {
229
        amd64fbsd_sigtramp_start_addr = ps_strings - 32;
230
        amd64fbsd_sigtramp_end_addr = ps_strings;
231
      }
232
  }
233
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.