Add myself to gdb/MAINTAINERS
[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
baadce09
MK
93void
94_initialize_i386obsd_nat (void)
95{
d9f719f1 96 add_inf_child_target (&i386_obsd_nat_target);
5d0fc17b
MK
97
98 /* Support debugging kernel virtual memory images. */
99 bsd_kvm_add_target (i386obsd_supply_pcb);
100
baadce09
MK
101 /* OpenBSD provides a vm.psstrings sysctl that we can use to locate
102 the sigtramp. That way we can still recognize a sigtramp if its
103 location is changed in a new kernel. This is especially
104 important for OpenBSD, since it uses a different memory layout
105 than NetBSD, yet we cannot distinguish between the two.
106
107 Of course this is still based on the assumption that the sigtramp
108 is placed directly under the location where the program arguments
109 and environment can be found. */
110#ifdef VM_PSSTRINGS
111 {
112 struct _ps_strings _ps;
113 int mib[2];
114 size_t len;
115
baadce09
MK
116 mib[0] = CTL_VM;
117 mib[1] = VM_PSSTRINGS;
118 len = sizeof (_ps);
119 if (sysctl (mib, 2, &_ps, &len, NULL, 0) == 0)
120 {
57ac95b8
MK
121 i386obsd_sigtramp_start_addr = (u_long) _ps.val - 128;
122 i386obsd_sigtramp_end_addr = (u_long) _ps.val;
baadce09
MK
123 }
124 }
125#endif
126}
This page took 1.458197 seconds and 4 git commands to generate.