Rework signal frame probing for FreeBSD/x86
[deliverable/binutils-gdb.git] / gdb / i386fbsd-nat.c
CommitLineData
25630444 1/* Native-dependent code for FreeBSD/i386.
5d93ae8c 2
32d0add0 3 Copyright (C) 2001-2015 Free Software Foundation, Inc.
25630444
MK
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
25630444
MK
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
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
25630444
MK
19
20#include "defs.h"
21#include "inferior.h"
22#include "regcache.h"
9692934b 23#include "target.h"
25630444
MK
24
25#include <sys/types.h>
26#include <sys/ptrace.h>
27#include <sys/sysctl.h>
cf424aef 28#include <sys/user.h>
25630444 29
9692934b 30#include "fbsd-nat.h"
f0925262 31#include "i386-tdep.h"
df7e5265 32#include "x86-nat.h"
9692934b 33#include "i386bsd-nat.h"
f0925262 34
9692934b
MK
35/* Resume execution of the inferior process. If STEP is nonzero,
36 single-step it. If SIGNAL is nonzero, give it that signal. */
25630444 37
9692934b 38static void
28439f5e 39i386fbsd_resume (struct target_ops *ops,
2ea28649 40 ptid_t ptid, int step, enum gdb_signal signal)
25630444
MK
41{
42 pid_t pid = ptid_get_pid (ptid);
43 int request = PT_STEP;
44
45 if (pid == -1)
46 /* Resume all threads. This only gets used in the non-threaded
47 case, where "resume all threads" and "resume inferior_ptid" are
48 the same. */
49 pid = ptid_get_pid (inferior_ptid);
50
51 if (!step)
52 {
594f7785 53 struct regcache *regcache = get_current_regcache ();
f0925262 54 ULONGEST eflags;
25630444
MK
55
56 /* Workaround for a bug in FreeBSD. Make sure that the trace
57 flag is off when doing a continue. There is a code path
58 through the kernel which leaves the flag set when it should
59 have been cleared. If a process has a signal pending (such
60 as SIGALRM) and we do a PT_STEP, the process never really has
61 a chance to run because the kernel needs to notify the
62 debugger that a signal is being sent. Therefore, the process
63 never goes through the kernel's trap() function which would
64 normally clear it. */
65
594f7785 66 regcache_cooked_read_unsigned (regcache, I386_EFLAGS_REGNUM,
f0925262 67 &eflags);
25630444 68 if (eflags & 0x0100)
594f7785 69 regcache_cooked_write_unsigned (regcache, I386_EFLAGS_REGNUM,
f0925262 70 eflags & ~0x0100);
25630444
MK
71
72 request = PT_CONTINUE;
73 }
74
75 /* An addres of (caddr_t) 1 tells ptrace to continue from where it
76 was. (If GDB wanted it to start some other way, we have already
77 written a new PC value to the child.) */
78 if (ptrace (request, pid, (caddr_t) 1,
2ea28649 79 gdb_signal_to_host (signal)) == -1)
e2e0b3e5 80 perror_with_name (("ptrace"));
25630444
MK
81}
82\f
2e0c3539
MK
83
84/* Support for debugging kernel virtual memory images. */
85
2e0c3539
MK
86#include <machine/pcb.h>
87
88#include "bsd-kvm.h"
89
90static int
91i386fbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
92{
93 /* The following is true for FreeBSD 4.7:
94
95 The pcb contains %eip, %ebx, %esp, %ebp, %esi, %edi and %gs.
96 This accounts for all callee-saved registers specified by the
97 psABI and then some. Here %esp contains the stack pointer at the
98 point just after the call to cpu_switch(). From this information
99 we reconstruct the register state as it would look when we just
100 returned from cpu_switch(). */
101
102 /* The stack pointer shouldn't be zero. */
103 if (pcb->pcb_esp == 0)
104 return 0;
105
106 pcb->pcb_esp += 4;
107 regcache_raw_supply (regcache, I386_EDI_REGNUM, &pcb->pcb_edi);
108 regcache_raw_supply (regcache, I386_ESI_REGNUM, &pcb->pcb_esi);
109 regcache_raw_supply (regcache, I386_EBP_REGNUM, &pcb->pcb_ebp);
110 regcache_raw_supply (regcache, I386_ESP_REGNUM, &pcb->pcb_esp);
111 regcache_raw_supply (regcache, I386_EBX_REGNUM, &pcb->pcb_ebx);
112 regcache_raw_supply (regcache, I386_EIP_REGNUM, &pcb->pcb_eip);
113 regcache_raw_supply (regcache, I386_GS_REGNUM, &pcb->pcb_gs);
114
115 return 1;
116}
117\f
118
119/* Prevent warning from -Wmissing-prototypes. */
120void _initialize_i386fbsd_nat (void);
121
25630444
MK
122void
123_initialize_i386fbsd_nat (void)
124{
9692934b
MK
125 struct target_ops *t;
126
127 /* Add some extra features to the common *BSD/i386 target. */
128 t = i386bsd_target ();
9bb9e8ad
PM
129
130#ifdef HAVE_PT_GETDBREGS
131
df7e5265 132 x86_use_watchpoints (t);
9bb9e8ad 133
df7e5265
GB
134 x86_dr_low.set_control = i386bsd_dr_set_control;
135 x86_dr_low.set_addr = i386bsd_dr_set_addr;
136 x86_dr_low.get_addr = i386bsd_dr_get_addr;
137 x86_dr_low.get_status = i386bsd_dr_get_status;
138 x86_dr_low.get_control = i386bsd_dr_get_control;
139 x86_set_debug_register_length (4);
9bb9e8ad
PM
140
141#endif /* HAVE_PT_GETDBREGS */
142
143
9692934b
MK
144 t->to_resume = i386fbsd_resume;
145 t->to_pid_to_exec_file = fbsd_pid_to_exec_file;
146 t->to_find_memory_regions = fbsd_find_memory_regions;
9692934b
MK
147 add_target (t);
148
771e236c
MK
149 /* Support debugging kernel virtual memory images. */
150 bsd_kvm_add_target (i386fbsd_supply_pcb);
151
cf424aef
JB
152#ifdef KERN_PROC_SIGTRAMP
153 /* Normally signal frames are detected via i386fbsd_sigtramp_p.
154 However, FreeBSD 9.2 through 10.1 do not include the page holding
155 the signal code in core dumps. These releases do provide a
156 kern.proc.sigtramp.<pid> sysctl that returns the location of the
157 signal trampoline for a running process. We fetch the location
158 of the current (gdb) process and use this to identify signal
159 frames in core dumps from these releases. */
25630444 160 {
cf424aef
JB
161 int mib[4];
162 struct kinfo_sigtramp kst;
25630444
MK
163 size_t len;
164
165 mib[0] = CTL_KERN;
cf424aef
JB
166 mib[1] = KERN_PROC;
167 mib[2] = KERN_PROC_SIGTRAMP;
168 mib[3] = getpid ();
169 len = sizeof (kst);
170 if (sysctl (mib, 4, &kst, &len, NULL, 0) == 0)
25630444 171 {
cf424aef
JB
172 i386fbsd_sigtramp_start_addr = (uintptr_t) kst.ksigtramp_start;
173 i386fbsd_sigtramp_end_addr = (uintptr_t) kst.ksigtramp_end;
25630444
MK
174 }
175 }
176#endif
177}
This page took 1.738165 seconds and 4 git commands to generate.