| /* x86-64 specific core note handling. |
| Copyright (C) 2005 Red Hat, Inc. |
| Written by Ulrich Drepper <drepper@redhat.com>, 2005. |
| |
| 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 <inttypes.h> |
| #include <stddef.h> |
| #include <stdio.h> |
| #include <sys/time.h> |
| |
| #include <libebl_x86_64.h> |
| |
| |
| /* We cannot include <sys/procfs.h> since the definition would be for |
| the host platform and not always x86-64 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. */ |
| uint64_t pr_sigpend; /* Set of pending signals. */ |
| uint64_t pr_sighold; /* Set of held signals. */ |
| int32_t pr_pid; |
| int32_t pr_ppid; |
| int32_t pr_pgrp; |
| int32_t pr_sid; |
| struct x86_64_timeval |
| { |
| int64_t tv_sec; |
| int32_t tv_usec; |
| } pr_utime; /* User time. */ |
| struct x86_64_timeval pr_stime; /* System time. */ |
| struct x86_64_timeval pr_cutime; /* Cumulative user time. */ |
| struct x86_64_timeval pr_cstime; /* Cumulative system time. */ |
| uint64_t pr_reg[27]; /* 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. */ |
| uint64_t pr_flag; /* Flags. */ |
| uint32_t pr_uid; |
| uint32_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 |
| x86_64_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" PRIx64 ", holding: %#08" |
| PRIx64 "\n" |
| " pid: %" PRId32 ", ppid = %" PRId32 ", pgrp = %" PRId32 |
| ", sid = %" PRId32 "\n" |
| " utime: %6" PRId64 ".%06" PRId32 |
| "s, stime: %6" PRId64 ".%06" PRId32 "s\n" |
| " cutime: %6" PRId64 ".%06" PRId32 |
| "s, cstime: %6" PRId64 ".%06" PRId32 "s\n" |
| " rax: %016" PRIx64 " rbx: %016" PRIx64 "\n" |
| " rcx: %016" PRIx64 " rdx: %016" PRIx64 "\n" |
| " rsi: %016" PRIx64 " rdi: %016" PRIx64 "\n" |
| " rbp: %016" PRIx64 " rsp: %016" PRIx64 "\n" |
| " r8: %016" PRIx64 " r9: %016" PRIx64 "\n" |
| " r10: %016" PRIx64 " r11: %016" PRIx64 "\n" |
| " r12: %016" PRIx64 " r13: %016" PRIx64 "\n" |
| " r14: %016" PRIx64 " r15: %016" PRIx64 "\n" |
| " rip: %016" PRIx64 " eflags: %08" PRIx64 "\n" |
| " original rax: %016" PRIx64 "\n" |
| " cs: %04" PRIx64 " ds: %04" PRIx64 " es: %04" PRIx64 |
| " ss: %04" PRIx64 "\n" |
| " fs: %04" PRIx64 " fs_base: %016" PRIx64 |
| " gs: %04" PRIx64 " gs_base: %016" PRIx64 "\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[10], stat->pr_reg[5], stat->pr_reg[11], |
| stat->pr_reg[12], stat->pr_reg[13], stat->pr_reg[14], |
| stat->pr_reg[4], stat->pr_reg[10], stat->pr_reg[9], |
| stat->pr_reg[7], stat->pr_reg[6], stat->pr_reg[5], |
| stat->pr_reg[3], stat->pr_reg[2], stat->pr_reg[1], |
| stat->pr_reg[0], stat->pr_reg[16], stat->pr_reg[18], |
| stat->pr_reg[15], stat->pr_reg[17], stat->pr_reg[23], |
| stat->pr_reg[24], stat->pr_reg[20], |
| stat->pr_reg[25], stat->pr_reg[21], |
| stat->pr_reg[26], stat->pr_reg[22]); |
| |
| /* 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" PRIx64 " uid: %" PRIu32 " gid: %" PRIu32 "\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; |
| } |