windows-nat: Don't change current_event.dwThreadId in handle_output_debug_string()
[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
97de3545
JB
119#ifdef PT_GETXSTATE_INFO
120/* Implement the to_read_description method. */
121
122static const struct target_desc *
123i386fbsd_read_description (struct target_ops *ops)
124{
125 static int xsave_probed;
126 static uint64_t xcr0;
127
128 if (!xsave_probed)
129 {
130 struct ptrace_xstate_info info;
131
132 if (ptrace (PT_GETXSTATE_INFO, ptid_get_pid (inferior_ptid),
133 (PTRACE_TYPE_ARG3) &info, sizeof (info)) == 0)
134 {
135 i386bsd_xsave_len = info.xsave_len;
136 xcr0 = info.xsave_mask;
137 }
138 xsave_probed = 1;
139 }
140
141 if (i386bsd_xsave_len != 0)
142 {
143 return i386_target_description (xcr0);
144 }
145 else
146 return tdesc_i386;
147}
148#endif
149
2e0c3539
MK
150/* Prevent warning from -Wmissing-prototypes. */
151void _initialize_i386fbsd_nat (void);
152
25630444
MK
153void
154_initialize_i386fbsd_nat (void)
155{
9692934b
MK
156 struct target_ops *t;
157
158 /* Add some extra features to the common *BSD/i386 target. */
159 t = i386bsd_target ();
9bb9e8ad
PM
160
161#ifdef HAVE_PT_GETDBREGS
162
df7e5265 163 x86_use_watchpoints (t);
9bb9e8ad 164
df7e5265
GB
165 x86_dr_low.set_control = i386bsd_dr_set_control;
166 x86_dr_low.set_addr = i386bsd_dr_set_addr;
167 x86_dr_low.get_addr = i386bsd_dr_get_addr;
168 x86_dr_low.get_status = i386bsd_dr_get_status;
169 x86_dr_low.get_control = i386bsd_dr_get_control;
170 x86_set_debug_register_length (4);
9bb9e8ad
PM
171
172#endif /* HAVE_PT_GETDBREGS */
173
97de3545
JB
174#ifdef PT_GETXSTATE_INFO
175 t->to_read_description = i386fbsd_read_description;
176#endif
9bb9e8ad 177
9692934b
MK
178 t->to_resume = i386fbsd_resume;
179 t->to_pid_to_exec_file = fbsd_pid_to_exec_file;
180 t->to_find_memory_regions = fbsd_find_memory_regions;
9692934b
MK
181 add_target (t);
182
771e236c
MK
183 /* Support debugging kernel virtual memory images. */
184 bsd_kvm_add_target (i386fbsd_supply_pcb);
185
cf424aef
JB
186#ifdef KERN_PROC_SIGTRAMP
187 /* Normally signal frames are detected via i386fbsd_sigtramp_p.
188 However, FreeBSD 9.2 through 10.1 do not include the page holding
189 the signal code in core dumps. These releases do provide a
190 kern.proc.sigtramp.<pid> sysctl that returns the location of the
191 signal trampoline for a running process. We fetch the location
192 of the current (gdb) process and use this to identify signal
193 frames in core dumps from these releases. */
25630444 194 {
cf424aef
JB
195 int mib[4];
196 struct kinfo_sigtramp kst;
25630444
MK
197 size_t len;
198
199 mib[0] = CTL_KERN;
cf424aef
JB
200 mib[1] = KERN_PROC;
201 mib[2] = KERN_PROC_SIGTRAMP;
202 mib[3] = getpid ();
203 len = sizeof (kst);
204 if (sysctl (mib, 4, &kst, &len, NULL, 0) == 0)
25630444 205 {
cf424aef
JB
206 i386fbsd_sigtramp_start_addr = (uintptr_t) kst.ksigtramp_start;
207 i386fbsd_sigtramp_end_addr = (uintptr_t) kst.ksigtramp_end;
25630444
MK
208 }
209 }
210#endif
211}
This page took 1.133927 seconds and 4 git commands to generate.