* hppa-dis.c (print_insn_hppa): Don't print '%' before register names.
[deliverable/binutils-gdb.git] / bfd / netbsd-core.c
CommitLineData
252b5132 1/* BFD back end for NetBSD style core files
9e7b37b3 2 Copyright 1988, 1989, 1991, 1992, 1993, 1996, 1998, 1999, 2000, 2001,
832bc186 3 2002, 2003, 2004, 2005
7898deda 4 Free Software Foundation, Inc.
252b5132
RH
5 Written by Paul Kranenburg, EUR
6
aca305d9 7 This file is part of BFD, the Binary File Descriptor library.
252b5132 8
aca305d9
NC
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
252b5132 13
aca305d9
NC
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
252b5132 18
aca305d9
NC
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
3e110533 21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
252b5132
RH
22
23#include "bfd.h"
24#include "sysdep.h"
25#include "libbfd.h"
aca305d9 26#include "libaout.h" /* BFD a.out internal data structures. */
252b5132
RH
27
28#include <sys/param.h>
29#include <sys/dir.h>
30#include <signal.h>
31#include <sys/core.h>
32
aca305d9
NC
33/* The machine ID for OpenBSD/sparc64 and older versions of
34 NetBSD/sparc64 overlaps with M_MIPS1. */
35#define M_SPARC64_OPENBSD M_MIPS1
252b5132 36
24d18d30
MK
37/* Offset of StackGhost cookie within `struct md_coredump' on
38 OpenBSD/sparc. */
8c101720
NC
39#define SPARC_WCOOKIE_OFFSET 344
40
41/* Offset of StackGhost cookie within `struct md_coredump' on
42 OpenBSD/sparc64. */
43#define SPARC64_WCOOKIE_OFFSET 832
24d18d30 44
aca305d9
NC
45struct netbsd_core_struct
46{
47 struct core core;
252b5132
RH
48} *rawptr;
49
252b5132
RH
50/* Handle NetBSD-style core dump file. */
51
252b5132 52static const bfd_target *
832bc186 53netbsd_core_file_p (bfd *abfd)
252b5132 54{
45ab555d
BE
55 int val;
56 unsigned i;
dc810e39 57 file_ptr offset;
021d7868 58 asection *asect;
dc810e39
AM
59 struct core core;
60 struct coreseg coreseg;
61 bfd_size_type amt = sizeof core;
62
832bc186 63 val = bfd_bread (&core, amt, abfd);
dc810e39
AM
64 if (val != sizeof core)
65 {
aca305d9 66 /* Too small to be a core file. */
dc810e39
AM
67 bfd_set_error (bfd_error_wrong_format);
68 return 0;
69 }
70
71 if (CORE_GETMAGIC (core) != COREMAGIC)
72 {
73 bfd_set_error (bfd_error_wrong_format);
74 return 0;
75 }
76
77 amt = sizeof (struct netbsd_core_struct);
78 rawptr = (struct netbsd_core_struct *) bfd_zalloc (abfd, amt);
79 if (rawptr == NULL)
9e7b37b3 80 return 0;
dc810e39
AM
81
82 rawptr->core = core;
83 abfd->tdata.netbsd_core_data = rawptr;
84
85 offset = core.c_hdrsize;
86 for (i = 0; i < core.c_nseg; i++)
87 {
9e7b37b3
AM
88 const char *sname;
89 flagword flags;
dc810e39
AM
90
91 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
92 goto punt;
93
832bc186 94 val = bfd_bread (&coreseg, sizeof coreseg, abfd);
dc810e39
AM
95 if (val != sizeof coreseg)
96 {
97 bfd_set_error (bfd_error_file_truncated);
98 goto punt;
252b5132 99 }
dc810e39
AM
100 if (CORE_GETMAGIC (coreseg) != CORESEGMAGIC)
101 {
102 bfd_set_error (bfd_error_wrong_format);
103 goto punt;
252b5132
RH
104 }
105
dc810e39
AM
106 offset += core.c_seghdrsize;
107
9e7b37b3 108 switch (CORE_GETFLAG (coreseg))
dc810e39 109 {
9e7b37b3
AM
110 case CORE_CPU:
111 sname = ".reg";
112 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
113 break;
114 case CORE_DATA:
115 sname = ".data";
116 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
117 break;
118 case CORE_STACK:
119 sname = ".stack";
120 flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
121 break;
122 default:
123 sname = ".unknown";
124 flags = SEC_ALLOC + SEC_HAS_CONTENTS;
125 break;
252b5132 126 }
9e7b37b3
AM
127 asect = bfd_make_section_anyway (abfd, sname);
128 if (asect == NULL)
129 goto punt;
252b5132 130
9e7b37b3 131 asect->flags = flags;
eea6121a 132 asect->size = coreseg.c_size;
dc810e39
AM
133 asect->vma = coreseg.c_addr;
134 asect->filepos = offset;
135 asect->alignment_power = 2;
9e7b37b3 136
8c101720 137 if (CORE_GETFLAG (coreseg) == CORE_CPU)
24d18d30 138 {
8c101720
NC
139 bfd_size_type wcookie_offset;
140
141 switch (CORE_GETMID (core))
142 {
143 case M_SPARC_NETBSD:
144 wcookie_offset = SPARC_WCOOKIE_OFFSET;
145 break;
146 case M_SPARC64_OPENBSD:
147 wcookie_offset = SPARC64_WCOOKIE_OFFSET;
148 break;
149 default:
150 wcookie_offset = 0;
151 break;
152 }
153
154 if (wcookie_offset > 0 && coreseg.c_size > wcookie_offset)
155 {
156 /* Truncate the .reg section. */
157 asect->size = wcookie_offset;
158
159 /* And create the .wcookie section. */
160 asect = bfd_make_section_anyway (abfd, ".wcookie");
161 if (asect == NULL)
162 goto punt;
163
164 asect->flags = SEC_ALLOC + SEC_HAS_CONTENTS;
165 asect->size = coreseg.c_size - wcookie_offset;
166 asect->vma = 0;
167 asect->filepos = offset + wcookie_offset;
168 asect->alignment_power = 2;
169 }
24d18d30
MK
170 }
171
dc810e39 172 offset += coreseg.c_size;
dc810e39
AM
173 }
174
d34436e8
MK
175 /* Set architecture from machine ID. */
176 switch (CORE_GETMID (core))
177 {
178 case M_ALPHA_NETBSD:
179 bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0);
180 break;
181
182 case M_ARM6_NETBSD:
183 bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_3);
184 break;
185
186 case M_X86_64_NETBSD:
187 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
188 break;
189
190 case M_386_NETBSD:
191 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386);
192 break;
193
194 case M_68K_NETBSD:
195 case M_68K4K_NETBSD:
196 bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0);
197 break;
198
199 case M_88K_OPENBSD:
200 bfd_default_set_arch_mach (abfd, bfd_arch_m88k, 0);
201 break;
202
203 case M_HPPA_OPENBSD:
204 bfd_default_set_arch_mach (abfd, bfd_arch_hppa, bfd_mach_hppa11);
205 break;
206
207 case M_POWERPC_NETBSD:
208 bfd_default_set_arch_mach (abfd, bfd_arch_powerpc, bfd_mach_ppc);
209 break;
210
211 case M_SPARC_NETBSD:
212 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
213 break;
214
215 case M_SPARC64_NETBSD:
216 case M_SPARC64_OPENBSD:
217 bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
218 break;
219
220 case M_VAX_NETBSD:
221 case M_VAX4K_NETBSD:
222 bfd_default_set_arch_mach (abfd, bfd_arch_vax, 0);
223 break;
224 }
d1ad3f6f 225
dc810e39
AM
226 /* OK, we believe you. You're a core file (sure, sure). */
227 return abfd->xvec;
228
229 punt:
9e7b37b3
AM
230 bfd_release (abfd, abfd->tdata.any);
231 abfd->tdata.any = NULL;
232 bfd_section_list_clear (abfd);
dc810e39 233 return 0;
252b5132
RH
234}
235
236static char*
832bc186 237netbsd_core_file_failing_command (bfd *abfd)
252b5132 238{
832bc186 239 /*return core_command (abfd);*/
252b5132
RH
240 return abfd->tdata.netbsd_core_data->core.c_name;
241}
242
252b5132 243static int
832bc186 244netbsd_core_file_failing_signal (bfd *abfd)
252b5132
RH
245{
246 /*return core_signal (abfd);*/
247 return abfd->tdata.netbsd_core_data->core.c_signo;
248}
249
b34976b6 250static bfd_boolean
832bc186
MK
251netbsd_core_file_matches_executable_p (bfd *core_bfd ATTRIBUTE_UNUSED,
252 bfd *exec_bfd ATTRIBUTE_UNUSED)
252b5132 253{
aca305d9
NC
254 /* FIXME, We have no way of telling at this point. */
255 return TRUE;
252b5132
RH
256}
257\f
258/* If somebody calls any byte-swapping routines, shoot them. */
aca305d9 259
252b5132 260static void
832bc186 261swap_abort (void)
252b5132 262{
aca305d9
NC
263 /* This way doesn't require any declaration for ANSI to fuck up. */
264 abort ();
252b5132 265}
aca305d9 266
edeb6e24
AM
267#define NO_GET ((bfd_vma (*) (const void *)) swap_abort)
268#define NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
269#define NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
8ce8c090
AM
270#define NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
271#define NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
272#define NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
252b5132
RH
273
274const bfd_target netbsd_core_vec =
275 {
276 "netbsd-core",
277 bfd_target_unknown_flavour,
aca305d9
NC
278 BFD_ENDIAN_UNKNOWN, /* Target byte order. */
279 BFD_ENDIAN_UNKNOWN, /* Target headers byte order. */
280 (HAS_RELOC | EXEC_P | /* Object flags. */
252b5132
RH
281 HAS_LINENO | HAS_DEBUG |
282 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
832bc186
MK
283 (SEC_HAS_CONTENTS | /* Section flags. */
284 SEC_ALLOC | SEC_LOAD | SEC_RELOC),
285 0, /* Symbol prefix. */
286 ' ', /* ar_pad_char. */
287 16, /* ar_max_namelen. */
8ce8c090 288 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit data. */
edeb6e24
AM
289 NO_GET, NO_GETS, NO_PUT, /* 32 bit data. */
290 NO_GET, NO_GETS, NO_PUT, /* 16 bit data. */
8ce8c090 291 NO_GET64, NO_GETS64, NO_PUT64, /* 64 bit hdrs. */
edeb6e24
AM
292 NO_GET, NO_GETS, NO_PUT, /* 32 bit hdrs. */
293 NO_GET, NO_GETS, NO_PUT, /* 16 bit hdrs. */
294
8ce8c090
AM
295 { /* bfd_check_format. */
296 _bfd_dummy_target, /* Unknown format. */
297 _bfd_dummy_target, /* Object file. */
298 _bfd_dummy_target, /* Archive. */
299 netbsd_core_file_p /* A core file. */
252b5132 300 },
aca305d9 301 { /* bfd_set_format. */
8ce8c090
AM
302 bfd_false, bfd_false,
303 bfd_false, bfd_false
252b5132 304 },
aca305d9 305 { /* bfd_write_contents. */
8ce8c090
AM
306 bfd_false, bfd_false,
307 bfd_false, bfd_false
252b5132 308 },
1518639e 309
8ce8c090
AM
310 BFD_JUMP_TABLE_GENERIC (_bfd_generic),
311 BFD_JUMP_TABLE_COPY (_bfd_generic),
312 BFD_JUMP_TABLE_CORE (netbsd),
313 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
314 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
315 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
316 BFD_JUMP_TABLE_WRITE (_bfd_generic),
317 BFD_JUMP_TABLE_LINK (_bfd_nolink),
318 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
252b5132 319
c3c89269 320 NULL,
1518639e 321
aca305d9 322 (PTR) 0 /* Backend_data. */
8ce8c090 323 };
This page took 0.334919 seconds and 4 git commands to generate.