mirror of
https://github.com/openharmony/third_party_elfutils.git
synced 2026-07-20 03:53:42 -04:00
176 lines
5.9 KiB
C
176 lines
5.9 KiB
C
/* i386 specific core note handling.
|
|
Copyright (C) 2002, 2005 Red Hat, Inc.
|
|
This file is part of Red Hat elfutils.
|
|
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
|
|
|
|
Red Hat elfutils is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by the
|
|
Free Software Foundation; version 2 of the License.
|
|
|
|
Red Hat elfutils is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with Red Hat elfutils; if not, write to the Free Software Foundation,
|
|
Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
|
|
|
|
Red Hat elfutils is an included package of the Open Invention Network.
|
|
An included package of the Open Invention Network is a package for which
|
|
Open Invention Network licensees cross-license their patents. No patent
|
|
license is granted, either expressly or impliedly, by designation as an
|
|
included package. Should you wish to participate in the Open Invention
|
|
Network licensing program, please visit www.openinventionnetwork.com
|
|
<http://www.openinventionnetwork.com>. */
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
#include <elf.h>
|
|
#include <inttypes.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <sys/time.h>
|
|
|
|
#define BACKEND i386_
|
|
#include "libebl_CPU.h"
|
|
|
|
|
|
/* We cannot include <sys/procfs.h> since the definition would be for
|
|
the host platform and not always x86 as required here. */
|
|
struct elf_prstatus
|
|
{
|
|
struct
|
|
{
|
|
int32_t si_signo; /* Signal number. */
|
|
int32_t si_code; /* Extra code. */
|
|
int32_t si_errno; /* Errno. */
|
|
} pr_info; /* Info associated with signal. */
|
|
int16_t pr_cursig; /* Current signal. */
|
|
uint32_t pr_sigpend; /* Set of pending signals. */
|
|
uint32_t pr_sighold; /* Set of held signals. */
|
|
int32_t pr_pid;
|
|
int32_t pr_ppid;
|
|
int32_t pr_pgrp;
|
|
int32_t pr_sid;
|
|
struct i386_timeval
|
|
{
|
|
int32_t tv_sec;
|
|
int32_t tv_usec;
|
|
} pr_utime; /* User time. */
|
|
struct i386_timeval pr_stime; /* System time. */
|
|
struct i386_timeval pr_cutime; /* Cumulative user time. */
|
|
struct i386_timeval pr_cstime; /* Cumulative system time. */
|
|
uint32_t pr_reg[17]; /* GP registers. */
|
|
int32_t 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. */
|
|
uint32_t pr_flag; /* Flags. */
|
|
uint16_t pr_uid;
|
|
uint16_t pr_gid;
|
|
int32_t pr_pid;
|
|
int32_t pr_ppid;
|
|
int32_t pr_pgrp;
|
|
int32_t 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 __attribute__ ((unused));
|
|
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: %" PRId32 ", code = %" PRId32
|
|
", errno = %" PRId32 "\n"
|
|
" signal: %" PRId16 ", pending: %08" PRIx32
|
|
", holding: %8" PRIx32 "\n"
|
|
" pid: %" PRId32 ", ppid = %" PRId32 ", pgrp = %" PRId32
|
|
", sid = %" PRId32 "\n"
|
|
" utime: %6" PRId32 ".%06" PRId32
|
|
"s, stime: %6" PRId32 ".%06" PRId32 "s\n"
|
|
" cutime: %6" PRId32 ".%06" PRId32
|
|
"s, cstime: %6" PRId32 ".%06" PRId32 "s\n"
|
|
" eax: %08" PRIx32 " ebx: %08" PRIx32 " ecx: %08" PRIx32
|
|
" edx: %08" PRIx32 "\n"
|
|
" esi: %08" PRIx32 " edi: %08" PRIx32 " ebp: %08" PRIx32
|
|
" esp: %08" PRIx32 "\n"
|
|
" eip: %08" PRIx32 " eflags: %08" PRIx32
|
|
" original eax: %08" PRIx32 "\n"
|
|
" cs: %04" PRIx32 " ds: %04" PRIx32 " es: %04" PRIx32
|
|
" fs: %04" PRIx32 " gs: %04" PRIx32 " ss: %04" PRIx32 "\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, stat->pr_utime.tv_usec,
|
|
stat->pr_stime.tv_sec, stat->pr_stime.tv_usec,
|
|
stat->pr_cutime.tv_sec, stat->pr_cutime.tv_usec,
|
|
stat->pr_cstime.tv_sec, 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: %08" PRIx32 ", uid: %" PRId16 ", gid: %" PRId16"\n"
|
|
" pid: %" PRId32 ", ppid: %" PRId32 ", pgrp: %" PRId32
|
|
", sid: %" PRId32 "\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;
|
|
}
|