• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* i386 specific core note handling.
2    Copyright (C) 2002 Red Hat, Inc.
3    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
4 
5    This program is Open Source software; you can redistribute it and/or
6    modify it under the terms of the Open Software License version 1.0 as
7    published by the Open Source Initiative.
8 
9    You should have received a copy of the Open Software License along
10    with this program; if not, you may obtain a copy of the Open Software
11    License version 1.0 from http://www.opensource.org/licenses/osl.php or
12    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
13    3001 King Ranch Road, Ukiah, CA 95482.   */
14 
15 #ifdef HAVE_CONFIG_H
16 # include <config.h>
17 #endif
18 
19 #include <elf.h>
20 #include <stddef.h>
21 #include <stdio.h>
22 #include <sys/time.h>
23 
24 #include <libebl_i386.h>
25 
26 
27 /* We cannot include <sys/procfs.h> since it is available only on x86
28    systems.  */
29 struct elf_prstatus
30   {
31     struct
32     {
33       int si_signo;			/* Signal number.  */
34       int si_code;			/* Extra code.  */
35       int si_errno;			/* Errno.  */
36     } pr_info;				/* Info associated with signal.  */
37     short int pr_cursig;		/* Current signal.  */
38     unsigned long int pr_sigpend;	/* Set of pending signals.  */
39     unsigned long int pr_sighold;	/* Set of held signals.  */
40     __pid_t pr_pid;
41     __pid_t pr_ppid;
42     __pid_t pr_pgrp;
43     __pid_t pr_sid;
44     struct timeval pr_utime;		/* User time.  */
45     struct timeval pr_stime;		/* System time.  */
46     struct timeval pr_cutime;		/* Cumulative user time.  */
47     struct timeval pr_cstime;		/* Cumulative system time.  */
48     unsigned long int pr_reg[17];	/* GP registers.  */
49     int pr_fpvalid;			/* True if math copro being used.  */
50   };
51 
52 
53 struct elf_prpsinfo
54   {
55     char pr_state;			/* Numeric process state.  */
56     char pr_sname;			/* Char for pr_state.  */
57     char pr_zomb;			/* Zombie.  */
58     char pr_nice;			/* Nice val.  */
59     unsigned long int pr_flag;		/* Flags.  */
60     unsigned short int pr_uid;
61     unsigned short int pr_gid;
62     int pr_pid;
63     int pr_ppid;
64     int pr_pgrp;
65     int pr_sid;
66     /* Lots missing */
67     char pr_fname[16];			/* Filename of executable.  */
68     char pr_psargs[80];			/* Initial part of arg list.  */
69   };
70 
71 
72 bool
i386_core_note(name,type,descsz,desc)73 i386_core_note (name, type, descsz, desc)
74      const char *name;
75      uint32_t type;
76      uint32_t descsz;
77      const char *desc;
78 {
79   bool result = false;
80 
81   switch (type)
82     {
83     case NT_PRSTATUS:
84       if (descsz < sizeof (struct elf_prstatus))
85 	/* Not enough data.  */
86 	break;
87 
88       struct elf_prstatus *stat = (struct elf_prstatus *) desc;
89 
90       printf ("    SIGINFO:  signo: %d, code = %d, errno = %d\n"
91 	      "    signal: %hd, pending: %#08lx, holding: %#08lx\n"
92 	      "    pid: %d, ppid = %d, pgrp = %d, sid = %d\n"
93 	      "     utime: %6ld.%06lds,  stime: %6ld.%06lds\n"
94 	      "    cutime: %6ld.%06lds, cstime: %6ld.%06lds\n"
95 	      "    eax: %08lx  ebx: %08lx  ecx: %08lx  edx: %08lx\n"
96 	      "    esi: %08lx  edi: %08lx  ebp: %08lx  esp: %08lx\n"
97 	      "    eip: %08lx  eflags: %08lx, original eax: %08lx\n"
98 	      "    cs: %04lx  ds: %04lx  es: %04lx  fs: %04lx  gs: %04lx"
99 	      "  ss: %04lx\n\n"
100 ,
101 	      stat->pr_info. si_signo,
102 	      stat->pr_info. si_code,
103 	      stat->pr_info. si_errno,
104 	      stat->pr_cursig,
105 	      stat->pr_sigpend, stat->pr_sighold,
106 	      stat->pr_pid, stat->pr_ppid, stat->pr_pgrp, stat->pr_sid,
107 	      stat->pr_utime.tv_sec, (long int) stat->pr_utime.tv_usec,
108 	      stat->pr_stime.tv_sec, (long int) stat->pr_stime.tv_usec,
109 	      stat->pr_cutime.tv_sec, (long int) stat->pr_cutime.tv_usec,
110 	      stat->pr_cstime.tv_sec, (long int) stat->pr_cstime.tv_usec,
111 	      stat->pr_reg[6], stat->pr_reg[0], stat->pr_reg[1],
112 	      stat->pr_reg[2], stat->pr_reg[3], stat->pr_reg[4],
113 	      stat->pr_reg[5], stat->pr_reg[15], stat->pr_reg[12],
114 	      stat->pr_reg[14], stat->pr_reg[11], stat->pr_reg[13] & 0xffff,
115 	      stat->pr_reg[7] & 0xffff, stat->pr_reg[8] & 0xffff,
116 	      stat->pr_reg[9] & 0xffff, stat->pr_reg[10] & 0xffff,
117 	      stat->pr_reg[16]);
118 
119       /* We handled this entry.  */
120       result = true;
121       break;
122 
123     case NT_PRPSINFO:
124       if (descsz < sizeof (struct elf_prpsinfo))
125 	/* Not enough data.  */
126 	break;
127 
128       struct elf_prpsinfo *info = (struct elf_prpsinfo *) desc;
129 
130       printf ("    state: %c (%hhd),  zombie: %hhd,  nice: %hhd\n"
131 	      "    flags: %08lx,  uid: %hd,  gid: %hd\n"
132 	      "    pid: %d,  ppid: %d,  pgrp: %d,  sid: %d\n"
133 	      "    fname: %.16s\n"
134 	      "     args: %.80s\n\n",
135 	      info->pr_sname, info->pr_state, info->pr_zomb, info->pr_nice,
136 	      info->pr_flag, info->pr_uid, info->pr_gid,
137 	      info->pr_pid, info->pr_ppid, info->pr_pgrp, info->pr_sid,
138 	      info->pr_fname, info->pr_psargs);
139 
140       /* We handled this entry.  */
141       result = true;
142       break;
143 
144     default:
145       break;
146     }
147 
148   return result;
149 }
150