* README: Mention gdbserver/README.
[deliverable/binutils-gdb.git] / gdb / i386nbsd-nat.c
CommitLineData
9062529b
MK
1/* Native-dependent code for NetBSD/i386.
2
9b254dd1 3 Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
9062529b
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
9062529b
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/>. */
9062529b
MK
19
20#include "defs.h"
21#include "gdbcore.h"
22#include "regcache.h"
9692934b 23#include "target.h"
9062529b
MK
24
25#include "i386-tdep.h"
9692934b 26#include "i386bsd-nat.h"
9062529b
MK
27
28/* Support for debugging kernel virtual memory images. */
29
30#include <sys/types.h>
31#include <machine/frame.h>
32#include <machine/pcb.h>
33
84c5b489 34#include "nbsd-nat.h"
9062529b
MK
35#include "bsd-kvm.h"
36
37static int
38i386nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
39{
40 struct switchframe sf;
41
42 /* The following is true for NetBSD 1.6.2:
43
44 The pcb contains %esp and %ebp at the point of the context switch
45 in cpu_switch(). At that point we have a stack frame as
46 described by `struct switchframe', which for NetBSD 1.6.2 has the
47 following layout:
48
49 interrupt level
50 %edi
51 %esi
52 %ebx
53 %eip
54
55 we reconstruct the register state as it would look when we just
56 returned from cpu_switch(). */
57
58 /* The stack pointer shouldn't be zero. */
59 if (pcb->pcb_esp == 0)
60 return 0;
61
df80278b 62 read_memory (pcb->pcb_esp, (gdb_byte *)&sf, sizeof sf);
9062529b
MK
63 pcb->pcb_esp += sizeof (struct switchframe);
64 regcache_raw_supply (regcache, I386_EDI_REGNUM, &sf.sf_edi);
65 regcache_raw_supply (regcache, I386_ESI_REGNUM, &sf.sf_esi);
66 regcache_raw_supply (regcache, I386_EBP_REGNUM, &pcb->pcb_ebp);
67 regcache_raw_supply (regcache, I386_ESP_REGNUM, &pcb->pcb_esp);
68 regcache_raw_supply (regcache, I386_EBX_REGNUM, &sf.sf_ebx);
69 regcache_raw_supply (regcache, I386_EIP_REGNUM, &sf.sf_eip);
70
71 return 1;
72}
73\f
74
75/* Provide a prototype to silence -Wmissing-prototypes. */
76void _initialize_i386nbsd_nat (void);
77
78void
79_initialize_i386nbsd_nat (void)
80{
84c5b489 81 struct target_ops *t;
9692934b 82
84c5b489
MK
83 /* Add some extra features to the common *BSD/i386 target. */
84 t = i386bsd_target ();
85 t->to_pid_to_exec_file = nbsd_pid_to_exec_file;
86 add_target (t);
87
9062529b
MK
88 /* Support debugging kernel virtual memory images. */
89 bsd_kvm_add_target (i386nbsd_supply_pcb);
90}
This page took 0.264929 seconds and 4 git commands to generate.