* stabs.texinfo (Negative Type Numbers): FORTRAN LOGICAL fix.
[deliverable/binutils-gdb.git] / gdb / convex-xdep.c
CommitLineData
b28d3617
JG
1/* Convex host-dependent code for GDB.
2 Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
dd3b648e
RP
3
4This file is part of GDB.
5
99a7de40 6This program is free software; you can redistribute it and/or modify
dd3b648e 7it under the terms of the GNU General Public License as published by
99a7de40
JG
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
dd3b648e 10
99a7de40 11This program is distributed in the hope that it will be useful,
dd3b648e
RP
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
99a7de40
JG
17along with this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
dd3b648e 19
dd3b648e 20#include "defs.h"
dd3b648e
RP
21#include "command.h"
22#include "symtab.h"
23#include "value.h"
24#include "frame.h"
25#include "inferior.h"
26#include "wait.h"
27
28#include <signal.h>
29#include <fcntl.h>
30#include "gdbcore.h"
31
32#include <sys/param.h>
33#include <sys/dir.h>
34#include <sys/user.h>
35#include <sys/ioctl.h>
36#include <sys/pcntl.h>
37#include <sys/thread.h>
38#include <sys/proc.h>
39#include <sys/file.h>
40#include <sys/stat.h>
41#include <sys/mman.h>
42
43#include <convex/vmparam.h>
44#include <convex/filehdr.h>
45#include <convex/opthdr.h>
46#include <convex/scnhdr.h>
47#include <convex/core.h>
48
49/* Per-thread data, read from the inferior at each stop and written
50 back at each resume. */
51
52/* Number of active threads.
53 Tables are valid for thread numbers less than this. */
54
55static int n_threads;
56
57#define MAXTHREADS 8
58
59/* Thread state. The remaining data is valid only if this is PI_TALIVE. */
60
61static int thread_state[MAXTHREADS];
62
63/* Stop pc, signal, signal subcode */
64
65static int thread_pc[MAXTHREADS];
66static int thread_signal[MAXTHREADS];
67static int thread_sigcode[MAXTHREADS];
68
69/* Thread registers.
70 If thread is selected, the regs are in registers[] instead. */
71
72static char thread_regs[MAXTHREADS][REGISTER_BYTES];
73
74/* 1 if the top frame on the thread's stack was a context frame,
75 meaning that the kernel is up to something and we should not
76 touch the thread at all except to resume it. */
77
78static char thread_is_in_kernel[MAXTHREADS];
79
80/* The currently selected thread's number. */
81
82static int inferior_thread;
83
84/* Inferior process's file handle and a process control block
85 to feed args to ioctl with. */
86
87static int inferior_fd;
88static struct pcntl ps;
89
90/* SOFF file headers for exec or core file. */
91
92static FILEHDR filehdr;
93static OPTHDR opthdr;
94static SCNHDR scnhdr;
95
96/* Address maps constructed from section headers of exec and core files.
97 Defines process address -> file address translation. */
98
99struct pmap
100{
101 long mem_addr; /* process start address */
102 long mem_end; /* process end+1 address */
103 long file_addr; /* file start address */
104 long thread; /* -1 shared; 0,1,... thread-local */
105 long type; /* S_TEXT S_DATA S_BSS S_TBSS etc */
106 long which; /* used to sort map for info files */
107};
108
109static int n_exec, n_core;
110static struct pmap exec_map[100];
111static struct pmap core_map[100];
112
113/* Offsets in the core file of core_context and core_tcontext blocks. */
114
115static int context_offset;
116static int tcontext_offset[MAXTHREADS];
117
118/* Core file control blocks. */
119
120static struct core_context_v70 c;
121static struct core_tcontext_v70 tc;
122static struct user u;
123static thread_t th;
124static proc_t pr;
125
126/* The registers of the currently selected thread. */
127
128extern char registers[REGISTER_BYTES];
129
130/* Vector and communication registers from core dump or from inferior.
131 These are read on demand, ie, not normally valid. */
132
133static struct vecst vector_registers;
134static struct creg_ctx comm_registers;
135
136/* Flag, set on a vanilla CONT command and cleared when the inferior
137 is continued. */
138
139static int all_continue;
140
141/* Flag, set when the inferior is continued by a vanilla CONT command,
142 cleared if it is continued for any other purpose. */
143
144static int thread_switch_ok;
145
146/* Stack of signals recieved from threads but not yet delivered to gdb. */
147
148struct threadpid
149{
150 int pid;
151 int thread;
152 int signo;
153 int subsig;
154 int pc;
155};
156
157static struct threadpid signal_stack_bot[100];
158static struct threadpid *signal_stack = signal_stack_bot;
159
160/* How to detect empty stack -- bottom frame is all zero. */
161
162#define signal_stack_is_empty() (signal_stack->pid == 0)
163
164/* Mode controlled by SET PIPE command, controls the psw SEQ bit
165 which forces each instruction to complete before the next one starts. */
166
167static int sequential = 0;
168
169/* Mode controlled by the SET PARALLEL command. Values are:
170 0 concurrency limit 1 thread, dynamic scheduling
171 1 no concurrency limit, dynamic scheduling
172 2 no concurrency limit, fixed scheduling */
173
174static int parallel = 1;
175
176/* Mode controlled by SET BASE command, output radix for unformatted
177 integer typeout, as in argument lists, aggregates, and so on.
178 Zero means guess whether it's an address (hex) or not (decimal). */
179
180static int output_radix = 0;
181
182/* Signal subcode at last thread stop. */
183
184static int stop_sigcode;
185
186/* Hack, see wait() below. */
187
188static int exec_trap_timer;
189
190#include "gdbcmd.h"
191
dd3b648e
RP
192static struct type *vector_type ();
193static long *read_vector_register ();
194static long *read_vector_register_1 ();
195static void write_vector_register ();
196static REGISTER_TYPE read_comm_register ();
197static void write_comm_register ();
198static void convex_cont_command ();
199static void thread_continue ();
200static void select_thread ();
201static void scan_stack ();
202static void set_fixed_scheduling ();
203static char *subsig_name ();
204static void psw_info ();
205static sig_noop ();
206static ptr_cmp ();
207
dd3b648e
RP
208\f
209/* Execute ptrace. Convex V7 replaced ptrace with pattach.
210 Allow ptrace (0) as a no-op. */
211
212int
213call_ptrace (request, pid, procaddr, buf)
e676a15f
FF
214 int request, pid;
215 PTRACE_ARG3_TYPE procaddr;
216 int buf;
dd3b648e
RP
217{
218 if (request == 0)
219 return;
220 error ("no ptrace");
221}
222
223/* Replacement for system execle routine.
224 Convert it to an equivalent exect, which pattach insists on. */
225
226execle (name, argv)
227 char *name, *argv;
228{
229 char ***envp = (char ***) &argv;
230 while (*envp++) ;
231
232 signal (SIGTRAP, sig_noop);
233 exect (name, &argv, *envp);
234}
235
236/* Stupid handler for stupid trace trap that otherwise causes
237 startup to stupidly hang. */
238
239static sig_noop ()
240{}
241
242/* Read registers from inferior into registers[] array.
243 For convex, they are already there, read in when the inferior stops. */
244
245void
246fetch_inferior_registers (regno)
247 int regno;
248{
249}
250
251/* Store our register values back into the inferior.
252 For Convex, do this only once, right before resuming inferior. */
253
1ab3bf1b 254void
dd3b648e
RP
255store_inferior_registers (regno)
256 int regno;
257{
258}
259
260/* Copy LEN bytes from inferior's memory starting at MEMADDR
261 to debugger memory starting at MYADDR.
262 On failure (cannot read from inferior, usually because address is out
263 of bounds) returns the value of errno. */
264
265int
266read_inferior_memory (memaddr, myaddr, len)
267 CORE_ADDR memaddr;
268 char *myaddr;
269 int len;
270{
271 errno = 0;
272 while (len > 0)
273 {
274 /* little-known undocumented max request size */
275 int i = (len < 12288) ? len : 12288;
276
277 lseek (inferior_fd, memaddr, 0);
278 read (inferior_fd, myaddr, i);
279
280 memaddr += i;
281 myaddr += i;
282 len -= i;
283 }
284 if (errno)
285 bzero (myaddr, len);
286 return errno;
287}
288
289/* Copy LEN bytes of data from debugger memory at MYADDR
290 to inferior's memory at MEMADDR.
291 Returns errno on failure (cannot write the inferior) */
292
293int
294write_inferior_memory (memaddr, myaddr, len)
295 CORE_ADDR memaddr;
296 char *myaddr;
297 int len;
298{
299 errno = 0;
300 lseek (inferior_fd, memaddr, 0);
301 write (inferior_fd, myaddr, len);
302 return errno;
303}
304
305/* Here from create_inferior when the inferior process has been created
306 and started up. We must do a pattach to grab it for debugging.
307
308 Also, intercept the CONT command by altering its dispatch address. */
309
310create_inferior_hook (pid)
311 int pid;
312{
313 static char cont[] = "cont";
314 static char cont1[] = "c";
315 char *linep = cont;
316 char *linep1 = cont1;
317 char **line = &linep;
318 char **line1 = &linep1;
319 struct cmd_list_element *c;
320
321 c = lookup_cmd (line, cmdlist, "", 0);
322 c->function = convex_cont_command;
323 c = lookup_cmd (line1, cmdlist, "", 0);
324 c->function = convex_cont_command;
325
326 inferior_fd = pattach (pid, O_EXCL);
327 if (inferior_fd < 0)
328 perror_with_name ("pattach");
329 inferior_thread = 0;
330 set_fixed_scheduling (pid, parallel == 2);
331}
332
333/* Attach process PID for debugging. */
334
335attach (pid)
336 int pid;
337{
338 int fd = pattach (pid, O_EXCL);
339 if (fd < 0)
340 perror_with_name ("pattach");
341 attach_flag = 1;
342 /* wait for strange kernel reverberations to go away */
343 sleep (1);
344
345 setpgrp (pid, pid);
346
347 inferior_fd = fd;
348 inferior_thread = 0;
349 return pid;
350}
351
352/* Stop debugging the process whose number is PID
353 and continue it with signal number SIGNAL.
354 SIGNAL = 0 means just continue it. */
355
356void
357detach (signal)
358 int signal;
359{
360 signal_stack = signal_stack_bot;
361 thread_continue (-1, 0, signal);
362 ioctl (inferior_fd, PIXDETACH, &ps);
363 close (inferior_fd);
364 inferior_fd = 0;
365 attach_flag = 0;
366}
367
368/* Kill off the inferior process. */
369
370kill_inferior ()
371{
372 if (inferior_pid == 0)
373 return;
374 ioctl (inferior_fd, PIXTERMINATE, 0);
375 wait (0);
376 target_mourn_inferior ();
377}
378
dd3b648e
RP
379/* Read vector register REG, and return a pointer to the value. */
380
381static long *
382read_vector_register (reg)
383 int reg;
384{
385 if (have_inferior_p ())
386 {
387 errno = 0;
388 ps.pi_buffer = (char *) &vector_registers;
389 ps.pi_nbytes = sizeof vector_registers;
390 ps.pi_offset = 0;
391 ps.pi_thread = inferior_thread;
392 ioctl (inferior_fd, PIXRDVREGS, &ps);
393 if (errno)
394 bzero (&vector_registers, sizeof vector_registers);
395 }
396 else if (corechan >= 0)
397 {
398 lseek (corechan, tcontext_offset[inferior_thread], 0);
399 if (myread (corechan, &tc, sizeof tc) < 0)
400 perror_with_name (corefile);
401 lseek (corechan, tc.core_thread_p, 0);
402 if (myread (corechan, &th, sizeof th) < 0)
403 perror_with_name (corefile);
404 lseek (corechan, tc.core_vregs_p, 0);
405 if (myread (corechan, &vector_registers, 16*128) < 0)
406 perror_with_name (corefile);
407 vector_registers.vm[0] = th.t_vect_ctx.vc_vm[0];
408 vector_registers.vm[1] = th.t_vect_ctx.vc_vm[1];
409 vector_registers.vls = th.t_vect_ctx.vc_vls;
410 }
411
412 return read_vector_register_1 (reg);
413}
414
415/* Return a pointer to vector register REG, which must already have been
416 fetched from the inferior or core file. */
417
418static long *
419read_vector_register_1 (reg)
420 int reg;
421{
422 switch (reg)
423 {
424 case VM_REGNUM:
425 return (long *) vector_registers.vm;
426 case VS_REGNUM:
427 return (long *) &vector_registers.vls;
428 case VL_REGNUM:
429 return 1 + (long *) &vector_registers.vls;
430 default:
431 return (long *) &vector_registers.vr[reg];
432 }
433}
434
435/* Write vector register REG, element ELEMENT, new value VAL.
436 NB: must use read-modify-write on the entire vector state,
437 since pattach does not do offsetted writes correctly. */
438
439static void
440write_vector_register (reg, element, val)
441 int reg, element;
442 REGISTER_TYPE val;
443{
444 if (have_inferior_p ())
445 {
446 errno = 0;
447 ps.pi_thread = inferior_thread;
448 ps.pi_offset = 0;
449 ps.pi_buffer = (char *) &vector_registers;
450 ps.pi_nbytes = sizeof vector_registers;
451
452 ioctl (inferior_fd, PIXRDVREGS, &ps);
453
454 switch (reg)
455 {
456 case VL_REGNUM:
457 vector_registers.vls =
458 (vector_registers.vls & 0xffffffff00000000LL)
459 + (unsigned long) val;
460 break;
461
462 case VS_REGNUM:
463 vector_registers.vls =
464 (val << 32) + (unsigned long) vector_registers.vls;
465 break;
466
467 default:
468 vector_registers.vr[reg].el[element] = val;
469 break;
470 }
471
472 ioctl (inferior_fd, PIXWRVREGS, &ps);
473
474 if (errno)
475 perror_with_name ("writing vector register");
476 }
477}
478
479/* Return the contents of communication register NUM. */
480
481static REGISTER_TYPE
482read_comm_register (num)
483 int num;
484{
485 if (have_inferior_p ())
486 {
487 ps.pi_buffer = (char *) &comm_registers;
488 ps.pi_nbytes = sizeof comm_registers;
489 ps.pi_offset = 0;
490 ps.pi_thread = inferior_thread;
491 ioctl (inferior_fd, PIXRDCREGS, &ps);
492 }
493 return comm_registers.crreg.r4[num];
494}
495
496/* Store a new value VAL into communication register NUM.
497 NB: Must use read-modify-write on the whole comm register set
498 since pattach does not do offsetted writes correctly. */
499
500static void
501write_comm_register (num, val)
502 int num;
503 REGISTER_TYPE val;
504{
505 if (have_inferior_p ())
506 {
507 ps.pi_buffer = (char *) &comm_registers;
508 ps.pi_nbytes = sizeof comm_registers;
509 ps.pi_offset = 0;
510 ps.pi_thread = inferior_thread;
511 ioctl (inferior_fd, PIXRDCREGS, &ps);
512 comm_registers.crreg.r4[num] = val;
513 ioctl (inferior_fd, PIXWRCREGS, &ps);
514 }
515}
516
517/* Resume execution of the inferior process.
518 If STEP is nonzero, single-step it.
519 If SIGNAL is nonzero, give it that signal. */
520
521void
522resume (step, signal)
523 int step;
524 int signal;
525{
526 errno = 0;
527 if (step || signal)
528 thread_continue (inferior_thread, step, signal);
529 else
530 thread_continue (-1, 0, 0);
531}
532
533/* Maybe resume some threads.
534 THREAD is which thread to resume, or -1 to resume them all.
535 STEP and SIGNAL are as in resume.
536
537 Global variable ALL_CONTINUE is set when we are here to do a
538 `cont' command; otherwise we may be doing `finish' or a call or
539 something else that will not tolerate an automatic thread switch.
540
541 If there are stopped threads waiting to deliver signals, and
542 ALL_CONTINUE, do not actually resume anything. gdb will do a wait
543 and see one of the stopped threads in the queue. */
544
545static void
546thread_continue (thread, step, signal)
547 int thread, step, signal;
548{
549 int n;
550
551 /* If we are to continue all threads, but not for the CONTINUE command,
552 pay no attention and continue only the selected thread. */
553
554 if (thread < 0 && ! all_continue)
555 thread = inferior_thread;
556
557 /* If we are not stepping, we have now executed the continue part
558 of a CONTINUE command. */
559
560 if (! step)
561 all_continue = 0;
562
563 /* Allow wait() to switch threads if this is an all-out continue. */
564
565 thread_switch_ok = thread < 0;
566
567 /* If there are threads queued up, don't resume. */
568
569 if (thread_switch_ok && ! signal_stack_is_empty ())
570 return;
571
572 /* OK, do it. */
573
574 for (n = 0; n < n_threads; n++)
575 if (thread_state[n] == PI_TALIVE)
576 {
577 select_thread (n);
578
579 if ((thread < 0 || n == thread) && ! thread_is_in_kernel[n])
580 {
581 /* Blam the trace bits in the stack's saved psws to match
582 the desired step mode. This is required so that
583 single-stepping a return doesn't restore a psw with a
584 clear trace bit and fly away, and conversely,
585 proceeding through a return in a routine that was
586 stepped into doesn't cause a phantom break by restoring
587 a psw with the trace bit set. */
588 scan_stack (PSW_T_BIT, step);
589 scan_stack (PSW_S_BIT, sequential);
590 }
591
592 ps.pi_buffer = registers;
593 ps.pi_nbytes = REGISTER_BYTES;
594 ps.pi_offset = 0;
595 ps.pi_thread = n;
596 if (! thread_is_in_kernel[n])
597 if (ioctl (inferior_fd, PIXWRREGS, &ps))
598 perror_with_name ("PIXWRREGS");
599
600 if (thread < 0 || n == thread)
601 {
602 ps.pi_pc = 1;
603 ps.pi_signo = signal;
604 if (ioctl (inferior_fd, step ? PIXSTEP : PIXCONTINUE, &ps) < 0)
605 perror_with_name ("PIXCONTINUE");
606 }
607 }
608
609 if (ioctl (inferior_fd, PIXRUN, &ps) < 0)
610 perror_with_name ("PIXRUN");
611}
612
613/* Replacement for system wait routine.
614
615 The system wait returns with one or more threads stopped by
616 signals. Put stopped threads on a stack and return them one by
617 one, so that it appears that wait returns one thread at a time.
618
619 Global variable THREAD_SWITCH_OK is set when gdb can tolerate wait
620 returning a new thread. If it is false, then only one thread is
621 running; we will do a real wait, the thread will do something, and
622 we will return that. */
623
624pid_t
625wait (w)
626 union wait *w;
627{
628 int pid;
629
630 if (!w)
631 return wait3 (0, 0, 0);
632
633 /* Do a real wait if we were told to, or if there are no queued threads. */
634
635 if (! thread_switch_ok || signal_stack_is_empty ())
636 {
637 int thread;
638
639 pid = wait3 (w, 0, 0);
640
641 if (!WIFSTOPPED (*w) || pid != inferior_pid)
642 return pid;
643
644 /* The inferior has done something and stopped. Read in all the
645 threads' registers, and queue up any signals that happened. */
646
647 if (ioctl (inferior_fd, PIXGETTHCOUNT, &ps) < 0)
648 perror_with_name ("PIXGETTHCOUNT");
649
650 n_threads = ps.pi_othdcnt;
651 for (thread = 0; thread < n_threads; thread++)
652 {
653 ps.pi_thread = thread;
654 if (ioctl (inferior_fd, PIXGETSUBCODE, &ps) < 0)
655 perror_with_name ("PIXGETSUBCODE");
656 thread_state[thread] = ps.pi_otstate;
657
658 if (ps.pi_otstate == PI_TALIVE)
659 {
660 select_thread (thread);
661 ps.pi_buffer = registers;
662 ps.pi_nbytes = REGISTER_BYTES;
663 ps.pi_offset = 0;
664 ps.pi_thread = thread;
665 if (ioctl (inferior_fd, PIXRDREGS, &ps) < 0)
666 perror_with_name ("PIXRDREGS");
667
668 registers_fetched ();
669
670 thread_pc[thread] = read_pc ();
671 thread_signal[thread] = ps.pi_osigno;
672 thread_sigcode[thread] = ps.pi_osigcode;
673
674 /* If the thread's stack has a context frame
675 on top, something fucked is going on. I do not
676 know what, but do I know this: the only thing you
677 can do with such a thread is continue it. */
678
679 thread_is_in_kernel[thread] =
680 ((read_register (PS_REGNUM) >> 25) & 3) == 0;
681
682 /* Signals push an extended frame and then fault
683 with a ridiculous pc. Pop the frame. */
684
685 if (thread_pc[thread] > STACK_END_ADDR)
686 {
687 POP_FRAME;
688 if (is_break_pc (thread_pc[thread]))
689 thread_pc[thread] = read_pc () - 2;
690 else
691 thread_pc[thread] = read_pc ();
692 write_register (PC_REGNUM, thread_pc[thread]);
693 }
694
695 if (ps.pi_osigno || ps.pi_osigcode)
696 {
697 signal_stack++;
698 signal_stack->pid = pid;
699 signal_stack->thread = thread;
700 signal_stack->signo = thread_signal[thread];
701 signal_stack->subsig = thread_sigcode[thread];
702 signal_stack->pc = thread_pc[thread];
703 }
704
705 /* The following hackery is caused by a unix 7.1 feature:
706 the inferior's fixed scheduling mode is cleared when
707 it execs the shell (since the shell is not a parallel
708 program). So, note the 5.4 trap we get when
709 the shell does its exec, then catch the 5.0 trap
710 that occurs when the debuggee starts, and set fixed
711 scheduling mode properly. */
712
713 if (ps.pi_osigno == 5 && ps.pi_osigcode == 4)
714 exec_trap_timer = 1;
715 else
716 exec_trap_timer--;
717
718 if (ps.pi_osigno == 5 && exec_trap_timer == 0)
719 set_fixed_scheduling (pid, parallel == 2);
720 }
721 }
722
723 if (signal_stack_is_empty ())
724 error ("no active threads?!");
725 }
726
727 /* Select the thread that stopped, and return *w saying why. */
728
729 select_thread (signal_stack->thread);
730
731 stop_signal = signal_stack->signo;
732 stop_sigcode = signal_stack->subsig;
733
734 WSETSTOP (*w, signal_stack->signo);
735 w->w_thread = signal_stack->thread;
736 return (signal_stack--)->pid;
737}
738
739/* Select thread THREAD -- its registers, stack, per-thread memory.
740 This is the only routine that may assign to inferior_thread
741 or thread_regs[]. */
742
743static void
744select_thread (thread)
745 int thread;
746{
747 if (thread == inferior_thread)
748 return;
749
750 bcopy (registers, thread_regs[inferior_thread], REGISTER_BYTES);
751 ps.pi_thread = inferior_thread = thread;
752 if (have_inferior_p ())
753 ioctl (inferior_fd, PISETRWTID, &ps);
754 bcopy (thread_regs[thread], registers, REGISTER_BYTES);
755}
756
757/* Routine to set or clear a psw bit in the psw and also all psws
758 saved on the stack. Quits when we get to a frame in which the
759 saved psw is correct. */
760
761static void
762scan_stack (bit, val)
763 long bit, val;
764{
765 long ps = read_register (PS_REGNUM);
766 long fp;
767 if (val ? !(ps & bit) : (ps & bit))
768 {
769 ps ^= bit;
770 write_register (PS_REGNUM, ps);
771
772 fp = read_register (FP_REGNUM);
773 while (fp & 0x80000000)
774 {
775 ps = read_memory_integer (fp + 4, 4);
776 if (val ? (ps & bit) : !(ps & bit))
777 break;
778 ps ^= bit;
779 write_memory (fp + 4, &ps, 4);
780 fp = read_memory_integer (fp + 8, 4);
781 }
782 }
783}
784
785/* Set fixed scheduling (alliant mode) of process PID to ARG (0 or 1). */
786
787static void
788set_fixed_scheduling (pid, arg)
789 int arg;
790{
791 struct pattributes pattr;
792 getpattr (pid, &pattr);
793 pattr.pattr_pfixed = arg;
794 setpattr (pid, &pattr);
795}
796\f
797void
798core_file_command (filename, from_tty)
799 char *filename;
800 int from_tty;
801{
802 int n;
803
804 /* Discard all vestiges of any previous core file
805 and mark data and stack spaces as empty. */
806
807 if (corefile)
808 free (corefile);
809 corefile = 0;
810
811 if (corechan >= 0)
812 close (corechan);
813 corechan = -1;
814
815 data_start = 0;
816 data_end = 0;
817 stack_start = STACK_END_ADDR;
818 stack_end = STACK_END_ADDR;
819 n_core = 0;
820
821 /* Now, if a new core file was specified, open it and digest it. */
822
823 if (filename)
824 {
825 filename = tilde_expand (filename);
826 make_cleanup (free, filename);
827
828 if (have_inferior_p ())
6fe90fc8 829 error ("To look at a core file, you must kill the program with \"kill\".");
dd3b648e
RP
830 corechan = open (filename, O_RDONLY, 0);
831 if (corechan < 0)
832 perror_with_name (filename);
833
834 if (myread (corechan, &filehdr, sizeof filehdr) < 0)
835 perror_with_name (filename);
836
837 if (!IS_CORE_SOFF_MAGIC (filehdr.h_magic))
838 error ("%s: not a core file.\n", filename);
839
840 if (myread (corechan, &opthdr, filehdr.h_opthdr) < 0)
841 perror_with_name (filename);
842
843 /* Read through the section headers.
844 For text, data, etc, record an entry in the core file map.
845 For context and tcontext, record the file address of
846 the context blocks. */
847
848 lseek (corechan, (long) filehdr.h_scnptr, 0);
849
850 n_threads = 0;
851 for (n = 0; n < filehdr.h_nscns; n++)
852 {
853 if (myread (corechan, &scnhdr, sizeof scnhdr) < 0)
854 perror_with_name (filename);
855 if ((scnhdr.s_flags & S_TYPMASK) >= S_TEXT
856 && (scnhdr.s_flags & S_TYPMASK) <= S_COMON)
857 {
858 core_map[n_core].mem_addr = scnhdr.s_vaddr;
859 core_map[n_core].mem_end = scnhdr.s_vaddr + scnhdr.s_size;
860 core_map[n_core].file_addr = scnhdr.s_scnptr;
861 core_map[n_core].type = scnhdr.s_flags & S_TYPMASK;
862 if (core_map[n_core].type != S_TBSS
863 && core_map[n_core].type != S_TDATA
864 && core_map[n_core].type != S_TTEXT)
865 core_map[n_core].thread = -1;
866 else if (n_core == 0
867 || core_map[n_core-1].mem_addr != scnhdr.s_vaddr)
868 core_map[n_core].thread = 0;
869 else
870 core_map[n_core].thread = core_map[n_core-1].thread + 1;
871 n_core++;
872 }
873 else if ((scnhdr.s_flags & S_TYPMASK) == S_CONTEXT)
874 context_offset = scnhdr.s_scnptr;
875 else if ((scnhdr.s_flags & S_TYPMASK) == S_TCONTEXT)
876 tcontext_offset[n_threads++] = scnhdr.s_scnptr;
877 }
878
879 /* Read the context block, struct user, struct proc,
880 and the comm regs. */
881
882 lseek (corechan, context_offset, 0);
883 if (myread (corechan, &c, sizeof c) < 0)
884 perror_with_name (filename);
885 lseek (corechan, c.core_user_p, 0);
886 if (myread (corechan, &u, sizeof u) < 0)
887 perror_with_name (filename);
888 lseek (corechan, c.core_proc_p, 0);
889 if (myread (corechan, &pr, sizeof pr) < 0)
890 perror_with_name (filename);
891 comm_registers = pr.p_creg;
892
893 /* Core file apparently is really there. Make it really exist
894 for xfer_core_file so we can do read_memory on it. */
895
896 if (filename[0] == '/')
897 corefile = savestring (filename, strlen (filename));
898 else
58ae87f6 899 corefile = concat (current_directory, "/", filename, NULL);
dd3b648e
RP
900
901 printf_filtered ("Program %s ", u.u_comm);
902
903 /* Read the thread registers and fill in the thread_xxx[] data. */
904
905 for (n = 0; n < n_threads; n++)
906 {
907 select_thread (n);
908
909 lseek (corechan, tcontext_offset[n], 0);
910 if (myread (corechan, &tc, sizeof tc) < 0)
911 perror_with_name (corefile);
912 lseek (corechan, tc.core_thread_p, 0);
913 if (myread (corechan, &th, sizeof th) < 0)
914 perror_with_name (corefile);
915
916 lseek (corechan, tc.core_syscall_context_p, 0);
917 if (myread (corechan, registers, REGISTER_BYTES) < 0)
918 perror_with_name (corefile);
919
920 thread_signal[n] = th.t_cursig;
921 thread_sigcode[n] = th.t_code;
922 thread_state[n] = th.t_state;
923 thread_pc[n] = read_pc ();
924
925 if (thread_pc[n] > STACK_END_ADDR)
926 {
927 POP_FRAME;
928 if (is_break_pc (thread_pc[n]))
929 thread_pc[n] = read_pc () - 2;
930 else
931 thread_pc[n] = read_pc ();
932 write_register (PC_REGNUM, thread_pc[n]);
933 }
934
935 printf_filtered ("thread %d received signal %d, %s\n",
936 n, thread_signal[n],
4ace50a5 937 safe_strsignal (thread_signal[n]));
dd3b648e
RP
938 }
939
940 /* Select an interesting thread -- also-rans died with SIGKILL,
941 so find one that didn't. */
942
943 for (n = 0; n < n_threads; n++)
944 if (thread_signal[n] != 0 && thread_signal[n] != SIGKILL)
945 {
946 select_thread (n);
947 stop_signal = thread_signal[n];
948 stop_sigcode = thread_sigcode[n];
949 break;
950 }
951
952 core_aouthdr.a_magic = 0;
953
954 flush_cached_frames ();
955 set_current_frame (create_new_frame (read_register (FP_REGNUM),
956 read_pc ()));
957 select_frame (get_current_frame (), 0);
958 validate_files ();
959
cadbb07a 960 print_stack_frame (selected_frame, selected_frame_level, -1);
dd3b648e
RP
961 }
962 else if (from_tty)
963 printf_filtered ("No core file now.\n");
964}
This page took 0.129523 seconds and 4 git commands to generate.