Additions to support ELF formatted core files.
[deliverable/binutils-gdb.git] / gdb / procfs.c
CommitLineData
35f5886e
FF
1/* Machine independent support for SVR4 /proc (process file system) for GDB.
2 Copyright (C) 1991 Free Software Foundation, Inc.
3 Written by Fred Fish at Cygnus Support.
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21
22/* N O T E S
23
24For information on the details of using /proc consult section proc(4)
25in the UNIX System V Release 4 System Administrator's Reference Manual.
26
27The general register and floating point register sets are manipulated by
28separate ioctl's. This file makes the assumption that if FP0_REGNUM is
29defined, then support for the floating point register set is desired,
30regardless of whether or not the actual target has floating point hardware.
31
32 */
33
34
35
36#include "param.h"
37
38#ifdef USE_PROC_FS /* Entire file goes away if not using /proc */
39
40#include <stdio.h>
41#include <sys/procfs.h>
42#include <fcntl.h>
43#include <errno.h>
44
45#include "defs.h"
46#include "ansidecl.h"
47#include "inferior.h"
48#include "target.h"
49
50#ifndef PROC_NAME_FMT
51#define PROC_NAME_FMT "/proc/%d"
52#endif
53
54extern void EXFUN(supply_gregset, (gregset_t *gregsetp));
55extern void EXFUN(fill_gregset, (gregset_t *gresetp, int regno));
56
57#if defined (FP0_REGNUM)
58extern void EXFUN(supply_fpregset, (fpregset_t *fpregsetp));
59extern void EXFUN(fill_fpregset, (fpregset_t *fpresetp, int regno));
60#endif
61
62#if 1 /* FIXME: Gross and ugly hack to resolve coredep.c global */
63CORE_ADDR kernel_u_addr;
64#endif
65
66/* All access to the inferior, either one started by gdb or one that has
67 been attached to, is controlled by an instance of a procinfo structure,
68 defined below. Since gdb currently only handles one inferior at a time,
69 the procinfo structure is statically allocated and only one exists at
70 any given time. */
71
72struct procinfo {
73 int valid; /* Nonzero if pid, fd, & pathname are valid */
74 int pid; /* Process ID of inferior */
75 int fd; /* File descriptor for /proc entry */
76 char *pathname; /* Pathname to /proc entry */
77 int was_stopped; /* Nonzero if was stopped prior to attach */
78 prrun_t prrun; /* Control state when it is run */
79 prstatus_t prstatus; /* Current process status info */
80 gregset_t gregset; /* General register set */
81 fpregset_t fpregset; /* Floating point register set */
82 fltset_t fltset; /* Current traced hardware fault set */
83 sigset_t trace; /* Current traced signal set */
84 sysset_t exitset; /* Current traced system call exit set */
85 sysset_t entryset; /* Current traced system call entry set */
86} pi;
87
88/* Forward declarations of static functions so we don't have to worry
89 about ordering within this file. The EXFUN macro may be slightly
90 misleading. Should probably be called DCLFUN instead, or something
91 more intuitive, since it can be used for both static and external
92 definitions. */
93
94static void EXFUN(proc_init_failed, (char *why));
95static int EXFUN(open_proc_file, (int pid));
96static void EXFUN(close_proc_file, (void));
97static void EXFUN(unconditionally_kill_inferior, (void));
98
99/*
100
101GLOBAL FUNCTION
102
103 ptrace -- override library version to force errors for /proc version
104
105SYNOPSIS
106
107 int ptrace (int request, int pid, int arg3, int arg4)
108
109DESCRIPTION
110
111 When gdb is configured to use /proc, it should not be calling
112 or otherwise attempting to use ptrace. In order to catch errors
113 where use of /proc is configured, but some routine is still calling
114 ptrace, we provide a local version of a function with that name
115 that does nothing but issue an error message.
116*/
117
118int
119DEFUN(ptrace, (request, pid, arg3, arg4),
120 int request AND
121 int pid AND
122 int arg3 AND
123 int arg4)
124{
125 error ("internal error - there is a call to ptrace() somewhere");
126 /*NOTREACHED*/
127}
128
129/*
130
131GLOBAL FUNCTION
132
133 kill_inferior_fast -- kill inferior while gdb is exiting
134
135SYNOPSIS
136
137 void kill_inferior_fast (void)
138
139DESCRIPTION
140
141 This is used when GDB is exiting. It gives less chance of error.
142
143NOTES
144
145 Don't attempt to kill attached inferiors since we may be called
146 when gdb is in the process of aborting, and killing the attached
147 inferior may be very anti-social. This is particularly true if we
148 were attached just so we could use the /proc facilities to get
149 detailed information about it's status.
150
151*/
152
153void
154DEFUN_VOID(kill_inferior_fast)
155{
156 if (inferior_pid != 0 && !attach_flag)
157 {
158 unconditionally_kill_inferior ();
159 }
160}
161
162/*
163
164GLOBAL FUNCTION
165
166 kill_inferior - kill any currently inferior
167
168SYNOPSIS
169
170 void kill_inferior (void)
171
172DESCRIPTION
173
174 Kill any current inferior.
175
176NOTES
177
178 Kills even attached inferiors. Presumably the user has already
179 been prompted that the inferior is an attached one rather than
180 one started by gdb. (FIXME?)
181
182*/
183
184void
185DEFUN_VOID(kill_inferior)
186{
187 if (inferior_pid != 0)
188 {
189 unconditionally_kill_inferior ();
190 target_mourn_inferior ();
191 }
192}
193
194/*
195
196LOCAL FUNCTION
197
198 unconditionally_kill_inferior - terminate the inferior
199
200SYNOPSIS
201
202 static void unconditionally_kill_inferior (void)
203
204DESCRIPTION
205
206 Kill the current inferior. Should not be called until it
207 is at least tested that there is an inferior.
208
209NOTE
210
211 A possibly useful enhancement would be to first try sending
212 the inferior a terminate signal, politely asking it to commit
213 suicide, before we murder it.
214
215*/
216
217static void
218DEFUN_VOID(unconditionally_kill_inferior)
219{
220 int signo;
221
222 signo = SIGKILL;
223 (void) ioctl (pi.fd, PIOCKILL, &signo);
224 close_proc_file ();
225 wait ((int *) 0);
226}
227
228/*
229
230GLOBAL FUNCTION
231
232 child_xfer_memory -- copy data to or from inferior memory space
233
234SYNOPSIS
235
236 int child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
237 int dowrite, struct target_ops target)
238
239DESCRIPTION
240
241 Copy LEN bytes to/from inferior's memory starting at MEMADDR
242 from/to debugger memory starting at MYADDR. Copy from inferior
243 if DOWRITE is zero or to inferior if DOWRITE is nonzero.
244
245 Returns the length copied, which is either the LEN argument or
246 zero. This xfer function does not do partial moves, since child_ops
247 doesn't allow memory operations to cross below us in the target stack
248 anyway.
249
250NOTES
251
252 The /proc interface makes this an almost trivial task.
253 */
254
255
256int
257DEFUN(child_xfer_memory, (memaddr, myaddr, len, dowrite, target),
258 CORE_ADDR memaddr AND
259 char *myaddr AND
260 int len AND
261 int dowrite AND
262 struct target_ops target /* ignored */)
263{
264 int nbytes = 0;
265
266 if (lseek (pi.fd, (off_t) memaddr, 0) == (off_t) memaddr)
267 {
268 if (dowrite)
269 {
270 nbytes = write (pi.fd, myaddr, len);
271 }
272 else
273 {
274 nbytes = read (pi.fd, myaddr, len);
275 }
276 if (nbytes < 0)
277 {
278 nbytes = 0;
279 }
280 }
281 return (nbytes);
282}
283
284/*
285
286GLOBAL FUNCTION
287
288 store_inferior_registers -- copy register values back to inferior
289
290SYNOPSIS
291
292 void store_inferior_registers (int regno)
293
294DESCRIPTION
295
296 Store our current register values back into the inferior. If
297 REGNO is -1 then store all the register, otherwise store just
298 the value specified by REGNO.
299
300NOTES
301
302 If we are storing only a single register, we first have to get all
303 the current values from the process, overwrite the desired register
304 in the gregset with the one we want from gdb's registers, and then
305 send the whole set back to the process. For writing all the
306 registers, all we have to do is generate the gregset and send it to
307 the process.
308
309 Also note that the process has to be stopped on an event of interest
310 for this to work, which basically means that it has to have been
311 run under the control of one of the other /proc ioctl calls and not
312 ptrace. Since we don't use ptrace anyway, we don't worry about this
313 fine point, but it is worth noting for future reference.
314
315 Gdb is confused about what this function is supposed to return.
316 Some versions return a value, others return nothing. Some are
317 declared to return a value and actually return nothing. Gdb ignores
318 anything returned. (FIXME)
319
320 */
321
322void
323DEFUN(store_inferior_registers, (regno),
324 int regno)
325{
326 if (regno != -1)
327 {
328 (void) ioctl (pi.fd, PIOCGREG, &pi.gregset);
329 }
330 fill_gregset (&pi.gregset, regno);
331 (void) ioctl (pi.fd, PIOCSREG, &pi.gregset);
332
333#if defined (FP0_REGNUM)
334
335 /* Now repeat everything using the floating point register set, if the
336 target has floating point hardware. Since we ignore the returned value,
337 we'll never know whether it worked or not anyway. */
338
339 if (regno != -1)
340 {
341 (void) ioctl (pi.fd, PIOCGFPREG, &pi.fpregset);
342 }
343 fill_fpregset (&pi.fpregset, regno);
344 (void) ioctl (pi.fd, PIOCSFPREG, &pi.fpregset);
345
346#endif /* FP0_REGNUM */
347
348}
349
350/*
351
352GLOBAL FUNCTION
353
354 inferior_proc_init - initialize access to a /proc entry
355
356SYNOPSIS
357
358 void inferior_proc_init (int pid)
359
360DESCRIPTION
361
362 When gdb starts an inferior, this function is called in the parent
363 process immediately after the fork. It waits for the child to stop
364 on the return from the exec system call (the child itself takes care
365 of ensuring that this is set up), then sets up the set of signals
366 and faults that are to be traced.
367
368NOTES
369
370 If proc_init_failed ever gets called, control returns to the command
371 processing loop via the standard error handling code.
372 */
373
374void
375DEFUN(inferior_proc_init, (int pid),
376 int pid)
377{
378 if (!open_proc_file (pid))
379 {
380 proc_init_failed ("can't open process file");
381 }
382 else
383 {
384 (void) memset (&pi.prrun, 0, sizeof (pi.prrun));
385 prfillset (&pi.prrun.pr_trace);
386 prfillset (&pi.prrun.pr_fault);
387 prdelset (&pi.prrun.pr_fault, FLTPAGE);
388 if (ioctl (pi.fd, PIOCWSTOP, &pi.prstatus) < 0)
389 {
390 proc_init_failed ("PIOCWSTOP failed");
391 }
392 else if (ioctl (pi.fd, PIOCSTRACE, &pi.prrun.pr_trace) < 0)
393 {
394 proc_init_failed ("PIOCSTRACE failed");
395 }
396 else if (ioctl (pi.fd, PIOCSFAULT, &pi.prrun.pr_fault) < 0)
397 {
398 proc_init_failed ("PIOCSFAULT failed");
399 }
400 }
401}
402
403/*
404
405GLOBAL FUNCTION
406
407 proc_set_exec_trap -- arrange for exec'd child to halt at startup
408
409SYNOPSIS
410
411 void proc_set_exec_trap (void)
412
413DESCRIPTION
414
415 This function is called in the child process when starting up
416 an inferior, prior to doing the exec of the actual inferior.
417 It sets the child process's exitset to make exit from the exec
418 system call an event of interest to stop on, and then simply
419 returns. The child does the exec, the system call returns, and
420 the child stops at the first instruction, ready for the gdb
421 parent process to take control of it.
422
423NOTE
424
425 We need to use all local variables since the child may be sharing
426 it's data space with the parent, if vfork was used rather than
427 fork.
428 */
429
430void
431DEFUN_VOID(proc_set_exec_trap)
432{
433 sysset_t exitset;
434 auto char procname[32];
435 int fd;
436
437 (void) sprintf (procname, PROC_NAME_FMT, getpid ());
438 if ((fd = open (procname, O_RDWR)) < 0)
439 {
440 perror (procname);
441 fflush (stderr);
442 _exit (127);
443 }
444 premptyset (&exitset);
445 praddset (&exitset, SYS_exec);
446 praddset (&exitset, SYS_execve);
447 if (ioctl (fd, PIOCSEXIT, &exitset) < 0)
448 {
449 perror (procname);
450 fflush (stderr);
451 _exit (127);
452 }
453}
454
455
456#ifdef ATTACH_DETACH
457
458/*
459
460GLOBAL FUNCTION
461
462 attach -- attach to an already existing process
463
464SYNOPSIS
465
466 int attach (int pid)
467
468DESCRIPTION
469
470 Attach to an already existing process with the specified process
471 id. If the process is not already stopped, query whether to
472 stop it or not.
473
474NOTES
475
476 The option of stopping at attach time is specific to the /proc
477 versions of gdb. Versions using ptrace force the attachee
478 to stop.
479
480*/
481
482int
483DEFUN(attach, (pid),
484 int pid)
485{
486 if (!open_proc_file (pid))
487 {
488 perror_with_name (pi.pathname);
489 /* NOTREACHED */
490 }
491
492 /* Get current status of process and if it is not already stopped,
493 then stop it. Remember whether or not it was stopped when we first
494 examined it. */
495
496 if (ioctl (pi.fd, PIOCSTATUS, &pi.prstatus) < 0)
497 {
498 print_sys_errmsg (pi.pathname, errno);
499 close_proc_file ();
500 error ("PIOCSTATUS failed");
501 }
502 if (pi.prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
503 {
504 pi.was_stopped = 1;
505 }
506 else
507 {
508 pi.was_stopped = 0;
509 if (query ("Process is currently running, stop it? "))
510 {
511 if (ioctl (pi.fd, PIOCSTOP, &pi.prstatus) < 0)
512 {
513 print_sys_errmsg (pi.pathname, errno);
514 close_proc_file ();
515 error ("PIOCSTOP failed");
516 }
517 }
518 }
519
520 /* Remember some things about the inferior that we will, or might, change
521 so that we can restore them when we detach. */
522
523 (void) ioctl (pi.fd, PIOCGTRACE, &pi.trace);
524 (void) ioctl (pi.fd, PIOCGFAULT, &pi.fltset);
525 (void) ioctl (pi.fd, PIOCGENTRY, &pi.entryset);
526 (void) ioctl (pi.fd, PIOCGEXIT, &pi.exitset);
527
528 /* Set up trace and fault sets, as gdb expects them. */
529
530 (void) memset (&pi.prrun, 0, sizeof (pi.prrun));
531 prfillset (&pi.prrun.pr_trace);
532 prfillset (&pi.prrun.pr_fault);
533 prdelset (&pi.prrun.pr_fault, FLTPAGE);
534 if (ioctl (pi.fd, PIOCSFAULT, &pi.prrun.pr_fault))
535 {
536 print_sys_errmsg ("PIOCSFAULT failed");
537 }
538 if (ioctl (pi.fd, PIOCSTRACE, &pi.prrun.pr_trace))
539 {
540 print_sys_errmsg ("PIOCSTRACE failed");
541 }
542 attach_flag = 1;
543 return (pid);
544}
545
546/*
547
548GLOBAL FUNCTION
549
550 detach -- detach from an attached-to process
551
552SYNOPSIS
553
554 void detach (int signal)
555
556DESCRIPTION
557
558 Detach from the current attachee.
559
560 If signal is non-zero, the attachee is started running again and sent
561 the specified signal.
562
563 If signal is zero and the attachee was not already stopped when we
564 attached to it, then we make it runnable again when we detach.
565
566 Otherwise, we query whether or not to make the attachee runnable
567 again, since we may simply want to leave it in the state it was in
568 when we attached.
569
570 We report any problems, but do not consider them errors, since we
571 MUST detach even if some things don't seem to go right. This may not
572 be the ideal situation. (FIXME).
573 */
574
575void
576DEFUN(detach, (signal),
577 int signal)
578{
579 if (signal)
580 {
581 struct siginfo siginfo;
582 siginfo.si_signo = signal;
583 siginfo.si_code = 0;
584 siginfo.si_errno = 0;
585 if (ioctl (pi.fd, PIOCSSIG, &siginfo) < 0)
586 {
587 print_sys_errmsg (pi.pathname, errno);
588 printf ("PIOCSSIG failed.\n");
589 }
590 }
591 if (ioctl (pi.fd, PIOCSEXIT, &pi.exitset) < 0)
592 {
593 print_sys_errmsg (pi.pathname, errno);
594 printf ("PIOCSEXIT failed.\n");
595 }
596 if (ioctl (pi.fd, PIOCSENTRY, &pi.entryset) < 0)
597 {
598 print_sys_errmsg (pi.pathname, errno);
599 printf ("PIOCSENTRY failed.\n");
600 }
601 if (ioctl (pi.fd, PIOCSTRACE, &pi.trace) < 0)
602 {
603 print_sys_errmsg (pi.pathname, errno);
604 printf ("PIOCSTRACE failed.\n");
605 }
606 if (ioctl (pi.fd, PIOCSFAULT, &pi.fltset) < 0)
607 {
608 print_sys_errmsg (pi.pathname, errno);
609 printf ("PIOCSFAULT failed.\n");
610 }
611 if (ioctl (pi.fd, PIOCSTATUS, &pi.prstatus) < 0)
612 {
613 print_sys_errmsg (pi.pathname, errno);
614 printf ("PIOCSTATUS failed.\n");
615 }
616 else
617 {
618 if (signal || (pi.prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
619 {
620 if (signal || !pi.was_stopped ||
621 query ("Was stopped when attached, make it runnable again? "))
622 {
623 (void) memset (&pi.prrun, 0, sizeof (pi.prrun));
624 pi.prrun.pr_flags = PRCFAULT;
625 if (ioctl (pi.fd, PIOCRUN, &pi.prrun))
626 {
627 print_sys_errmsg (pi.pathname, errno);
628 printf ("PIOCRUN failed.\n");
629 }
630 }
631 }
632 }
633 close_proc_file ();
634 attach_flag = 0;
635}
636
637/*
638
639GLOBAL FUNCTION
640
641 proc_wait -- emulate wait() as much as possible
642
643SYNOPSIS
644
645 int proc_wait (int *statloc)
646
647DESCRIPTION
648
649 Try to emulate wait() as much as possible. Not sure why we can't
650 just use wait(), but it seems to have problems when applied to a
651 process being controlled with the /proc interface.
652
653NOTES
654
655 We have a race problem here with no obvious solution. We need to let
656 the inferior run until it stops on an event of interest, which means
657 that we need to use the PIOCWSTOP ioctl. However, we cannot use this
658 ioctl if the process is already stopped on something that is not an
659 event of interest, or the call will hang indefinitely. Thus we first
660 use PIOCSTATUS to see if the process is not stopped. If not, then we
661 use PIOCWSTOP. But during the window between the two, if the process
662 stops for any reason that is not an event of interest (such as a job
663 control signal) then gdb will hang. One possible workaround is to set
664 an alarm to wake up every minute of so and check to see if the process
665 is still running, and if so, then reissue the PIOCWSTOP. But this is
666 a real kludge, so has not been implemented. FIXME: investigate
667 alternatives.
668
669 FIXME: Investigate why wait() seems to have problems with programs
670 being control by /proc routines.
671
672 */
673
674int
675DEFUN(proc_wait, (statloc),
676 int *statloc)
677{
678 short what;
679 short why;
680 int statval = 0;
681 int checkerr = 0;
682 int rtnval = -1;
683
684 if (ioctl (pi.fd, PIOCSTATUS, &pi.prstatus) < 0)
685 {
686 checkerr++;
687 }
688 else if (!(pi.prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
689 {
690 if (ioctl (pi.fd, PIOCWSTOP, &pi.prstatus) < 0)
691 {
692 checkerr++;
693 }
694 }
695 if (checkerr)
696 {
697 if (errno == ENOENT)
698 {
699 rtnval = wait (&statval);
700 if (rtnval != inferior_pid)
701 {
702 error ("PIOCWSTOP, wait failed, returned %d", rtnval);
703 /* NOTREACHED */
704 }
705 }
706 else
707 {
708 print_sys_errmsg (pi.pathname, errno);
709 error ("PIOCSTATUS or PIOCWSTOP failed.");
710 /* NOTREACHED */
711 }
712 }
713 else if (pi.prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
714 {
715 rtnval = pi.prstatus.pr_pid;
716 why = pi.prstatus.pr_why;
717 what = pi.prstatus.pr_what;
718 if (why == PR_SIGNALLED)
719 {
720 statval = (what << 8) | 0177;
721 }
722 else if ((why == PR_SYSEXIT) &&
723 (what == SYS_exec || what == SYS_execve))
724 {
725 statval = (SIGTRAP << 8) | 0177;
726 }
727 else if (why == PR_REQUESTED)
728 {
729 statval = (SIGSTOP << 8) | 0177;
730 }
731 else if (why == PR_JOBCONTROL)
732 {
733 statval = (what << 8) | 0177;
734 }
735 else if (why == PR_FAULTED)
736 {
737 switch (what)
738 {
739 case FLTPRIV:
740 case FLTILL:
741 statval = (SIGILL << 8) | 0177;
742 break;
743 case FLTBPT:
744 case FLTTRACE:
745 statval = (SIGTRAP << 8) | 0177;
746 break;
747 case FLTSTACK:
748 case FLTACCESS:
749 case FLTBOUNDS:
750 statval = (SIGSEGV << 8) | 0177;
751 break;
752 case FLTIOVF:
753 case FLTIZDIV:
754 case FLTFPE:
755 statval = (SIGFPE << 8) | 0177;
756 break;
757 case FLTPAGE: /* Recoverable page fault */
758 default:
759 rtnval = -1;
760 error ("PIOCWSTOP, unknown why %d, what %d", why, what);
761 /* NOTREACHED */
762 }
763 }
764 else
765 {
766 rtnval = -1;
767 error ("PIOCWSTOP, unknown why %d, what %d", why, what);
768 /* NOTREACHED */
769 }
770 }
771 else
772 {
773 error ("PIOCWSTOP, stopped for unknown/unhandled reason, flags %#x",
774 pi.prstatus.pr_flags);
775 /* NOTREACHED */
776 }
777 if (statloc)
778 {
779 *statloc = statval;
780 }
781 return (rtnval);
782}
783
784/*
785
786GLOBAL FUNCTION
787
788 child_resume -- resume execution of the inferior process
789
790SYNOPSIS
791
792 void child_resume (int step, int signal)
793
794DESCRIPTION
795
796 Resume execution of the inferior process. If STEP is nozero, then
797 just single step it. If SIGNAL is nonzero, restart it with that
798 signal activated.
799
800NOTE
801
802 It may not be absolutely necessary to specify the PC value for
803 restarting, but to be safe we use the value that gdb considers
804 to be current. One case where this might be necessary is if the
805 user explicitly changes the PC value that gdb considers to be
806 current. FIXME: Investigate if this is necessary or not.
807 */
808
809void
810DEFUN(child_resume, (step, signal),
811 int step AND
812 int signal)
813{
814 errno = 0;
815 pi.prrun.pr_flags = PRSVADDR | PRSTRACE | PRSFAULT | PRCFAULT;
816 pi.prrun.pr_vaddr = (caddr_t) *(int *) &registers[REGISTER_BYTE (PC_REGNUM)];
817 if (signal)
818 {
819 if (signal != pi.prstatus.pr_cursig)
820 {
821 struct siginfo siginfo;
822 siginfo.si_signo = signal;
823 siginfo.si_code = 0;
824 siginfo.si_errno = 0;
825 (void) ioctl (pi.fd, PIOCSSIG, &siginfo);
826 }
827 }
828 else
829 {
830 pi.prrun.pr_flags |= PRCSIG;
831 }
832 if (step)
833 {
834 pi.prrun.pr_flags |= PRSTEP;
835 }
836 if (ioctl (pi.fd, PIOCRUN, &pi.prrun) != 0)
837 {
838 perror_with_name (pi.pathname);
839 /* NOTREACHED */
840 }
841}
842
843/*
844
845GLOBAL FUNCTION
846
847 fetch_inferior_registers -- fetch current registers from inferior
848
849SYNOPSIS
850
851 void fetch_inferior_registers (void)
852
853DESCRIPTION
854
855 Read the current values of the inferior's registers, both the
856 general register set and floating point registers (if supported)
857 and update gdb's idea of their current values.
858
859*/
860
861void
862DEFUN_VOID(fetch_inferior_registers)
863{
864 if (ioctl (pi.fd, PIOCGREG, &pi.gregset) != -1)
865 {
866 supply_gregset (&pi.gregset);
867 }
868#if defined (FP0_REGNUM)
869 if (ioctl (pi.fd, PIOCGFPREG, &pi.fpregset) != -1)
870 {
871 supply_fpregset (&pi.fpregset);
872 }
873#endif
874}
875
876#endif /* ATTACH_DETACH */
877
878/*
879
880LOCAL FUNCTION
881
882 proc_init_failed - called whenever /proc access initialization fails
883
884SYNOPSIS
885
886 static void proc_init_failed (char *why)
887
888DESCRIPTION
889
890 This function is called whenever initialization of access to a /proc
891 entry fails. It prints a suitable error message, does some cleanup,
892 and then invokes the standard error processing routine which dumps
893 us back into the command loop.
894 */
895
896static void
897DEFUN(proc_init_failed, (why),
898 char *why)
899{
900 print_sys_errmsg (pi.pathname, errno);
901 (void) kill (pi.pid, SIGKILL);
902 close_proc_file ();
903 error (why);
904 /* NOTREACHED */
905}
906
907/*
908
909LOCAL FUNCTION
910
911 close_proc_file - close any currently open /proc entry
912
913SYNOPSIS
914
915 static void close_proc_file (void)
916
917DESCRIPTION
918
919 Close any currently open /proc entry and mark the process information
920 entry as invalid. In order to ensure that we don't try to reuse any
921 stale information, the pid, fd, and pathnames are explicitly
922 invalidated, which may be overkill.
923
924 */
925
926static void
927DEFUN_VOID(close_proc_file)
928{
929 pi.pid = 0;
930 if (pi.valid)
931 {
932 (void) close (pi.fd);
933 }
934 pi.fd = -1;
935 if (pi.pathname)
936 {
937 free (pi.pathname);
938 pi.pathname = NULL;
939 }
940 pi.valid = 0;
941}
942
943/*
944
945LOCAL FUNCTION
946
947 open_proc_file - open a /proc entry for a given process id
948
949SYNOPSIS
950
951 static int open_proc_file (pid)
952
953DESCRIPTION
954
955 Given a process id, close the existing open /proc entry (if any)
956 and open one for the new process id. Once it is open, then
957 mark the local process information structure as valid, which
958 guarantees that the pid, fd, and pathname fields match an open
959 /proc entry. Returns zero if the open fails, nonzero otherwise.
960
961 Note that the pathname is left intact, even when the open fails,
962 so that callers can use it to construct meaningful error messages
963 rather than just "file open failed".
964 */
965
966static int
967DEFUN(open_proc_file, (pid),
968 int pid)
969{
970 pi.valid = 0;
971 if (pi.valid)
972 {
973 (void) close (pi.fd);
974 }
975 if (pi.pathname == NULL)
976 {
977 pi.pathname = xmalloc (32);
978 }
979 sprintf (pi.pathname, PROC_NAME_FMT, pid);
980 if ((pi.fd = open (pi.pathname, O_RDWR)) >= 0)
981 {
982 pi.valid = 1;
983 pi.pid = pid;
984 }
985 return (pi.valid);
986}
987
988#endif /* USE_PROC_FS */
This page took 0.095002 seconds and 4 git commands to generate.