gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / i386-obsd-nat.c
CommitLineData
baadce09 1/* Native-dependent code for OpenBSD/i386.
5d93ae8c 2
b811d2c2 3 Copyright (C) 2002-2020 Free Software Foundation, Inc.
baadce09
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
baadce09
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/>. */
baadce09
MK
19
20#include "defs.h"
5d0fc17b
MK
21#include "gdbcore.h"
22#include "regcache.h"
23#include "target.h"
baadce09 24
baadce09 25#include <sys/sysctl.h>
5d0fc17b
MK
26#include <machine/frame.h>
27#include <machine/pcb.h>
baadce09 28
e2dbbd2d 29#include "i386-tdep.h"
03b62bbb 30#include "i386-bsd-nat.h"
a900370f 31#include "obsd-nat.h"
5d0fc17b
MK
32#include "bsd-kvm.h"
33
34static int
35i386obsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
36{
ac7936df 37 struct gdbarch *gdbarch = regcache->arch ();
e17a4113 38 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5d0fc17b
MK
39 struct switchframe sf;
40
41 /* The following is true for OpenBSD 3.6:
42
43 The pcb contains %esp and %ebp at the point of the context switch
44 in cpu_switch(). At that point we have a stack frame as
45 described by `struct switchframe', which for OpenBSD 3.6 has the
46 following layout:
47
48 interrupt level
49 %edi
50 %esi
51 %ebx
52 %eip
53
54 we reconstruct the register state as it would look when we just
55 returned from cpu_switch(). */
56
57 /* The stack pointer shouldn't be zero. */
58 if (pcb->pcb_esp == 0)
59 return 0;
60
61 /* Read the stack frame, and check its validity. We do this by
62 checking if the saved interrupt priority level in the stack frame
63 looks reasonable.. */
f73a15e4
MK
64#ifdef PCB_SAVECTX
65 if ((pcb->pcb_flags & PCB_SAVECTX) == 0)
5d0fc17b
MK
66 {
67 /* Yes, we have a frame that matches cpu_switch(). */
b72a7981 68 read_memory (pcb->pcb_esp, (gdb_byte *) &sf, sizeof sf);
5d0fc17b 69 pcb->pcb_esp += sizeof (struct switchframe);
73e1c03f
SM
70 regcache->raw_supply (I386_EDI_REGNUM, &sf.sf_edi);
71 regcache->raw_supply (I386_ESI_REGNUM, &sf.sf_esi);
72 regcache->raw_supply (I386_EBX_REGNUM, &sf.sf_ebx);
73 regcache->raw_supply (I386_EIP_REGNUM, &sf.sf_eip);
5d0fc17b
MK
74 }
75 else
f73a15e4 76#endif
5d0fc17b
MK
77 {
78 /* No, the pcb must have been last updated by savectx(). */
f73a15e4 79 pcb->pcb_esp = pcb->pcb_ebp;
e17a4113
UW
80 pcb->pcb_ebp = read_memory_integer(pcb->pcb_esp, 4, byte_order);
81 sf.sf_eip = read_memory_integer(pcb->pcb_esp + 4, 4, byte_order);
73e1c03f 82 regcache->raw_supply (I386_EIP_REGNUM, &sf.sf_eip);
5d0fc17b
MK
83 }
84
73e1c03f
SM
85 regcache->raw_supply (I386_EBP_REGNUM, &pcb->pcb_ebp);
86 regcache->raw_supply (I386_ESP_REGNUM, &pcb->pcb_esp);
5d0fc17b
MK
87
88 return 1;
89}
baadce09 90
f6ac5f3d
PA
91static i386_bsd_nat_target<obsd_nat_target> the_i386_obsd_nat_target;
92
6c265988 93void _initialize_i386obsd_nat ();
baadce09 94void
6c265988 95_initialize_i386obsd_nat ()
baadce09 96{
d9f719f1 97 add_inf_child_target (&i386_obsd_nat_target);
5d0fc17b
MK
98
99 /* Support debugging kernel virtual memory images. */
100 bsd_kvm_add_target (i386obsd_supply_pcb);
101
baadce09
MK
102 /* OpenBSD provides a vm.psstrings sysctl that we can use to locate
103 the sigtramp. That way we can still recognize a sigtramp if its
104 location is changed in a new kernel. This is especially
105 important for OpenBSD, since it uses a different memory layout
106 than NetBSD, yet we cannot distinguish between the two.
107
108 Of course this is still based on the assumption that the sigtramp
109 is placed directly under the location where the program arguments
110 and environment can be found. */
111#ifdef VM_PSSTRINGS
112 {
113 struct _ps_strings _ps;
114 int mib[2];
115 size_t len;
116
baadce09
MK
117 mib[0] = CTL_VM;
118 mib[1] = VM_PSSTRINGS;
119 len = sizeof (_ps);
120 if (sysctl (mib, 2, &_ps, &len, NULL, 0) == 0)
121 {
57ac95b8
MK
122 i386obsd_sigtramp_start_addr = (u_long) _ps.val - 128;
123 i386obsd_sigtramp_end_addr = (u_long) _ps.val;
baadce09
MK
124 }
125 }
126#endif
127}
This page took 1.458131 seconds and 4 git commands to generate.