| /* i386 specific core note handling. |
| Copyright (C) 2002 Red Hat, Inc. |
| Written by Ulrich Drepper <drepper@redhat.com>, 2002. |
| |
| This program is Open Source software; you can redistribute it and/or |
| modify it under the terms of the Open Software License version 1.0 as |
| published by the Open Source Initiative. |
| |
| You should have received a copy of the Open Software License along |
| with this program; if not, you may obtain a copy of the Open Software |
| License version 1.0 from http://www.opensource.org/licenses/osl.php or |
| by writing the Open Source Initiative c/o Lawrence Rosen, Esq., |
| 3001 King Ranch Road, Ukiah, CA 95482. */ |
| |
| #ifdef HAVE_CONFIG_H |
| # include <config.h> |
| #endif |
| |
| #include <elf.h> |
| #include <stddef.h> |
| #include <stdio.h> |
| #include <sys/time.h> |
| |
| #include <libebl_i386.h> |
| |
| |
| /* We cannot include <sys/procfs.h> since it is available only on x86 |
| systems. */ |
| struct elf_prstatus |
| { |
| struct |
| { |
| int si_signo; /* Signal number. */ |
| int si_code; /* Extra code. */ |
| int si_errno; /* Errno. */ |
| } pr_info; /* Info associated with signal. */ |
| short int pr_cursig; /* Current signal. */ |
| unsigned long int pr_sigpend; /* Set of pending signals. */ |
| unsigned long int pr_sighold; /* Set of held signals. */ |
| __pid_t pr_pid; |
| __pid_t pr_ppid; |
| __pid_t pr_pgrp; |
| __pid_t pr_sid; |
| struct timeval pr_utime; /* User time. */ |
| struct timeval pr_stime; /* System time. */ |
| struct timeval pr_cutime; /* Cumulative user time. */ |
| struct timeval pr_cstime; /* Cumulative system time. */ |
| unsigned long int pr_reg[17]; /* GP registers. */ |
| int pr_fpvalid; /* True if math copro being used. */ |
| }; |
| |
| |
| struct elf_prpsinfo |
| { |
| char pr_state; /* Numeric process state. */ |
| char pr_sname; /* Char for pr_state. */ |
| char pr_zomb; /* Zombie. */ |
| char pr_nice; /* Nice val. */ |
| unsigned long int pr_flag; /* Flags. */ |
| unsigned short int pr_uid; |
| unsigned short int pr_gid; |
| int pr_pid; |
| int pr_ppid; |
| int pr_pgrp; |
| int pr_sid; |
| /* Lots missing */ |
| char pr_fname[16]; /* Filename of executable. */ |
| char pr_psargs[80]; /* Initial part of arg list. */ |
| }; |
| |
| |
| bool |
| i386_core_note (name, type, descsz, desc) |
| const char *name; |
| uint32_t type; |
| uint32_t descsz; |
| const char *desc; |
| { |
| bool result = false; |
| |
| switch (type) |
| { |
| case NT_PRSTATUS: |
| if (descsz < sizeof (struct elf_prstatus)) |
| /* Not enough data. */ |
| break; |
| |
| struct elf_prstatus *stat = (struct elf_prstatus *) desc; |
| |
| printf (" SIGINFO: signo: %d, code = %d, errno = %d\n" |
| " signal: %hd, pending: %#08lx, holding: %#08lx\n" |
| " pid: %d, ppid = %d, pgrp = %d, sid = %d\n" |
| " utime: %6ld.%06lds, stime: %6ld.%06lds\n" |
| " cutime: %6ld.%06lds, cstime: %6ld.%06lds\n" |
| " eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n" |
| " esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n" |
| " eip: %08lx eflags: %08lx, original eax: %08lx\n" |
| " cs: %04lx ds: %04lx es: %04lx fs: %04lx gs: %04lx" |
| " ss: %04lx\n\n" |
| , |
| stat->pr_info. si_signo, |
| stat->pr_info. si_code, |
| stat->pr_info. si_errno, |
| stat->pr_cursig, |
| stat->pr_sigpend, stat->pr_sighold, |
| stat->pr_pid, stat->pr_ppid, stat->pr_pgrp, stat->pr_sid, |
| stat->pr_utime.tv_sec, (long int) stat->pr_utime.tv_usec, |
| stat->pr_stime.tv_sec, (long int) stat->pr_stime.tv_usec, |
| stat->pr_cutime.tv_sec, (long int) stat->pr_cutime.tv_usec, |
| stat->pr_cstime.tv_sec, (long int) stat->pr_cstime.tv_usec, |
| stat->pr_reg[6], stat->pr_reg[0], stat->pr_reg[1], |
| stat->pr_reg[2], stat->pr_reg[3], stat->pr_reg[4], |
| stat->pr_reg[5], stat->pr_reg[15], stat->pr_reg[12], |
| stat->pr_reg[14], stat->pr_reg[11], stat->pr_reg[13] & 0xffff, |
| stat->pr_reg[7] & 0xffff, stat->pr_reg[8] & 0xffff, |
| stat->pr_reg[9] & 0xffff, stat->pr_reg[10] & 0xffff, |
| stat->pr_reg[16]); |
| |
| /* We handled this entry. */ |
| result = true; |
| break; |
| |
| case NT_PRPSINFO: |
| if (descsz < sizeof (struct elf_prpsinfo)) |
| /* Not enough data. */ |
| break; |
| |
| struct elf_prpsinfo *info = (struct elf_prpsinfo *) desc; |
| |
| printf (" state: %c (%hhd), zombie: %hhd, nice: %hhd\n" |
| " flags: %08lx, uid: %hd, gid: %hd\n" |
| " pid: %d, ppid: %d, pgrp: %d, sid: %d\n" |
| " fname: %.16s\n" |
| " args: %.80s\n\n", |
| info->pr_sname, info->pr_state, info->pr_zomb, info->pr_nice, |
| info->pr_flag, info->pr_uid, info->pr_gid, |
| info->pr_pid, info->pr_ppid, info->pr_pgrp, info->pr_sid, |
| info->pr_fname, info->pr_psargs); |
| |
| /* We handled this entry. */ |
| result = true; |
| break; |
| |
| default: |
| break; |
| } |
| |
| return result; |
| } |