C++程序  |  150行  |  4.74 KB

/* 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;
}